AJAX: object naar array

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Sam Clauw

Sam Clauw

21/03/2015 14:16:57
Quote Anchor link
Hallo topic lezers!

Ik zoek naar een oplossing om de jQuery nestedSortable plugin werkend te krijgen. 't Is te zeggen: alles gaat goed, behalve het doorsturen van de object gegevens die de plugin ter beschikking stelt.

Wanneer ik de console check na elke boomstructuur aanpassing, dan krijg ik een overzicht van objecten te zien:

[Object, Object, Object, Object, Object, Object]
0: Objectdepth: 0item_id: nullleft: "1"parent_id: "none"right: 12__proto__: Object
1: Objectdepth: 1item_id: "1"left: 2parent_id: nullright: 3__proto__: Object
2: Objectdepth: 1item_id: "2"left: 4parent_id: nullright: 7__proto__: Object
3: Objectdepth: 2item_id: "3"left: 5parent_id: "2"right: 6__proto__: Object
4: Objectdepth: 1item_id: "4"left: 8parent_id: nullright: 9__proto__: Object
5: Objectdepth: 1item_id: "5"left: 10parent_id: nullright: 11__proto__: Object
length: 6__proto__: Array[0]

Wanneer ik deze gegevens via AJAX probeer door te sturen naar een php file, dan krijg ik telkens "undefined":

Form Data:
undefined=&undefined=&undefined=&undefined=&undefined=&undefined=

Hier vind je alvast een jsFilldle dat m'n situatie beter uit de doeken doet.

Iemand die me kan helpen hiermee? Ik denk (hoop) dat dit met een kleine code aanpassing kan worden opgelost?
 
PHP hulp

PHP hulp

24/12/2024 14:14:11
 
Thomas van den Heuvel

Thomas van den Heuvel

21/03/2015 17:09:08
Quote Anchor link
Als je POST, zou je dan niet serialize() moeten gebruiken in plaats van toArray()?
 
Sam Clauw

Sam Clauw

21/03/2015 20:53:35
Quote Anchor link
Kan je dan nooit toArray gebruiken als je iets doorstuurt via POST? Serialize geeft een erg simpele string terug met enkel de id's en parent id's van de nodes :(
 
Thomas van den Heuvel

Thomas van den Heuvel

21/03/2015 20:54:27
Quote Anchor link
Je kunt arrays prima serialiseren ;-).
 
Sam Clauw

Sam Clauw

22/03/2015 11:08:04
Quote Anchor link
OK, je info helpt me al aardig op weg, 'k snap in ieder geval het gebruik van serialize() en unserialize() en da's al een grote stap vooruit ;)
Het vreemde is echter dat de serialize niet lijkt te werken. Wanneer ik in de php file een urserialize doe, dan krijg ik namelijk de volgende foutmelding:

Quote:
Warning (2): unserialize() expects parameter 1 to be string, array given [APP\Plugin\CoasterCms\Controller\CmsPagesController.php, line 107]

De code lijkt me nochtans niet verkeerd te zijn:

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>
$(function() {
    var ns = $('.sortable').nestedSortable({
        'listType': 'ul',
        'handle': 'div',
        'items': 'li',
        'toleranceElement': '> div',
        'isTree': true,
        'opacity': 0.5,
        'cursor': 'move',
        'revert': 100,
        'stop': function(){
            var tree = $(this).nestedSortable('serialize');
            
            // POST naar server ($.post of $.ajax)

            $.ajax({
                url: '<?php echo $this->here; ?>',
                data: tree,
                type: 'POST'
            });
        }
    });
});
</script>


Enig idee waarom de serialize het bij mij niet doet?
Gewijzigd op 22/03/2015 11:08:34 door Sam Clauw
 
Thomas van den Heuvel

Thomas van den Heuvel

22/03/2015 14:38:52
Quote Anchor link
Het werkt mogelijk al goed zonder unserialize() aan de PHP-kant. Heb je geprobeerd je $_POST data eens ongewijzigd te dumpen? PHP regelt veel automatisch (URL decoding, het (terug)zetten in een array). Mogelijk hoef je niets aan te passen in je $_POST en is alles direct bruikbaar?

