yii-dream-team / yii2-jstree

Yii2 jsTree component
http://yiidreamteam.com/yii2/jstree
30 stars 7 forks source link

Отработать операции редактирования дерева (check_callback) #3

Closed gglp closed 9 years ago

gglp commented 9 years ago

В jstree возможны пять стандартных операций, на которые завязан функционал плагинов contextmenu и dnd (упоминаются здесь: https://www.jstree.com/api/#/?f=%24.jstree.defaults.core.check_callback):

В дистрибутиве есть пример работы с этими функциями: https://github.com/vakata/jstree/blob/master/demo/sitebrowser/index.php начиная со 125 строки и далее.

Можно было бы, добавить их в метод run() класса JsTree с массивом значений для вызова функций (я пока в целях тестирования сделал массив jsFunctions, в которых прописываю вызов соответствующего action, например:

'jsFunctions' => [
            'rename_node' => Url::to(['tag/rename']),
            'delete_node' => Url::to(['tag/delete'])
        ]

а в run() добавил проверку наличия значений и, если есть, добавляют стандартную функцию из примера разработчика.

Если такой вариант приемлем, я покопаю помаленьку в сторону pull-реквеста, если нет желания загромождать виджет, я пропишу в представлении подключение отдельного скрипта и уже в нём буду прописывать функции редактирования.

Либо второй вариант - добавить ещё один параметр - скрипт. Собирать его в представлении, а в run() просто добавить ещё одну переменную так, чтобы регистрация скрипта выглядела так:

$this->getView()->registerJs("$('#{$id}').jstree({$jsOptions}){$jsScript};");
gglp commented 9 years ago

Хотя, чем больше я дописываю решение, тем больше понимаю, что отработку функций лучше не включать в виджет.

Они нужны только для редактирования дерева (а виджет же может быть и только для отображения - в виде меню и т.п.).

Видимо будет достаточно просто примера использования.

gglp commented 9 years ago

Всё получилось сделать без изменения виджета.

Когда причешу код, выложу его в качестве примера использования.

metalagman commented 9 years ago

Пример можно пуллреквестом в ридмик :-)

metalagman commented 9 years ago

Для контекстного меню я просто заранее объявлял генератор меню и потом присовывал через JsExpression:

    var getMenu = function (node) {
        console.log(node);
        var items = {
            deleteRole: {
                label: "Удалить роль",
                action: function(obj) {
                    if (confirm('Удалить роль "'+node.li_attr.name+'"?'))
                        window.location.href = '<?= Url::to(['role/delete']) ?>' + '?name=' + node.li_attr.name
                },
                icon: "fa fa-trash"
            },
        }
        return items;
    }
    <?= \yiidreamteam\jstree\JsTree::widget([
        'containerOptions' => [
            'class' => 'data-tree',
        ],
        'jsOptions' => [
            'core' => [
                'multiple' => false,
                'data' => [
                    'url' => \yii\helpers\Url::to(['full-tree']),
                ],
            ],
            'types' => [
                'role' => [
                    'icon' => 'fa fa-user',
                ],
                'permission' => [
                    'icon' => 'fa fa-cog',
                ]
            ],
            'contextmenu' => [
                'items' => new JsExpression('getMenu'),
            ],
            'plugins' => [
                'types',
                'contextmenu',
            ],
        ]
    ]) ?>