Скрываем дочерние документы в дереве ресурсов. Плагин TreeAction.

Знакомая многим настройка для скрытия дочерних ресурсов в дереве у определённых документов пропала после выхода одного из обновлений системы. А похоже, что этот функционал востребован. И дело даже не в скорости работы админки, а просто в удобстве отображения большого списка документов.

Как раз дошли руки до этой задачи, и получился плагин использующий стандартные (хоть скрытые и неиспользуемые) функции системы.


По факту, плагин просто скрывает у нужных папок иконку разворачивания дерева и меняет событие при клике, открывая стандартную страницу просмотра документа. А там уже вкладка с дочерними документами.


//<?php
/**
 *
 * TreeAction
 *
 * Change default action for click on resource in tree
 *
 * @category plugin
 * @version 0.1
 * @internal @properties &nodes=Resources ID;text;
 * @internal @events OnManagerTreeRender,OnDocDataRender
 * @internal @modx_category Manager and Admin
 * @author Akool
 */

$output = '';
switch ($modx->event->name)
{
    case 'OnDocDataRender':
    if (in_array($id, explode(',',$nodes))){
      $output = "
      <script>
        docSettings.setSelectedIndex(1);
      </script>";
    }
    break;
    case 'OnManagerTreeRender':
    $output = "
    <script>
    var nodes = [".$nodes."];
    var len   = nodes.length;
    window.addCallListener = function(func, callback){
    // see: http://habrahabr.ru/post/135001/
      var callNumber = 0;
      return function(){
        var args = [].slice.call(arguments);
        var result;
        try {
          result = func.apply(this, arguments);
          callNumber++;
          } catch (e) {
            callback(e, args, this, callNumber);
            throw e;
          }
        callback(result, args, this, callNumber);
        return result;
      }
    };
    function changeNode(id) {
      var node = document.getElementById('node'+id);
      var img = document.getElementById('s'+id);
      var span = node.querySelector('span.treeNode');
      var action = span.getAttribute('onclick');
      if(img){ img.style.visibility = 'hidden'; }
      span.setAttribute('onclick', action.replace(/(treeAction\([^\(\)]*)(\);)/, '$1,0);'));
    };
    rpcLoadData = addCallListener(rpcLoadData , function(result, args, self, callNumber){
      for (var i=0; i<len; i++){
        changeNode(nodes[i]);
      }
    });
    </script>";
    break;
}
if($output != '') $modx->event->output($output);


Код также хранится на github

А теперь нюансы.

В коде можно заметить событие OnDocDataRender, которого по факту нет сейчас в системе. Хотя, надеюсь, со временем оно всё-таки появится. Мне оно понадобилось чтобы сразу сделать активной нужную вкладку. Но если кто-то включает в настройках запоминание вкладок, то, наверное, после первого раза она будет отображаться активной и без дополнительных манипуляций. Ещё это событие открывает возможности для добавления своего кода, например, уже имеющиеся разработки типа CustomTables или что-то подобное. Если кому-то это не надо, то плагин будет работать и так, а ненужный кусок кода можно просто выкинуть.
А если надо, то процесс добавления события описан в репозитории плагина.

Для версий до 1.2.1 актуально следующее:
Но и это не всё. Опять же, с какой-то из новых версий Evo начал в дереве моргать глаз, показывающий текущий редактируемый документ. С ним тоже могут возникнуть проблемы при включённом плагине. Это потому, что тот, кто добавлял «глазной» функционал немного не учёл возможное использование дерева. Для корректной работы надо в файле manager/frames/tree.php переместить вызов функции на четыре строки выше.
^ Исправлено с версии Evolution 1.2.1

В общем, без вмешательства в ядро пока не обошлось. Но эти вмешательства лишь добавляют удобства, а основная задача решается. Хотя… задачей ведь и было удобство.

5 комментариев

avatar
Неплохо бы добавить параметры по умолчанию
{
  "nodes": [
    {
      "label": "Resources ID",
      "type": "text",
      "value": "",
      "default": "",
      "desc": ""
    }
  ]
}


и сразу веселей использование пойдет :)
Комментарий отредактирован 2017-04-19 19:52:07 пользователем webber
avatar
* @internal @properties &nodes=Resources ID;text;

А эта строчка при установке не срабатывает? Или куда-то ещё добавить?
avatar
Этой строчки нет в приведенном коде, а многие, я думаю, ссылку на гит и не заметили, скопировали код прямо из топика и не поняли, как его запустить :) Т.е. не помешал бы прямо в данном коде в данной теме этот «довесок» ))
avatar
Спасибо вам за замечание. Дополнил тут код.
avatar
Хорошо, что webber про ваш плагин напомнил, скоро придет время сайты обновлять, где без него никак. Вам спасибо за решение.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.