Добавление настраиваемого столбца в менеджер дерева карт - PullRequest
0 голосов
/ 06 августа 2020

Я Менеджер Дерева Картика . Это хорошо работает. Как известно, будет N количество родителей N количество child. Когда создается родительский элемент, он присваивает значение root, которое составляет id его основного корня / родителя. То же самое должно быть выполнено с дочерним элементом, например, взгляните на мою структуру с помощью fiddle

enter image description here

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);
}

Вы можете увидеть другие методы здесь

Для модели дерева см. здесь

Как я могу этого добиться? Любая помощь будет принята с благодарностью.

...