Closed gglp closed 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',
],
]
]) ?>
В 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, например:а в
run()
добавил проверку наличия значений и, если есть, добавляют стандартную функцию из примера разработчика.Если такой вариант приемлем, я покопаю помаленьку в сторону pull-реквеста, если нет желания загромождать виджет, я пропишу в представлении подключение отдельного скрипта и уже в нём буду прописывать функции редактирования.
Либо второй вариант - добавить ещё один параметр - скрипт. Собирать его в представлении, а в
run()
просто добавить ещё одну переменную так, чтобы регистрация скрипта выглядела так: