Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

хикать или не хукать

396
01 ноября 2010 года
SibBear
223 / / 27.07.2006
... вот в чем вопрос.
в продолжение соседней include().

Сейчас у меня есть несколько модулей подключаемых include()
в основном коде масив меню $list_menu

В основном коде есть функция
 
Код:
function showTopMenu()
  {
    foreach ($list_menu) {echo $list_menu} (ну вы поняли)
  }



в каждом модуле к этому масиву добавляется свой пункт
$list_menu[] = "Новый пункт";


в модуле я не только добавлюб новый элемент к массиву $list_menu, но еще делаю хук на функцию showTopMenu().

1. С одной стороны сама функция showTopMenu() не обязательна, и хук на нее темболее, т.к. массив сформирован, можно просто вывести все элементы.
2. С другой стороны, хуком я могу не только добавить какието пункты, но и полностью заменить массив, выведя совсем другое меню.

Вопрос:

стоит ли вообще использовать хуки или существует более рационально решение?

P.S. Пример выше - это пример, функции могут быть намного сложнее с большим количеством данных, и модуль должен иметь возможность как добавлять данные, так и заменять их полностью.
6
01 ноября 2010 года
George
4.1K / / 05.01.2007
Решение чего? Я так и не увидел проблемы, например.
396
01 ноября 2010 года
SibBear
223 / / 27.07.2006
да проблемы то как таковой нет, все работает. Вопрос по реализации. Использовать подмену функций, или совершенно другую структуру о которой я еще пока не знаю...
Я хотел услышать мнение специалистов, какие подводные камни есть в хуках, и что может быть лучше?
244
01 ноября 2010 года
UAS
2.0K / / 19.07.2006
Ещё один изврат. Мой совет - вообще нафиг выкиньте свою систему модульности и посмотрите хотя бы в сторону Друпала. Посмотрите как там все организовано - а уж потом делайте модули, хуки и т.д.

Была бы моя воля, я бы сделал что-то простое наподобие:
1) Все модули лежат в папке modules по папкам, где папка идентфицирует модуль
2) В папке модуля есть какой-то файл, допустим info, в котором в опред.формате хранятся метаданные о модуле.
3) Набор интерфейсов для модулей.
4) Определяется специальный набор методов модуля, например getMenuItems(), который возвращает массив добавляемых элементов меню (аналог вашего $menu_items).
5) Есть главный класс, допустим ModuleWorker, который подгружает все активные модули и вызывает для каждого getMenuItems() - тем самым вы получаете набор всех элементов меню. Можно добавить кэширование, дабы уменьшить нагрузки.
6) Для обращения к всему списку элементов в меню можно у ModuleWorker сделать спец.метод, типа get/setMenuItems и т.д.

Вообщем, получаете что-то наподобие Друпала, только на классах. Можно и на функциях реализовать, но меня такой подход не впечатляет.
396
01 ноября 2010 года
SibBear
223 / / 27.07.2006
вот у меня щас и сделано все просто, до классов пока не дорос, все на массивах.
Впринципе, даже для подмены данных, я могу в модуле взять тот же $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');
244
01 ноября 2010 года
UAS
2.0K / / 19.07.2006
Ну по идее не должно быть такого, чтобы модули подключались раньше основного кода.
Сядтье и на бумажке спланируйте свою "модульность", потому что сейчас это тихий ужас, если модули срабатывают раньше главного кода.
396
01 ноября 2010 года
SibBear
223 / / 27.07.2006
ну да, с основным кодом погорячился, смотрим только на модули. Нужно тогда какойто ключ делать, в каком порядке их подключать. Или по имени папки или по внутреннему ключу, чтобы они правильно друг за другом шли. и если мы хотим подменить данные, то подключать его последним, если добавить, то первым...
244
01 ноября 2010 года
UAS
2.0K / / 19.07.2006
%) Это не должно зависеть от модулей. Это должно решаться основным кодом через настройки. Система должна считать все меню и запомнить их (в кэш, допустим), далее уже через админку или что угодно должна быть возможность управлять этим. Это как по правильному.
В вашем же случае вам прийдется извращаться как раз указанными вами способами, других путей не вижу. Так что колдуйте любыми предложенными способами.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог