Сохранить позиции массива - PullRequest
       3

Сохранить позиции массива

0 голосов
/ 25 сентября 2011

У меня есть дерево, где пользователь может перетаскивать элементы и менять их позиции. После каждого изменения я отправляю этот сериализованный массив и хочу сохранить его.

Пример дерева:

Economics
Blogging
General Dev
Japan
Productivity

    Humanities
        Education
        Science
            Haskell
                Earth
            PHP

Я посылаю сериализованное дерево через ajax, поэтому у меня есть массив linke this.

'0' => "1"
'1' => "2"
'2' => "3"
'3' => "4"
'4' ...
    '0' => "5"
    '1' ...
        '0' ...
            '0' => "6"
            '1' ...
                '0' => "7"
                '1' ...
                    '0' => "8"
                    '1' ...
                        '0' ...
                            '0' => "9"
                            '1' ...
                                '0' => "10"
                        '1' ...
                            '0' => "11"

Значением массива является идентификатор строки таблицы.

как вставить этот массив в базу данных с правильной позицией?

Ответы [ 2 ]

1 голос
/ 25 сентября 2011

Я бы предложил использовать традиционный подход к хранению деревьев:

create table catalogue (
    id int not null auto_increment primary key,
    name varchar(255),
    catalogue_id int,
    ord int
);

Итак, сначала вам нужно правильно заполнить БД, затем с остальными нужно легко обращаться.

фактический код.

Клиентская сторона:

   <ul id="enclosure_0" class="sortable">
        <li id="item_1">Level0 - Item 1</li>
        <li id="item_2">Level0 - Item 2</li>
        <li id="item_3">Level0 - Item 3</li>
        <li id="item_4">Level0 - Item 4</li>
        <li id="item_5">Level0 - Item 5
            <ul id="enclosure_5" class="sortable">
                <li id="item_6">Level1 - Item 1</li>
                <li id="item_7">Level1 - Item 2</li>
                <li id="item_8">Level1 - Item 3</li>
                <li id="item_9">Level1 - Item 4</li>
            </ul>
        </li>
   </ul>        
   <script>     
       $(document).ready(function(){
           $(".sortable").sortable({
               stop: function(ev, ui){
                   var list = $(this).sortable("toArray");
                   $.get("sort.php", {items: list, parent_id: $(this).attr('id')}, function(data){window.alert("stored");}); 
                }
            });
        });
    </script>

Сторона сервера (sort.php):

<?php

/* you have new order in $_GET["items"], you have parent id in $_GET["parent_id"] */

/* easiest way:
 * */

preg_match("/enclosure_([0-9])+/", $_GET["parent_id"], $tmp);
$parent_id = (int) $tmp[1];
$counter = 0;
foreach ($_GET["items"] as $item){
    $counter++;
    preg_match("/item_([0-9]+)/", $item, $tmp);
    $item_id = (int) $tmp[1];
    $db->query("update catalogue set ord = $counter where id = $item_id");
    /* alternatively, somewhat safer */
    $db->query("update catalogue set ord = $counter where id = $item_id and catalogue_id = $parent_id");
} 

Примечания и предположения:

1) catalogue_id должен быть 0 для категорий верхнего уровня
2) Я считаю, что вы достаточно умны, чтобы динамически визуализировать клиентскую часть. 3) Предполагается, что заказ основан на 1. 4) php не проверен, но должен быть в порядке

0 голосов
/ 25 сентября 2011

Я бы не пытался держать строки в таблице БД в правильном порядке, я бы добавил столбец «позиция» в таблицу. Я предполагаю, что у вас уже есть «родительский» столбец для сохранения иерархии.

Когда пользователь переставляет элемент, просто обновите столбцы позиции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...