[Хак][Evo] Управление страницами не в дереве

Не так давно поднимался вопрос о управлении большим количеством страниц не используя дерево, где дали ссылку на решение yama (но код там не приводился) Захотелось реализовать у себя такое же управление страницами, то есть запретить раскрываться в дереве определенным папкам. Чтобы не создавать отдельное поле, использую поле donthit.
1. Файл manager/frames/tree.php Исправляем верхнюю часть функции treeAction

    function treeAction(id, name, treedisp_children) {
        if(ca=="move") {
            try {
                parent.main.setMoveValue(id, name);
            } catch(oException) {
                alert('<?php echo $_lang['unable_set_parent']; ?>');
            }
        }
        if(ca=="open" || ca=="") {
            if(id==0) {
                parent.main.location.href="index.php?a=2";
            } else {
                if(treedisp_children==0) {
                    parent.main.location.href="index.php?a=3&id=" + id + getFolderState();
                } else {
                    parent.main.location.href="index.php?a=<?php echo (!empty($modx->config['tree_page_click']) ? $modx->config['tree_page_click'] : '27'); ?>&id=" + id; // edit as default action
                }
            }
        }

2. Файл manager/frames/nodes.php
Добавяем donthit в строку 118 и $donthit в строку 134, где идёт перечисление полей.
Перед if (!$isfolder) { добавляем

            if ($donthit) {
                $icon = ($privateweb||$privatemgr) ? $_style["tree_folder_secure"] : $_style["tree_folder"];
                $output .= '<div id="node'.$id.'" p="'.$parent.'" style="white-space: nowrap;">'.$spacer.$pad.'<img id="p'.$id.'" align="absmiddle" title="'.$_lang['click_to_context'].'" style="cursor: pointer" src="'.$icon.'" onclick="showPopup('.$id.',\''.addslashes($pagetitle).'\',event);return false;" oncontextmenu="this.onclick(event);return false;" onmouseover="setCNS(this, 1)" onmouseout="setCNS(this, 0)" onmousedown="itemToChange='.$id.'; selectedObjectName=\''.addslashes($pagetitle).'\'; selectedObjectDeleted='.$deleted.'; selectedObjectUrl=\''.$url.'\'" /> ';
                $output .= '<span p="'.$parent.'" onclick="treeAction('.$id.', \''.addslashes($pagetitle).'\',0); setSelected(this);" onmouseover="setHoverClass(this, 1);" onmouseout="setHoverClass(this, 0);" class="treeNode" onmousedown="itemToChange='.$id.'; selectedObjectName=\''.addslashes($pagetitle).'\'; selectedObjectDeleted='.$deleted.'; selectedObjectUrl=\''.$url.'\';" oncontextmenu="document.getElementById(\'p'.$id.'\').onclick(event);return false;" title="'.addslashes($alt).'">'.$pagetitleDisplay.$weblinkDisplay.'</span> '.$pageIdDisplay.'</div>';
                continue;
            }

3. Настраиваем mm_rules.inc.php в ManagerManager:
mm_renameField('log', 'Дочерние ресурсы отображаются в дереве');
mm_changeFieldHelp('log', 'Это поле используется для папок с большим числом вложенных страниц'); Если MM не используется, можно исправить в языковом файле.

4. Файл manager/action/document_data.static.php
После docSettings.addTabPage( document.getElementById( «tabChildren» ) ); добавляем docSettings.setSelectedIndex(1); чтобы всегда открывался список дочерних страниц.
Перед строчкой // Get access permissions добавляем код:

$parent = $id ? ($modx->db->getValue("SELECT parent FROM " . $tbl_site_content . " WHERE id=$id LIMIT 1")) : 0;
$donthit = $parent ? ($modx->db->getValue("SELECT donthit FROM " . $tbl_site_content . " WHERE id=$parent LIMIT 1")) : 0;
if ($donthit) {$id=$_REQUEST['id']=$parent;}

Чтобы при закрытии или сохранении вложенных страниц перебрасывало на общий список.

Теперь достаточно снять галочку с «Дочерние ресурсы отображаются в дереве» и они не будут выводится даже при полном раскрытии дерева. Иконки останутся в виде папок.

UPD: Немного доработал список страниц:

Прикрепляю все файлы.

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

avatar
Ну это еще не законченное решение конечно, хотя базис неплохой.

К этому нужно еще основательно переделать страницу «Просмотр дочерних ресурсов» — чтобы была навигация по вложенным папкам, чтобы была отдельная кнопка «опубликовать» и т.д.
Также нужно продумать наследование свойства отображения в дереве, чтобы не надо было при создании нового ресурса каждый раз кликать «Скрыть дочерние ресурсы из дерева».
avatar
Всмысле каждый раз кликать? Галочку только у родительской папки нужно снять, не у дочерних.
avatar
я имел в виду то, чтобы в каталоге допустим у всех создаваемых категорий автоматически ставилась галка «donthit», наверное это можно через managermanager реализовать.
avatar
Вы молодец! Надо проверить, а с виду все окей!
avatar
Temius, можно вас попросить выложить все исправленные файлы?
avatar
добавил
avatar
Спасибо, очень полезная штука.
avatar
Отловил маленкую багу в паджинации — при переходе на другую страницу не сохранялся порядок сортировки. Поправил строку 202 в document_data_static на $childsTable->createPagingNavigation($numRecords,'a=3&id='.$content['id'].'&dir='.$dir.'&sort='.$sort); Теперь работает
avatar
спасибо, заменил файл
avatar
применил патч на паре проектов, вроде все работает, как надо, спасибо :)
разве что, я увеличил количество отображаемых ресурсов в списке с 20 до 50, если надо, напишу, как это сделать.
avatar
напиши, будь добр =)
avatar
Такое ощущение что народ стремится добавить в MODx что-то от джумлы.
Зачем?
Табличный вид удобен, когда сотни доков, нужно их отсортировать для поиска необходимого. А в остальном…
avatar
Это и делается в данном случае с целью работы с большим количеством документов.
avatar
Версия 1.04, не могу найти «Дочерние ресурсы отображаются в дереве». У меня есть «Контейнер (содержит дочерние ресурсы)». Убираю галку, нажимаю сохранить, появляется табличный просмотр. Перехожу в др ресурс, возвращаюсь — все по старому, галка на месте и выпадающий список тоже. WTF?
avatar
«Дочерние ресурсы отображаются в дереве» это бывший «Регистрировать посещения», переименованный ManagerManager (3й пункт)
avatar
Спасибо, все работает!
avatar
Спасибо за хак! Однако не могу понять почему в 1.0.5. при создании нового документа перебрасывает на главную страницу, а не на список? :( При редактировании старого туда куда нужно — в список…
  • z211
  • 0
avatar
При создании нового документа в MODx всегда перебрасывает на главную, как и при удалении. Чтобы перебрасывало на список, нужно в файле save_content.processor.php
поменять в строке 406
$header = "Location: index.php?r=1&id=$id&a=7&dv=1";
на
$header = "Location: index.php?r=1&id=$key&a=7&dv=1";

В файлах delete_content.processor.php и undelete_content.processor.php поменять
$header="Location: index.php?r=1&a=7";
на
$header="Location: index.php?r=1&a=7&id=$id&dv=1";
avatar
Спасибо! Отлично работает.
avatar
А как увеличивать кол-во страниц в списке? Например до 100?
И поставить по умолчанию фильтрацию по «Заголовку ресурса»?
avatar
1. В конфигурации на вкладке «Интерфейс и представление» поставить «Количество результатов» равным 100
2. Найти в моём document_data.static.php
$sort = isset($_REQUEST['sort']) ? $_REQUEST['sort'] : 'createdon' ;
и createdon заменить на pagetitle
avatar
Спасибо. Очень помогло!
avatar
А как сделать возможность удалять несколько пунктов одновременно?
  • igor
  • 0
avatar
использовать модуль Doc Manager
avatar
Подскажите, а если нужно переместить пунктов 20 одновременно? Можно?
avatar
Doc Manager поможет переместить/удалить/изменить даты/изменить шаблоны и т.д. хоть для 2000 документов одновременно
avatar

К сожалению там нет, функции перемещение… :(
Может вы знаете какой то другой Doc Manager? Поделитесь?
avatar
а ну да, точно… ступил…
но мне встречался плагин по переносу документов, только ща не вспомню где… вспомню, скину ссыль
avatar
avatar
Спасибо большое!
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.