JSON niveau aanspreken

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Chris van Kesteren

Chris van Kesteren

12/08/2015 16:15:23
Quote Anchor link
Goedemiddag,

Ik heb een klein scriptje gemaakt waarin je pins kan plaatsen, in deze pins kan je weer tekst toevoegen.
Al deze informatie wordt opgeslagen in een JSON bestand. Deze pins kan je ook weer bewerken dus het onthoud wat voor tekst je geplaatst hebt.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php $items = $param['args']['items']; ?>

    <p>
    <input type="button" id="landmark" class="button" value="<?php _e('Add New', 'map'); ?>">
    </p>

    
        <ul id="item-list" class="sortable-list">

            <li class="list-item new-item">
                <div class="list-item-handle">
                    <span class="menu-item-title"><?php _e('New item', 'map'); ?></span>
                    <a href="#" class="menu-item-toggle"></a>
                </div>
                <div class="list-item-settings">
                <label><?php _e('Name', 'map'); ?><br><input type="text" class="input-text title-input" value="New item"></label>
    
                    <div>
                        <a href="#" class="item-delete"><?php _e('Delete'); ?></a>
                        <span class="meta-sep"> | </span>
                        <a href="#" class="item-cancel"><?php _e('Cancel'); ?></a>
                    </div>
                </div>
            </li>
    
        <?php foreach ($items as &$item) : ?>
            
            <li class="list-item">
                <div class="list-item-handle">
                    <span class="menu-item-title"><?php echo $item['title']; ?></span>
                    <a href="#" class="menu-item-toggle"></a>
                </div>
                <div class="list-item-settings">
    
                    <label><?php _e('Tile', 'map'); ?><br><input type="text" class="input-text title-input" value="<?php echo $item['title']; ?>"></label>
                    <div>
                        <a href="#" class="item-delete"><?php _e('Delete'); ?></a>
                        <span class="meta-sep"> | </span>
                        <a href="#" class="item-cancel"><?php _e('Cancel'); ?></a>
                    </div>
                </div>
            </li>
        <?php endforeach; ?>
        </ul>
        <input type="button" id="new-item" class="button" value="<?php _e('New item', 'map'); ?>">    
        <input type="button" id="delete-landmark" class="button" value="<?php _e('Delete', 'map'); ?>">
    <input type="button" id="save-landmark" class="button button-primary right" value="<?php _e('Save', 'map'); ?>">
    </div>
    <?php
    unset($item);
}

?>


Hier wat javascript wat er bij hoort:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// nieuwe item rij
$('#new-item').click(function() {
    $('#item-list .new-item').clone().removeClass('new-item').appendTo('#item-list');
});

// landmark save
$('#save-landmark').click(function() {
        var data = null,
            selected = $('.selected-pin');
        
        if (selected.length) {
            data = $('.selected-pin').data('landmarkData');
        }
        else {
            data = {};
            data['items'] = getItems();
            $(this).val('Save');

        }

        data['items'] = getItems();
    });

var getItems = function() {
        var items = [];
        $('#item-list .list-item:not(.new-item)').each(function() {
            var item = {};
            
            item ['title']  = $('.title-input', this).val();
            

            items.push(item);
        });

        return items;
    }


Om verhaal kort te houden. als 'items' in het eerste JSON niveau ligt kan ik deze aanspreken($items = $param['args']['items'];) en is het allemaal geen probleem maar als 'items' dieper ligt lukt dit niet meer..

Iemand een idee hoe ik in de zelfde lijn als $items = $param['args']['items']; kan schrijven?
 
PHP hulp

PHP hulp

14/11/2024 18:58:50
 
Chris van Kesteren

Chris van Kesteren

14/08/2015 10:47:00
Quote Anchor link
aanvullende informatie:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
<?php
     * Constructor. The child class should call this constructor from its own constructor
     *
     * @
param array $args An associative array with information about the current table
     * @access protected
     */
    function __construct( $args = array() ) {
        $args = wp_parse_args( $args, array(
            'plural' => '',
            'singular' => '',
            'ajax' => false,
            'screen' => null,
        ) );


        $this->screen = convert_to_screen( $args['screen'] );

        add_filter( "manage_{$this->screen->id}_columns", array( $this, 'get_columns' ), 0 );

        if ( !$args['plural'] )
            $args['plural'] = $this->screen->base;

        $args['plural'] = sanitize_key( $args['plural'] );
        $args['singular'] = sanitize_key( $args['singular'] );

        $this->_args = $args;

        if ( $args['ajax'] ) {
            // wp_enqueue_script( 'list-table' );
            add_action( 'admin_footer', array( $this, '_js_vars' ) );
        }
    }
?>
Gewijzigd op 14/08/2015 10:47:21 door Chris van Kesteren
 
Thomas van den Heuvel

Thomas van den Heuvel

