Я использовал плагин nestedSortable jQuery (https://github.com/ilikenwf/nestedSortable), чтобы упорядочивать свои категории с помощью перетаскивания. Каждый раз, когда заказывается категория, в контроллер отправляется запрос Ajax с сообщением массива с полными данными категорий. Все работает так, как ожидалось;
Массив, полученный в контроллере Ajax post:
Array
(
[0] => Array
(
[item_id] =>
[parent_id] =>
[depth] => 0
[left] => 1
[right] => 8
)
[1] => Array
(
[id] => 1
[parent_id] =>
[depth] => 0
[left] => 2
[right] => 3
)
[2] => Array
(
[id] => 4
[parent_id] =>
[depth] => 0
[left] => 4
[right] => 5
)
[3] => Array
(
[id] => 2
[parent_id] =>
[depth] => 0
[left] => 6
[right] => 7
)
)
В моем контроллере у меня есть следующая функция для обработки:
public function reorder() {
$list = isset($_POST['_list']) ? json_decode($_POST['_list'], true) : null;
foreach ($list as $item) {
if (!empty($item['id'])) {
$category = $this->Categories->get($item['id']);
if (!empty($category)) {
empty($item['parent_id']) ? $category->parent_id = null : $category->parent_id = $item['parent_id'] ;
$category->lft = $item['left'];
$category->rght = $item['right'];
$this->Categories->save($category);
}
}
}
}
Когда я отлаживаю категории перед сохранением lft и rght, они установлены правильно, однако после сохранения lft и rght содержатся совершенно разные значения.
Я предполагаю, что, поскольку TreeBehavior реализован, функция сохранения выполняет некоторые проверки и сброс левого и правого на другие значения? В любом случае, чтобы пропустить это?