Я Менеджер Дерева Картика . Это хорошо работает. Как известно, будет N
количество родителей N
количество child
. Когда создается родительский элемент, он присваивает значение root, которое составляет id
его основного корня / родителя. То же самое должно быть выполнено с дочерним элементом, например, взгляните на мою структуру с помощью fiddle
In the fiddle все значение root равно 1
для всех nodes
. Я хочу его разветвить.
Я хочу добавить новый столбец с именем parent_id
. Цель добавления - вставить родительский идентификатор непосредственного родителя, под которым создаются дочерние узлы. Например, в моем случае под Floor-1
есть 4
дочерних узлов. Я хочу поставить их parent_id
как 2
, потому что идентификатор Floor-1
равен 2
. Таким образом, я могу отслеживать / получать количество дочерних узлов для каждого родительского узла (ов).
Контроллер узла
Ниже приведен метод действия сохранения
public function actionSave()
{
/**
* @var Module $module
* @var Tree $node
* @var Tree $parent
* @var \yii\web\Session $session
*/
$post = Yii::$app->request->post();
static::checkValidRequest(false, !isset($post['treeNodeModify']));
$data = static::getPostData();
$parentKey = ArrayHelper::getValue($data, 'parentKey', null);
$treeNodeModify = ArrayHelper::getValue($data, 'treeNodeModify', null);
$currUrl = ArrayHelper::getValue($data, 'currUrl', '');
$treeClass = TreeSecurity::getModelClass($data);
$module = TreeView::module();
$keyAttr = $module->dataStructure['keyAttribute'];
$nodeTitles = TreeSecurity::getNodeTitles($data);
if ($treeNodeModify) {
$node = new $treeClass;
$successMsg = Yii::t('kvtree', 'The {node} was successfully created.', $nodeTitles);
$errorMsg = Yii::t('kvtree', 'Error while creating the {node}. Please try again later.', $nodeTitles);
} else {
$tag = explode("\\", $treeClass);
$tag = array_pop($tag);
$id = $post[$tag][$keyAttr];
$node = $treeClass::findOne($id);
$successMsg = Yii::t('kvtree', 'Saved the {node} details successfully.', $nodeTitles);
$errorMsg = Yii::t('kvtree', 'Error while saving the {node}. Please try again later.', $nodeTitles);
}
$node->activeOrig = $node->active;
$isNewRecord = $node->isNewRecord;
$node->load($post);
$errors = $success = false;
if (Yii::$app->has('session')) {
$session = Yii::$app->session;
}
if ($treeNodeModify) {
if ($parentKey == TreeView::ROOT_KEY) {
$node->makeRoot();
} else {
$parent = $treeClass::findOne($parentKey);
if ($parent->isChildAllowed()) {
$node->appendTo($parent);
} else {
$errorMsg = Yii::t('kvtree', 'You cannot add children under this {node}.', $nodeTitles);
if (Yii::$app->has('session')) {
$session->setFlash('error', $errorMsg);
} else {
throw new ErrorException("Error saving {node}!\n{$errorMsg}", $nodeTitles);
}
return $this->redirect($currUrl);
}
}
}
if ($node->save()) {
// check if active status was changed
if (!$isNewRecord && $node->activeOrig != $node->active) {
if ($node->active) {
$success = $node->activateNode(false);
$errors = $node->nodeActivationErrors;
} else {
$success = $node->removeNode(true, false); // only deactivate the node(s)
$errors = $node->nodeRemovalErrors;
}
} else {
$success = true;
}
if (!empty($errors)) {
$success = false;
$errorMsg = "<ul style='padding:0'>\n";
foreach ($errors as $err) {
$errorMsg .= "<li>" . Yii::t('kvtree', "{node} # {id} - '{name}': {error}",
$err + $nodeTitles) . "</li>\n";
}
$errorMsg .= "</ul>";
}
} else {
$errorMsg = '<ul style="margin:0"><li>' . implode('</li><li>', $node->getFirstErrors()) . '</li></ul>';
}
if (Yii::$app->has('session')) {
$session->set(ArrayHelper::getValue($post, 'nodeSelected', 'kvNodeId'), $node->{$keyAttr});
if ($success) {
$session->setFlash('success', $successMsg);
} else {
$session->setFlash('error', $errorMsg);
}
} elseif (!$success) {
throw new ErrorException("Error saving {node}!\n{$errorMsg}", $nodeTitles);
}
return $this->redirect($currUrl);
}
Вы можете увидеть другие методы здесь
Для модели дерева см. здесь
Как я могу этого добиться? Любая помощь будет принята с благодарностью.