CakePHP 4树行为手动设置左端右端(JQuery排序)
我已经使用nestedSortable jQuery插件()对类别进行了拖放排序。每次订购一个类别时,一个Ajax请求都会发送给控制器,其中包含一个包含类别完整数据的数组帖子。一切都如预期的那样工作,因此,我们的工作是正常的 Ajax post在控制器中接收到的数组:CakePHP 4树行为手动设置左端右端(JQuery排序),cakephp,cakephp-4.x,Cakephp,Cakephp 4.x,我已经使用nestedSortable jQuery插件()对类别进行了拖放排序。每次订购一个类别时,一个Ajax请求都会发送给控制器,其中包含一个包含类别完整数据的数组帖子。一切都如预期的那样工作,因此,我们的工作是正常的 Ajax post在控制器中接收到的数组: Array ( [0] => Array ( [item_id] => [parent_id] => [dept
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,那么save函数将执行一些检查,并将lft和rght重置为其他值?不管怎样,跳过这个?我想这就是你收到的完整的树?我认为您在保存时必须卸载树行为,因为您基本上已经在前端完成了它的工作。ps,使用CakePHP时,不要直接使用超全局变量,如
$\u POST
,而是在请求对象上使用抽象接口!如果您想阻止TreeBehavior对您的数据执行操作:但行为的要点是管理这些值以创建您请求的树结构。如果手动设置的lft/rt值与树设置的不匹配,则树的设计原则和设计假设之间似乎存在脱节。你确定你了解这种行为的结构吗?如果您为了维护设置而禁用它一次,您可能永远无法再次使用它进行保存。问题是,我希望能够在父节点之间移动节点,并且一次可以上下移动一个以上的节点。是的,我认为有必要这样做。但我仍然需要问,你确定你了解你正在制作的结构和行为模式吗?如果进行编辑、卸载行为、保存数据,然后重新加载行为并获取treeList()
,结果是否符合预期?如果是这样,您可以继续为您的流程关闭/打开它。或者为行为编写一个扩展,以支持您需要的新功能。最后一次确认您的编辑是否符合树的内部期望将对您编辑的数据运行recover
。如果它仍然保留您期望的树结构,那么您的更改是有效的。