14/08/2015 11:19:02
Quote Anchor link
Ik snap niet helemaal waar het probleem nu ligt (PHP of JavaScript)?

Mogelijk biedt het volgende wat inspiratie:
- definieer het gedrag van de pins in een... euh... javascript klasse:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
function MyPinThingy() {
    this.init = function(options) {
        // initialisatie hier
    }
}

- geef $items (vanuit PHP) mee als initialisatie-parameter, en houd de items bij in een object van deze klasse (sla dus lokaal in een object van de klasse de "toestand" op van je functionaliteit):
declaratie (vervolg)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
function MyPinThingy() {
    this.items = false; // item data - meegegeven bij creatie of dynamisch toegevoegd

    this.init = function(options) {
        this.items = options.items;
        // rest van init ...
        // en hier wellicht een eenmalige "draw" methode voor het tonen van de initiele items

    }


aanroep:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<script type="text/javascript">
//<![CDATA[
$().ready(function() {
    var pins = new MyPinThingy();
    pins.init({'items': <?php json_encode($param['args']['items']) ?>});
});
//]]>
</script>


- verzorg het weergeven / toevoegen van van blokken via aparte functies (methoden) binnen de klasse

Ik weet niet of het bovenstaande echt gaat werken maar je zou er eens mee kunnen experimenteren. Het bovenliggende idee is dus dat je een soort van kapstok bouwt waarin je het "gedrag" van een stuk functionaliteit centraal vastlegt en waar je allerlei functionaliteit aan op kunt hangen. Voordelen van deze methoden zijn onder andere: elementen gaan eenheden met voorgedefinieerd gedrag vormen, geen vervuiling van globale scope.

EDIT: hierbij houd je wat je wilt weergeven (this.items, je "rauwe" pindata) en hoe je het wil weergeven gescheiden.
Gewijzigd op 14/08/2015 11:27:33 door Thomas van den Heuvel
 
Chris van Kesteren

Chris van Kesteren

18/08/2015 16:45:47
Quote Anchor link
Goedemiddag,

Ik heb nog wat meer inspiratie nodig ;)
Voor elke persoon wil ik via javascript vanuit JSON een list-item toevoegen met 2 text velden.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<script>
$.each(value.persons, function(index, value) {
                        
    var entry = document.createElement('li');
    entry.className = "list-item";
    entry.innerHTML = '<div class="list-item-handle">\
                <span class="menu-item-title"></span>\
                <a href="#" class="menu-item-toggle"></a>\
               </div>\
               <div class="list-item-settings">\
                <label>ID (unique)<br><input type="text" class="input-text id-input" value=""></label>\
                <label>Name<br><input type="text" class="input-text title-input" value=""></label>\
               <div>\
                <a href="#" class="item-delete">Delete</a>\
                <span class="meta-sep"> | </span>\
                <a href="#" class="item-cancel">Cancel</a>\
               </div>\
            </div>';

            list.appendChild(entry);

    $('#person-list .list-item .title-input').val(value.title);

});
</script


Voor elke persoon wordt netjes een item aangemaakt. Alleen hoe kan ik nu voor elke persoon de .title-input een unieke naam geven?
In het script hierboven krijgen alle items de zelfde naam wat logisch is, maar geen idee hoe ik dit anders moet aanpakken..
Iemand een idee ?

mvg,
Chris
 
Thomas van den Heuvel

Thomas van den Heuvel

18/08/2015 16:57:22
Quote Anchor link
Ken de value direct aan de entry toe (voordat je deze append, dus ergens in die lap HTML), in plaats van een reeks van klassen die voor alle entries hetzelfde is, in dat laatste geval zul je alles uiteraard overschrijven...
 
Chris van Kesteren

Chris van Kesteren

18/08/2015 20:59:28
Quote Anchor link
Wat mij bekend is wordt de script tag niet echt herkend in innerhtml

Toevoeging op 19/08/2015 08:52:52:

Wat aan het testen en dit lijk te werken :D
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<script>
var list = document.getElementById('person-list');
                
    var answers = 0;
                
    if (undefined !== value.persons) {
        $.each(value.persons, function(index, value) {
            console.log(""+value.title);
                        
            var entry = document.createElement('li');
            entry.className = "list-item";
            entry.innerHTML += '<div class="list-item-handle">\
                          <span class="menu-item-title">' + answers + '</span>\
                          <a href="#" class="menu-item-toggle"></a>\
                        </div>\
                        <div class="list-item-settings">\
                          <label>ID (unique)<br><input type="text" class="input-text id-input" value=""></label>\
                          <label>Name<br><input type="text" class="input-text title-input" value=""></label>\
                         <div>\
                        <a href="#" class="item-delete">Delete</a>\
                        <span class="meta-sep"> | </span>\
                        <a href="#" class="item-cancel">Cancel</a>\
                         </div>\
                        </div>';
            answers++;
            list.appendChild(entry);
        });
    }
</script>
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.