Создание пунктов меню администратора динамически в Joomla - PullRequest
2 голосов
/ 20 января 2011

Еще один день игры с Joomla, и еще один недостаток, который нужно исправить:)

На этот раз это происходит в форме меню администрирования (бэкэнда).Чтобы добавить элементы / подпункты в это меню, люди должны написать элементы меню в xml-файле, сопровождающем их компоненты / extension / plugin / что угодно.Когда расширение установлено, joomla «генерирует» пункты меню и «сохраняет» их в БД.По сути, реальное / осязаемое меню отображается при чтении БД.

Это имеет несколько последствий:

  • Меню не поддерживает сценарии
  • Меню не является динамическим;изменение XML-файла после установки , не обновляет меню
  • Удаление элементов не поддерживается сценариями;Joomla заботится об удалении любых элементов при удалении расширения.

У меня есть эта система, которая полагается на возможность изменять пункты меню на лету, но с помощью кода.Проще говоря, мне нужна функциональность, позволяющая создавать изменчивый элемент меню (т. Е. Он удаляется в конце сеанса).

Для этого у меня есть пара возможных хаков:

  1. Переопределите экземпляр глобальной базы данных joomla, чтобы я мог заставить его возвращать поддельные пункты меню.Это возможно, поскольку объект базы данных хранится в открытом свойстве класса JFactory: JFactory::$database=new MyFakeJDatabase(JFactory::$database);
  2. Перехватывает код меню (html) перед выводом и портит его в соответствии с моими потребностями.Это не подходит для шаблонов, так как конечным результатом будет внедрение html, что может не совпадать с тем, для чего предназначен шаблон.
  3. Создание пунктов меню с помощью javascript.Из-за этого возникают проблемы с шаблоном И javascript, который переключает подменю.
  4. Создавайте пункты меню в БД всякий раз, когда они мне нужны, и каким-то образом «помечайте» свои элементы, чтобы я удалил их в следующий раз (или в конце сеанса),Похоже, это будет работать как шарм.Так как я могу буферизовать пункты меню, я мог бы создать свои пункты меню в одной инструкции SQL.Чем я мог бы использовать другой SQL для удаления тегов пунктов меню.2 SQL-выражения могут не сильно загружать сервер.

Что вы думаете?

Редактировать: Я проверил joomla/administrator/modules/mod_menu/helper.php вПосмотрим, смогу ли я найти способ внедрить свои вещи, желая, чтобы, возможно, joomla использовал глобальную переменную или что-то еще, но безрезультатно - пункты меню создаются непосредственно, читая БД и отрисовывая также.К вашему сведению, я некоторое время искал в Google, но безрезультатно.

Ответы [ 3 ]

2 голосов
/ 21 апреля 2012

Интересно.Я работал с Joomla в течение многих лет, писал все виды расширений для различных целей, включая интеграцию внешних систем.Мой опыт - подходить к таким ситуациям, рассматривая основные потребности выполнения кода.И я всегда начинаю с вопроса: управляется ли он пользовательским интерфейсом или системой?

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

Однако для любого содержимого динамического интерфейса вам понадобится модуль.Модули все о отображении контента.Эти ребята предназначены для удобства пользователей.Итак, рассмотрим, как будет управляться доступ к контенту пользовательского интерфейса.Какие пользователи будут составлять «аудиторию» этого контента?Это контролируется группами пользователей и уровнями доступа.В какой-то момент в вашем коде, предпочтительно на ранней стадии, вам придется проверить права пользователя и затем изменить исполнение кода в ответ.К счастью, я обнаружил, что кто-то уже проделал большую работу за меня.Как?

Найдите расширение, которое выполняет то, что должен делать ваш код, или настолько близко, насколько это возможно.Вся CMS построена с расширениями, работающими на Joomla!Framework и есть тысячи расширений, доступных для скачивания.Как только вы нашли это, клонируйте вещь.Затем отредактируйте его так, чтобы он делал то, что вам нужно, плюс то, что он делал раньше (если это требование).Установите обновленный клон, отмените публикацию оригинала и опубликуйте свой.Экономит много времени.

Учитывая ваши требования, код выполняется только до тех пор, пока есть сеанс.Я бы начал с плагина типа пользователя.Когда пользователь запускает событие входа в систему, плагин может добавлять записи динамического меню в переменную сеанса в виде массива записей базы данных.Когда пользователь запускает выход из системы или время ожидания сеанса, записи исчезают сами собой.Тогда я просто клонировал бы "mod_menu" и прочитал все записи, которые он находит в сеансе пользователя.Я все время использую эту технику переменных сеанса, особенно при реализации аналитических методов сбора данных.

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

Удачи!

chozyn

1 голос
/ 18 сентября 2011

«Правильный» способ - написать модуль, который переопределяет модуль основного меню для достижения старой функциональности с добавленной функцией динамического меню из любого источника, который у вас есть. Не особенно хороший путь, но это путь Joomla. Спасибо @ircmaxell за указание на этот метод.

0 голосов
/ 21 января 2011

Никакой взлом не кажется утомительным, безопасным или достаточно ремонтопригодным для достижения этой цели.

Я прервал проект и вместо этого помещаю кнопки в главную панель управления через JS.

Конечным пользователям крайне неудобно (они все еще пропускают подпункты). Но какого черта ... это вина Джумлы.

Да, для записи мне нужно было добавить свои собственные "страницы", похожие на компоненты администратора. Угадай, что? Это тоже не удалось, так что это еще один взлом.

Надеюсь, что в версии 1.7 они [joomla] полностью уничтожат исходную кодовую базу.

...