Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  2 618
Jeg har satt opp denne: http://dbushell.github.com/Nestable/ med en DB-struktur og noen eksempeldata:

Kode

CREATE TABLE IF NOT EXISTS `menu` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `rang` int(11) NOT NULL,
  `parent_id` int(11) NOT NULL,
  `name` varchar(256) NOT NULL,
  `description` varchar(256) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

--
-- Dataark for tabell `menu`
--

INSERT INTO `menu` (`id`, `rang`, `parent_id`, `name`, `description`) VALUES
(1, 0, 0, 'Om oss', ''),
(2, 0, 1, 'Person 1', ''),
(3, 0, 1, 'Person 2', ''),
(4, 0, 2, 'Underlenke', ''),
(5, 0, 0, 'Gallery', ''),
(6, 0, 0, 'Kontakt oss', ''),
(7, 0, 2, 'Prosjekter', ''),
(8, 0, 2, 'Kontaktopplysninger', '');
Å vise denne ut fra DB er ikke noe problem og når jeg endrer rekkefølgen får jeg ut json-string som ligner dette:

Kode

[{"id":1,"children":[{"id":2,"children":[{"id":4},{"id":7},{"id":8}]},{"id":3}]},{"id":5},{"id":6}]
Denne kan jeg behandle i PHP og kjøre json_decode, php serialize, få ut et array, osv...

Som f.eks.:

Kode

Array
(
    [0] => Array
        (
            [id] => 1
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 2
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 4
                                        )

                                    [1] => Array
                                        (
                                            [id] => 7
                                        )

                                    [2] => Array
                                        (
                                            [id] => 8
                                        )

                                )

                        )

                    [1] => Array
                        (
                            [id] => 3
                        )

                )

        )

    [1] => Array
        (
            [id] => 5
        )

    [2] => Array
        (
            [id] => 6
        )

)

Men har kjørt meg litt fast og trenger litt hjelp til å lagre endringer tilbake i databasen. Slik at rekkefølge og underlenker blir oppdatert.

Noen forslag?
Du kan legge til en "order"-kolonne i "menu"-tabellen og gjøre noe slik:

Kode

$data = json_decode( '[{"id":1,"children":[{"id":2,"children":[{"id":4},{"id":7},{"id":8}]},{"id":3}]},{"id":5},{"id":6}]' );

function insert( $rows = array() ) {
	$order = 0;
	foreach( $rows as $row ) {
		// Oppdater order-kolonnen i databasen med $order-variablen her
		$sql = "UPDATE menu SET order=$order WHERE id=$row->id"; // Eksempel

		if( isset( $row->children ) ) {
			insert( $row->children );
		}
		$order++;
	}
}

insert( $data );
Trådstarter
Fikk en tilbakemelding fra stackoverflow som virket før jeg rakk å teste løsningen din.

Kode

function parseJsonArray($jsonArray, $parentID = 0)
	{
	  $return = array();
	  foreach ($jsonArray as $subArray) {
		 $returnSubSubArray = array();
		 if (isset($subArray['children'])) {
		   $returnSubSubArray = parseJsonArray($subArray['children'], $subArray['id']);
		 }
		 $return[] = array('id' => $subArray['id'], 'parentID' => $parentID);
		 $return = array_merge($return, $returnSubSubArray);
	  }

	  return $return;
	}

	var_dump(parseJsonArray($jsonDecoded));
Denne ga et enklere array som jeg loopet gjennom for å oppdatere databasen.

Kode

foreach ($readbleArray as $key => $value) {
		if (is_array($value)) {
			$result = mysql_query("UPDATE menu SET 
									rang='". $key ."', 
									parent_id='".$value['parentID']."' 
									WHERE id='".$value['id']."'") 
			or die(mysql_error());
		}
	}