Пользовательский порядок поведения CakePHP-дерева

#cakephp #tree #behavior

#cakephp #дерево #поведение

Вопрос:

У меня есть модель Post, которая имеет поведение дерева. В представлении для каждой записи есть поле ввода текста заказа. После отправки этих полей я получаю id => значение заказа. Итак, теперь я должен перемещать или перемещать каждую запись в зависимости от ее значения порядка, чтобы изменить порядок дерева.

Пример (заголовки являются примерами только для того, чтобы следовать порядку сортировки):

Перед:

Post1 - порядок: 20
_Post1.2 - порядок: 20
_Post1.1 - порядок: 10
__Post1.1.1 - порядок: 10
__Post1.1.3 - порядок:30
__Post1.1.2 - порядок: 20
_Post1.3 - порядок:30
Post2 - порядок: 10

После:

Post2 - порядок: 10
Post1 - порядок: 20
_Post1.1 - порядок: 10
__Post1.1.1 - порядок: 10
__Post1.1.2 - порядок: 20
__Post1.1.3 - порядок:30
_Post1.2 - порядок: 20
_Post1.3 - порядок:30

Ответ №1:

Вы можете использовать эту reorder функцию. Проверьте здесь — http://book.cakephp.org/view/1355/reorder

Комментарии:

1. reorder основан на поле в базе данных. Мне нужно изменить порядок на основе других пользовательских значений.

2. хм, понял тебя. звучит сложно. Если мне придет в голову какая-нибудь идея, я постараюсь поделиться ею 🙂

3. Чтобы иметь возможность использовать reorder, я добавил новый sort столбец в базу данных для хранения заказа. Итак, теперь у меня есть функция

4. забавно! Я думал, вы хотите сортировать по-разному для каждого пользователя. Кстати, я столкнулся с той же проблемой, и мне пришлось самому переписать функцию изменения порядка. Обычно они выполняют отдельный запрос для каждого элемента. Вы можете сделать все это с помощью одного вложенного запроса, который будет намного быстрее, чем у них.

5. можете ли вы показать какой-нибудь пример или простой код для этого Я проверил функцию изменения порядка, и все, что она делает, — это сортировка и перемещение записей для каждого сообщения

Ответ №2:

Чтобы иметь возможность использовать reorder, я добавил новый sort столбец в базу данных для хранения заказа. Итак, теперь у меня есть функция

 function _sortPosts($newSort){
foreach ($newSort AS $id => $value) {
if(is_numeric($value['sort'])){$this->Post->updateAll(array('Post.sort' => $value['sort']),array('Post.id' => $id));
} else {
$this->Session->setFlash(__('Non-numeric value given.', true),'default', array('class' => 'error'));
$this->redirect($this->referer());
}

}
foreach(array_keys($this->data['Post']) as $parent){
$this->Post->reorder(array('id' => $parent, 'field' => 'Post.sort', 'order' => 'ASC', 'verify' => true));
}
}
 

Но он выполняется очень медленно, если в нем более 20-30 дочерних элементов.
Здесь я вставил пример запросов, сгенерированных при изменении порядка одного родителя и 2 дочерних элементов: http://pastebin.com/e076Czg5