Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Система устойчивая к .. расширениям
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006 Откуда: Israel
Помог: 3 раз(а)
Помнится мне как то поднималась уже мною эта тема, но вроде к исчерпывающим,
однозначным или эффективным решениям тогда не суждено было быть..
И так - цель написать ядро к которому потом будут дописывать модули
причём так, чтоб само ядро при этом не изменять.
Будем рассматривать на примере cms и форума.
Так выглядит структура cms с простой системой расширений
есть папка modules
Дальше на главной странице, ядро сканирует эту папку
и для каждого модуля выводит в меню ссылку index.php?mod=calendar
а при переходе по этой ссылке, на странице показывается календарь.
Более сложная структура модулей
Модули которые к примеру не должны попадать в меню,
допустим баннер после каждого третего абзаца на любой странице.
Такой модуль реализуем при помощи буферизации вывода
и последующей обработки. При этом системные затраты на такое действо
очень велики.
И сам вопрос - как же реализовать расширяемую систему
с меньшими затратами ? Ваши предложения?
----- Truly yours, Sasha.
EuGen
Отправлено: 22 Июня, 2008 - 21:01:31
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Что-то я смутно понял про баннеры, и про то, зачем выводить ссылки на модули где-то.
Давайте для начала определимся, что такое модуль, каковы его функции и свойства.
В таком деле определенно нужен системный подход. Поэтому предлагаю определиться с терминами, явлениями и прочим. А уж потом будем думать, как это реализовать. Ибо сейчас мне например неясно что мы хотим делать.
Ответ: представим что это простая 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
и не вносить никакие изменения в остальной код.Отредактировано модератором: valenok, 22 Июня, 2008 - 21:24:21
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
valenok
Отправлено: 22 Июня, 2008 - 21:07:17
Здесь могла бы быть ваша реклама
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006 Откуда: Israel
Помог: 3 раз(а)
Мой первое предположение также основано на принципе феризации
Как мне кажется работает буферизация:
ядро формирует некий результат вида
<html>
<div id='menu'> Yandex | Google </div>
<div id='content' > Основное отличие поисковых сист... </div>
</html>
после чего наш модуль находит в этом id='content' делает некие операции
и получается волшебный результат..
мой предложение это вызывать модуль на месте на которое он предназначен во время
генерации данных в этом месте.
Тоесть модуль "баннер после абзаца" должен выполняться в той части страницы где
находится собственно основная часть документа, тоесть id='content'
Ядро в свою очередь будет при генерации кода в момент генерации данного блока вместо вывода данных на экран echo
данные будут передаваться в функцию apply_content_modules
которая вызывает каждый раз функции модулей по очереди,
передавая каждой следующей функции результат предыдущей.
echo apply_content_modules("Основное отличие поисковых сист... ");
function apply_content_modules($data)
{
global$modulesList;
foreach($modulesListas$module)
if($module['place']=='content')
{
include($module['script']);
$data=$module['function']($data);
}
return$data;
}
?>
</div>
</html>
получается это простым улучшением принципа буферизации.
В случае с баннером после каждого абзаца сканирование текста не избежать
если только не внедрять исполнение модуля глубже..
----- Truly yours, Sasha.
D1mOn
Отправлено: 23 Июня, 2008 - 00:12:53
Частый гость
Покинул форум
Сообщений всего: 222
Дата рег-ции: Янв. 2008 Откуда: Гагастан
Помог: 0 раз(а)
[+][+][+][+][+]
Даже сказать ничего не могу ) А может заменить сканирование папки с модулями, которое происходит каждый раз при обращении к странице, например, массивом с именнами модулей, которые можно добавлять только через админ-панель.
Минус всех этих CMS - тяжеловесность. Да и зачем Вам изобретать велосипед? Тем более сейчас очень часто вижу как ругают все эти системы.
Но если Вы хотите понять, а то и улучшить саму технику создания таких систем, то это конечно нужно.
з.ы: я рядом)
valenok
Отправлено: 23 Июня, 2008 - 00:42:53
Здесь могла бы быть ваша реклама
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006 Откуда: Israel
Помог: 3 раз(а)
Цитата:
Минус всех этих систем - тяжеловесность
Именно..
Цитата:
заменить сканирование папки с модулями
Именно.. вопрос встаёт в том как эти модули запускать, учитывая то что
каждый модуль может дополнять как функциональность самого ядра,
так и просто быть кусочком сайта.
К примеру модуль считающий количество запросов и время генерации страницы..
Получается единственный вариант написания ядра так это каждую тютельку в ядре
прогонять через apply_modules, тогда при написании модулей ядро можно будет не трогать.
Как понять что значит не трогать ядро ->
это значит что можно ряд скриптом обработать zend encoder ом
загрузить на сервер и будет тебе простая кмс, а если в папку modules чтото положить
то будет доп функционал, типа гостевой книги или счётчика запросов..
зы: спасибо)
----- Truly yours, Sasha.
Джур
Отправлено: 23 Июня, 2008 - 11:00:22
Посетитель
Покинул форум
Сообщений всего: 423
Дата рег-ции: Март 2007
Помог: 0 раз(а)
как-то вы все усложнили на мой вкус...
чтобы ядро не пришлось изменять, достаточно уйти от порочной практики "монолитного ядра" как это сейчас модно в OS.
цель ядра:
1. получить от юзвера запрос о получении странички
2. проверить существует ли такая страничка
3. сходить в "базу" и взять массив с данными, какие блоки и с какими параметрами, в какой шаблон надо собрать. ()
4. вывести через выбраный шаблон.
допустим юзверь запрасил страничку "главная"... ядро смотрит... так, шаблон "стандартный-летний" в слот "меню" надо вставить "меню", в слот "текст" надо вставить "модуль_текст(добро пожаловать на сайт)" а следом "модуль_новости(row=3)"
если вдруг комуто взбредет добавить модуль "модуль_показывающий_валюты" в слот "меню" то он не будет потрашить код, он просто укажет в описании странички куда и на какое место он хочет данный модуль пихнуть
итого у нас будет две папки, в первой библиотеки, а во второй собственно сами модули. библиотеки можно подгружать через __autoload().. вот вам и простейшая, расширяемая до упора система
Покинул форум
Сообщений всего: 282
Дата рег-ции: Янв. 2008
Помог: 0 раз(а)
Цитата:
index.php?mod=calendar
хм, такой вариант системы я делал в первых своих CMS,
к сожалению весьма не желательный вариант,
в системе обычно бывает другая ситуация,
в каждом шаблоне есть свои модули которые почти никак не реагируют на адресную строку,
потом есть содержание страницы в которой может быть не один модуль,
из-за этого у людей случаются большие путаницы,
потом эти модули как то надо вставлять в страницы и шаблоны,
я с этим тоже парился весьма не мало времени.
да к стати затраты не велики если приложить голову.
Покинул форум
Сообщений всего: 222
Дата рег-ции: Янв. 2008 Откуда: Гагастан
Помог: 0 раз(а)
[+][+][+][+][+]
Я Вам скажу, что грузить базы для получения массива с модулями бла бла бла, не имеет смысла, т.к. придется писать интерфейс, потом обрабатывать... Проще редактировать такой файлик через Текстарею, и самому добавлять модули, имхо один раз "нагрузить" чтобы прописать все модули, и возможно потом Вам не надо будет уже обращаться к этому файлу! А так представте, каждый заходящий, делает один запрос к базе, чтобы посути получать каждый раз одно и тоже! Я как глянул на среднее кол-во запросов на одной странице, меня чуть унэкспектед не охватил ) Представте, Вам надо и забаненных разбанить, и неактивированных удалить, и много еще чего! Ужос!
Имхо, ядро должно грузить файлы конфигураций, файлы функций, файл в котором находится наш с вами массив с именами модулей и т.д. Больше от ядра ничего не надо!
scuter
Отправлено: 23 Июня, 2008 - 13:45:38
Посетитель
Покинул форум
Сообщений всего: 282
Дата рег-ции: Янв. 2008
Помог: 0 раз(а)
D1mOn пишет:
бла бла бла
действительно бла бла бла,
лучше посмотреть как другие делают,
потом сделать как они, а потому сделать лучше них.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.