function showTopMenu()
{
foreach ($list_menu) {echo $list_menu} (ну вы поняли)
}
хикать или не хукать
в продолжение соседней include().
Сейчас у меня есть несколько модулей подключаемых include()
в основном коде масив меню $list_menu
В основном коде есть функция
Код:
в каждом модуле к этому масиву добавляется свой пункт
$list_menu[] = "Новый пункт";
в модуле я не только добавлюб новый элемент к массиву $list_menu, но еще делаю хук на функцию showTopMenu().
1. С одной стороны сама функция showTopMenu() не обязательна, и хук на нее темболее, т.к. массив сформирован, можно просто вывести все элементы.
2. С другой стороны, хуком я могу не только добавить какието пункты, но и полностью заменить массив, выведя совсем другое меню.
Вопрос:
стоит ли вообще использовать хуки или существует более рационально решение?
P.S. Пример выше - это пример, функции могут быть намного сложнее с большим количеством данных, и модуль должен иметь возможность как добавлять данные, так и заменять их полностью.
Решение чего? Я так и не увидел проблемы, например.
Я хотел услышать мнение специалистов, какие подводные камни есть в хуках, и что может быть лучше?
Была бы моя воля, я бы сделал что-то простое наподобие:
1) Все модули лежат в папке modules по папкам, где папка идентфицирует модуль
2) В папке модуля есть какой-то файл, допустим info, в котором в опред.формате хранятся метаданные о модуле.
3) Набор интерфейсов для модулей.
4) Определяется специальный набор методов модуля, например getMenuItems(), который возвращает массив добавляемых элементов меню (аналог вашего $menu_items).
5) Есть главный класс, допустим ModuleWorker, который подгружает все активные модули и вызывает для каждого getMenuItems() - тем самым вы получаете набор всех элементов меню. Можно добавить кэширование, дабы уменьшить нагрузки.
6) Для обращения к всему списку элементов в меню можно у ModuleWorker сделать спец.метод, типа get/setMenuItems и т.д.
Вообщем, получаете что-то наподобие Друпала, только на классах. Можно и на функциях реализовать, но меня такой подход не впечатляет.
Впринципе, даже для подмены данных, я могу в модуле взять тот же $list_menu
и вместо $list_menu[]="new" сделать $list_menu = Array('new1', 'new2') и т.п. полностью заменив меню.
Но может всплыть проблема, когда модуль подключится раньше другого модуля, который перебьет данные...
если есть модуль 1
module_1
Код:
$list_menu[]="new";
и
module_2
Код:
$list_menu = Array('new1', 'new2');
в зависимости от порядка подключения мы получим
1. Array('new1', 'new2');
2. Array('new1', 'new2', 'new');
Сядтье и на бумажке спланируйте свою "модульность", потому что сейчас это тихий ужас, если модули срабатывают раньше главного кода.
ну да, с основным кодом погорячился, смотрим только на модули. Нужно тогда какойто ключ делать, в каком порядке их подключать. Или по имени папки или по внутреннему ключу, чтобы они правильно друг за другом шли. и если мы хотим подменить данные, то подключать его последним, если добавить, то первым...
В вашем же случае вам прийдется извращаться как раз указанными вами способами, других путей не вижу. Так что колдуйте любыми предложенными способами.