Помнится мне как то поднималась уже мною эта тема, но вроде к исчерпывающим,
однозначным или эффективным решениям тогда не суждено было быть..
И так - цель написать ядро к которому потом будут дописывать модули
причём так, чтоб само ядро при этом не изменять.
Будем рассматривать на примере cms и форума.
Так выглядит структура cms с простой системой расширений
есть папка modules
Дальше на главной странице, ядро сканирует эту папку
и для каждого модуля выводит в меню ссылку index.php?mod=calendar
а при переходе по этой ссылке, на странице показывается календарь.
Более сложная структура модулей
Модули которые к примеру не должны попадать в меню,
допустим баннер после каждого третего абзаца на любой странице.
Такой модуль реализуем при помощи буферизации вывода
и последующей обработки. При этом системные затраты на такое действо
очень велики.
И сам вопрос - как же реализовать расширяемую систему
с меньшими затратами ? Ваши предложения?
1. valenok - 22 Июня, 2008 - 20:48:53 - перейти к сообщению
2. EuGen - 22 Июня, 2008 - 21:01:31 - перейти к сообщению
Что-то я смутно понял про баннеры, и про то, зачем выводить ссылки на модули где-то.
Давайте для начала определимся, что такое модуль, каковы его функции и свойства.
В таком деле определенно нужен системный подход. Поэтому предлагаю определиться с терминами, явлениями и прочим. А уж потом будем думать, как это реализовать. Ибо сейчас мне например неясно что мы хотим делать.
Ответ: представим что это простая cms.
Ктото решил дописать дополнительный функционал "новости"
который на определённой странице сайта показывает новости CNN
Дальше он размещает свой скрипт в папке modules под названием News
и ядро пройдясь по папке modules добавляет в меню навигации
ссылку index.php?mod=news. Сам же index.php грубо говоря выполняет
include($_GET['mod']) и на странице выводятся новости.
Теперь предположим что этот же товарищ решил написать чтото более продвинутое.
К примеру архив статей от пользователей. Он её написал и при index.php?mod=arts
происходит такой же include($_GET['mod']) и отображается список статей.
Далее он выбирает некий index.php?mod=arts&article=Волшебные_очки
и ему показывают определенную статью.
Набралось у него пять миллионов статей и столько же пользователей и он решил
подзаработать на рекламе поставив в каждой статье после третего абзаца свой баннер.
Или что ещё сложнее после каждой третей ссылки в меню,
которое формируется scandir'ом.
Что такое модуль:
Дополнительные функции расширяющие возможности сайта.
К примеру гостевая книга. Свойства модулей заключаются в том что
для корректной работы модуля его достаточно разместить в каталоге modules
и не вносить никакие изменения в остальной код.
Давайте для начала определимся, что такое модуль, каковы его функции и свойства.
В таком деле определенно нужен системный подход. Поэтому предлагаю определиться с терминами, явлениями и прочим. А уж потом будем думать, как это реализовать. Ибо сейчас мне например неясно что мы хотим делать.
Ответ: представим что это простая cms.
Ктото решил дописать дополнительный функционал "новости"
который на определённой странице сайта показывает новости CNN
Дальше он размещает свой скрипт в папке modules под названием News
и ядро пройдясь по папке modules добавляет в меню навигации
ссылку index.php?mod=news. Сам же index.php грубо говоря выполняет
include($_GET['mod']) и на странице выводятся новости.
Теперь предположим что этот же товарищ решил написать чтото более продвинутое.
К примеру архив статей от пользователей. Он её написал и при index.php?mod=arts
происходит такой же include($_GET['mod']) и отображается список статей.
Далее он выбирает некий index.php?mod=arts&article=Волшебные_очки
и ему показывают определенную статью.
Набралось у него пять миллионов статей и столько же пользователей и он решил
подзаработать на рекламе поставив в каждой статье после третего абзаца свой баннер.
Или что ещё сложнее после каждой третей ссылки в меню,
которое формируется scandir'ом.
Что такое модуль:
Дополнительные функции расширяющие возможности сайта.
К примеру гостевая книга. Свойства модулей заключаются в том что
для корректной работы модуля его достаточно разместить в каталоге modules
и не вносить никакие изменения в остальной код.
3. valenok - 22 Июня, 2008 - 21:07:17 - перейти к сообщению
Мой первое предположение также основано на принципе феризации
Как мне кажется работает буферизация:
ядро формирует некий результат вида
<html>
<div id='menu'> Yandex | Google </div>
<div id='content' > Основное отличие поисковых сист... </div>
</html>
после чего наш модуль находит в этом id='content' делает некие операции
и получается волшебный результат..
мой предложение это вызывать модуль на месте на которое он предназначен во время
генерации данных в этом месте.
Тоесть модуль "баннер после абзаца" должен выполняться в той части страницы где
находится собственно основная часть документа, тоесть id='content'
Ядро в свою очередь будет при генерации кода
в момент генерации данного блока вместо вывода данных на экран echo
данные будут передаваться в функцию apply_content_modules
которая вызывает каждый раз функции модулей по очереди,
передавая каждой следующей функции результат предыдущей.
Тоесть получится нечто такое:
Как мне кажется работает буферизация:
ядро формирует некий результат вида
<html>
<div id='menu'> Yandex | Google </div>
<div id='content' > Основное отличие поисковых сист... </div>
</html>
после чего наш модуль находит в этом id='content' делает некие операции
и получается волшебный результат..
мой предложение это вызывать модуль на месте на которое он предназначен во время
генерации данных в этом месте.
Тоесть модуль "баннер после абзаца" должен выполняться в той части страницы где
находится собственно основная часть документа, тоесть id='content'
Ядро в свою очередь будет при генерации кода
в момент генерации данного блока вместо вывода данных на экран echo
данные будут передаваться в функцию apply_content_modules
которая вызывает каждый раз функции модулей по очереди,
передавая каждой следующей функции результат предыдущей.
Тоесть получится нечто такое:
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- <html>
- <div id='menu'> Yandex | Google </div>
- <div id='content' >
- <?PHP
- echo apply_content_modules("Основное отличие поисковых сист... ");
- function apply_content_modules($data)
- {
- global $modulesList;
- foreach($modulesList as $module)
- if ( $module['place']=='content' )
- {
- include($module['script']);
- $data = $module['function'] ($data);
- }
- return $data;
- }
- ?>
- </div>
- </html>
получается это простым улучшением принципа буферизации.
В случае с баннером после каждого абзаца сканирование текста не избежать
если только не внедрять исполнение модуля глубже..