#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