2013-12-01 3 views
0

У меня есть список вложенных элементов (категорий), которые я хотел бы реорганизовать, путем упорядочения и глубины вложенности. Я попытаюсь объяснить:Как изменить порядок вложенных элементов в PHP?

enter image description here

Когда я отправить форму с JQuery, нажав на синюю кнопку SAVE, он обрабатывает функцию внутри models/categories_model.php:

public function organize($items){ 
    if(count($items)){ 
     foreach($items as $order => $item){ 
      if($item['item_id'] != ''){ 
       echo '<pre>'.$order.'</pre>'; 
       $data = array(
        'pid'  => (int) $item['parent_id'], 
        'ordering' => $order 
       ); 
       $this->db 
        ->set($data) 
        ->where($this->_primary_key, $item['item_id']) 
        ->update($this->_table_name); 
      } 
     } 
    } 
} 

Это экономит этот список, как это:

1 
    2 
    3 
4 
    5 
    6 
7 
8 
    9 
    10 

Вместо того, чтобы сохранять его следующим образом:

1 
    1 
    2 
    3 
    4 
2 
    1 
    2 
3 
    1 
    2 
     1 
     2 
     3 
    3 

Вместо того, чтобы $order значение один за другим, он должен принять в счет его вложенных элементов и начать отсчет $order с 1, а не продолжая подсчетом от его родительский элемент.

Так что, когда я сохранить его, я хочу, чтобы они были заказаны, как это, но не знаю, как это сделать:

enter image description here

Кто-то знает, как заставить его работать с вложенными вещи, PLS?

ответ

1

Если метод recieves элементы в правильном порядке, это должно работать:

public function organize($items) 
{ 
    if (!empty($items)) { 
     $orderByPid = array(); 
     foreach ($items as $item) { 
      if($item['item_id'] != '') { 
       if (!isset($orderByPid[$item['parent_id']])) { 
        $orderByPid[$item['parent_id']] = 0; 
       } 
       $data = array(
        'pid'  => (int) $item['parent_id'], 
        'ordering' => ++$orderByPid[$item['parent_id']] 
       ); 
       $this->db 
        ->set($data) 
        ->where($this->_primary_key, $item['item_id']) 
        ->update($this->_table_name); 
      } 
     } 
    } 
} 
+0

проверит, что теперь, благодаря – aspirinemaga

+0

@aspirinemaga Я обновил свой код - изменили неправильные ключи ($ пункт [ «PID»], чтобы $ пункт [ 'parent_id']). –

+0

Да! Это работает Дмитрий, спасибо тебе! Я постараюсь лучше понять, что вы там сделали. Кстати, вы закрыли 'if (! Isset ($ orderByPid [$ item ['parent_id']]) {' – aspirinemaga

Смежные вопросы