Als dat niet werkt moet je je informatie mogelijk toch anders "verpakken" aan de verzend-kant.
 
Sam Clauw

Sam Clauw

22/03/2015 15:07:56
Quote Anchor link
Dit is de array die ik momenteel in de php file binnen krijg:

Quote:
array(
(int) 2 => 'null',
(int) 3 => '2',
(int) 16 => '3',
(int) 17 => '16',
(int) 4 => 'null',
(int) 5 => '4',
(int) 6 => '4',
(int) 7 => '4',
(int) 8 => '4',
(int) 9 => '4',
(int) 13 => '9',
(int) 10 => 'null',
(int) 11 => '10',
(int) 12 => 'null',
(int) 14 => '12',
(int) 15 => '12'
)


Zoals je kan zien gaat het hier om een array met erg beperkte node info. Dus "serialize" is dan toch een no-go in mijn geval?
Gewijzigd op 22/03/2015 15:08:10 door Sam Clauw
 
Thomas van den Heuvel

Thomas van den Heuvel

22/03/2015 15:35:54
Quote Anchor link
Dat had je toch al geconstateerd? :)

Wat ik met mijn "Je kunt arrays prima serialiseren ;-)." reactie bedoelde is:
je gebruikt de toArray() methode van je nestedSortable tree, en vervolgende POST je die data door deze te serializen via de jQuery-functie .serialize().
 
Sam Clauw

Sam Clauw

27/03/2015 22:11:54
Quote Anchor link
Als ik wat info over jquery serialize op zoek, dan lees ik telkens dat dit in combinatie is met een formulier (input, textarea, select) moet gebeuren.

https://api.jquery.com/serialize/ & http://www.w3schools.com/jquery/ajax_serialize.asp

Da's bij mij dus niet echt het geval. Kan je überhaupt wel een dergelijke objecten array omzetten naar iets wat via AJAX leesbaar wordt?:

Quote:
[Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object]
0: Object
depth: 0
item_id: null
left: 1
parent_id: null
right: 34
__proto__: Object
1: Object
2: Object
3: Object
4: Object
5: Object
6: Object
7: Object
8: Object
9: Object
10: Object
11: Object
12: Object
13: Object
14: Object
15: Object
16: Object
length: 17
__proto__: Array[0]
Gewijzigd op 27/03/2015 22:12:17 door Sam Clauw
 
Thomas van den Heuvel

Thomas van den Heuvel

27/03/2015 22:38:27
Quote Anchor link
BLEH

Gebruik JSON.stringify() aan de verzendkant en json_decode($_POST['whatever'], true) aan de ontvangstkant, dat werkt.

index.htm
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
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
<script type="text/javascript" src="https://code.jquery.com/jquery-1.11.2.min.js"></script>
</head>

<body>
<div id="dump"></div>
<script type="text/javascript">
//<![CDATA[
$().ready(function() {
    var arr = {
        'one': {
            'subone': {'test': 'a', 'set': [1,2,3,4]}
        },
        'two': {
            'subtwo': {'lala': 'hoi', 'set': [1,2,5,3]}
        }
    };
    $.post('test.php', {'whatever': JSON.stringify(arr)}, function() {
        alert('cake');
    })
});
//]]>
</script>
</body>
</html>


test.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
header('Content-Type: text/html; charset=UTF-8');
echo '<pre>'.print_r(json_decode($_POST['whatever'], true), true).'</pre>';
?>
Gewijzigd op 27/03/2015 23:14:38 door Thomas van den Heuvel
 
Sam Clauw

Sam Clauw

28/03/2015 12:24:57
Quote Anchor link
Fan-tas-tisch, dit is echt wat ik nodig had! 'k Heb hier echt wel veel mee bijgeleerd, dus m'n dank is groot!
't Was nog even zoeken om de JSON data in CakePHP om te zetten, maar da's uiteindelijk ook gelukt. Dikke merci voor de opvolging Thomas!
 



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.