Мой сайт

Воскресенье, 05.05.2024, 08:12

Приветствую Вас Гость | RSS | Главная | | Регистрация | Вход

Главная » 2014 » Март » 26 » [Перенос] PlusCatalog - микро-каталог "на коленке" [Evo]
15:15
 

[Перенос] PlusCatalog - микро-каталог "на коленке" [Evo]

[Перенос] 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
Пароль demodemo

UPD 11.11.11 обнаружил, что кому-то не утерпелось поиграться с админкой. Доступ закрыл, если будет кому-то нужен, пишите в комментариях.

Старался обойтись без индусского кода, но получилось только на 50%. Поэтому выкладываю доступ к админке с данной версией для общего пользования AS IS, ну а у заказчика уже буду чистить. Тем не менее, ругательные комментарии по делу — приветствуются.

Как обычно, комментарии со словами «а в Рево» отклика в моем сердце не найдут. Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
Просмотров: 277 | Добавил: housecove | Рейтинг: 0.0/0
Всего комментариев: 0

Меню сайта

Наш опрос

Оцените мой сайт
Всего ответов: 0

Статистика


Онлайн всего: 1
Гостей: 1
Пользователей: 0

Форма входа

Поиск

Календарь

«  Март 2014  »
ПнВтСрЧтПтСбВс
     12
3456789
10111213141516
17181920212223
24252627282930
31