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

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

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


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


$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

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

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

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.