/** * @param \Mageplaza\Blog\Model\Category $category * @param \Mageplaza\Blog\Model\Category $newParent * @param null $afterCategoryId * @return $this */ public function changeParent(\Mageplaza\Blog\Model\Category $category, \Mageplaza\Blog\Model\Category $newParent, $afterCategoryId = null) { $childrenCount = $this->getChildrenCount($category->getId()) + 1; $table = $this->getMainTable(); $adapter = $this->getConnection(); $levelFiled = $adapter->quoteIdentifier('level'); $pathField = $adapter->quoteIdentifier('path'); /** * Decrease children count for all old Category parent Categories */ $adapter->update($table, ['children_count' => new \Zend_Db_Expr('children_count - ' . $childrenCount)], ['category_id IN(?)' => $category->getParentIds()]); /** * Increase children count for new Category parents */ $adapter->update($table, ['children_count' => new \Zend_Db_Expr('children_count + ' . $childrenCount)], ['category_id IN(?)' => $newParent->getPathIds()]); $position = $this->processPositions($category, $newParent, $afterCategoryId); $newPath = sprintf('%s/%s', $newParent->getPath(), $category->getId()); $newLevel = $newParent->getLevel() + 1; $levelDisposition = $newLevel - $category->getLevel(); /** * Update children nodes path */ $adapter->update($table, ['path' => new \Zend_Db_Expr('REPLACE(' . $pathField . ',' . $adapter->quote($category->getPath() . '/') . ', ' . $adapter->quote($newPath . '/') . ')'), 'level' => new \Zend_Db_Expr($levelFiled . ' + ' . $levelDisposition)], [$pathField . ' LIKE ?' => $category->getPath() . '/%']); /** * Update moved Category data */ $data = ['path' => $newPath, 'level' => $newLevel, 'position' => $position, 'parent_id' => $newParent->getId()]; $adapter->update($table, $data, ['category_id = ?' => $category->getId()]); // Update Category object to new data $category->addData($data); $category->unsetData('path_ids'); return $this; }