[Перенос] PlusCatalog - микро-каталог "на коленке" [Evo]
1.
Постановка задачи. Для одного из сайтов понадобилось создавать ресурсы из 2-3 строк текста + фото. Количество таких ресурсов может в перспективе стать запредельным. Использовать для хранения этих данных таблицу в БД modx я посчитал слишком расточительным, да и дерево документов — не резиновое.
Единственно возможным вариантом является хранить эти записи в отдельной таблице в БД. Структуру таблицы можно задать именно такую, которая нужна. Для записи данных в таблицу, а также для их правки/удаления, можно использовать модуль.
Однако, сам по себе сайт для редактора получился достаточно простым и логичным. Я ощутил, что не имею морального права заставлять пользователя часть материалов добавлять через модуль, а часть — через документы modx. Следовательно, нужен интерфейс для работы с внешней таблицей, причем этот интерфейс должен разместиться прямо в дереве документов.
Для удобства редактора я убрал все лишнее в форме добавления документа. Способ — стандартный
manager manager. Однако, есть одна тонкость. Вначале я создал страницу, которая будет корневой для каталога. Потом организовал для этой страницы правильный вывод информации. И только потом убрал все поля, кроме необходимых.
Оставлены были longtitle (переименован в Фамилия, Имя(инициалы)), content (переименован в Описание) и 2 TV: один для фотографии, второй — для вывода таблицы записей каталога.
5.
Настройка работы. Этот пункт вызвал больше всего вопросов. В итоге, я остановился на плагине для целого ряда событий. Для предотвращения создания копии документа и удаления каталога (страницы, конечно только страницы) плагин получил следующие строки:
if ($e->name == 'OnBeforeDocDuplicate') { if ($_REQUEST['id'] == $catalogPageId) {//только для страницы с каталогом die ("Для данного документа создание копии запрещено!"); } }
if ($e->name == 'OnBeforeDocFormDelete') { if ($_REQUEST['id'] == $catalogPageId) {//только для страницы с каталогом die ("Для данного документа удаление запрещено!"); } }
Чтобы редактор не мог создавать дочерние документы для документа-каталога бьем его по рукам в самом начале:
if ($e->name == 'OnManagerPageInit') { if ($_REQUEST['pid'] == $catalogPageId && $_REQUEST['a'] == 4) {//только для страницы с каталогом $_SESSION['cat_error'] = "Для раздела \"Лица\" создание вложенных документов не требуется. Для добавления новой персоны воспользуйтесь формой ниже."; $modx->sendRedirect('SITE_NAME/manager/index.php?a=27&id=5'); } }
$_SESSION['cat_error'] — это мой способ обратной связи с редактором. Сообщения выводятся на событии
OnDocFormPrerender //выводим сообщения об ошибках if (isset($_SESSION['cat_error']) && trim($_SESSION['cat_error']) != '') { echo '
',$_SESSION['cat_error']; $_SESSION['cat_error'] = ''; }
Вобщем-то остальной код плагина приводить нет смысла, он работает с таблицей в БД обычными способами. Сам плагин я прикладываю к статье.
Теперь остается только организовать вывод таблицы с данными каталога. В modx есть инструмент для создания таблиц по данным БД, но я не стал тратить время на его изучение, а просто набросал свой код. Приводить его здесь тоже нет смысла — он банален. Для вывода таблицы был создан TV с типом CustomInput, строкой возможных значений
@EVAL return $modx->runSnippet('catalogTable');
сниппет catalogTable — это как раз сниппет вывода таблицы с
jquery плагином
dataTable.
Наполнение и редактирование данных в каталоге — готовы. Осталось только прикрутить эти данные к остальному сайту.
6.
Внешний интерфейс. Создан TV с типом Multi-Select Listbox, в поле возможных значений
@EVAL return $modx->runSnippet('catalogList');
сниппет catalogList — тупой вывод данных каталога в виде ключ==имя||
В поле Визуальный компонент — ставим Delimited List, разделитель ",".
Осталось только написать аналог Дитто для нашего каталога. Мне не требовались особые возможности, поэтому сниппет вывода данных тоже примитивен. Получили список id через запятую и вывели данные в строку.
7.
Код. Где код? Собирать в архив сниппеты, плагины и TV я не стал. Тем более, это всего лишь proof of concept. Вместо этого я сделал демо сайт, который, я надеюсь, не будет быстро и сильно покорежен любопытными.
alooze.16mb.com/manager/ — хостинг любезно подсказал
valikras. Доступ в админку —
Логин
demoПароль
demodemoUPD 11.11.11 обнаружил, что кому-то не утерпелось поиграться с админкой. Доступ закрыл, если будет кому-то нужен, пишите в комментариях.
Старался обойтись без индусского кода, но получилось только на 50%. Поэтому выкладываю доступ к админке с данной версией для общего пользования
AS IS, ну а у заказчика уже буду чистить. Тем не менее, ругательные комментарии по делу — приветствуются.
Как обычно, комментарии со словами «а в Рево» отклика в моем сердце не найдут.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.