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 :: Система устойчивая к .. расширениям

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
valenok Модератор
Отправлено: 22 Июня, 2008 - 20:48:53
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




Помнится мне как то поднималась уже мною эта тема, но вроде к исчерпывающим,
однозначным или эффективным решениям тогда не суждено было быть..

И так - цель написать ядро к которому потом будут дописывать модули
причём так, чтоб само ядро при этом не изменять.

Будем рассматривать на примере cms и форума.

Так выглядит структура cms с простой системой расширений
есть папка modules
Дальше на главной странице, ядро сканирует эту папку
и для каждого модуля выводит в меню ссылку index.php?mod=calendar
а при переходе по этой ссылке, на странице показывается календарь.

Более сложная структура модулей
Модули которые к примеру не должны попадать в меню,
допустим баннер после каждого третего абзаца на любой странице.
Такой модуль реализуем при помощи буферизации вывода
и последующей обработки. При этом системные затраты на такое действо
очень велики.

И сам вопрос - как же реализовать расширяемую систему
с меньшими затратами ? Ваши предложения?


-----
Truly yours, Sasha.
 
My status
 Top
EuGen Администратор
Отправлено: 22 Июня, 2008 - 21:01:31
Post Id


Профессионал


Покинул форум
Сообщений всего: 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


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
valenok Модератор
Отправлено: 22 Июня, 2008 - 21:07:17
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




Мой первое предположение также основано на принципе феризации

Как мне кажется работает буферизация:
ядро формирует некий результат вида

<html>
<div id='menu'> Yandex | Google </div>
<div id='content' > Основное отличие поисковых сист... </div>
</html>


после чего наш модуль находит в этом id='content' делает некие операции
и получается волшебный результат..

мой предложение это вызывать модуль на месте на которое он предназначен во время
генерации данных в этом месте.
Тоесть модуль "баннер после абзаца" должен выполняться в той части страницы где
находится собственно основная часть документа, тоесть id='content'

Ядро в свою очередь будет при генерации кода
в момент генерации данного блока вместо вывода данных на экран echo
данные будут передаваться в функцию apply_content_modules
которая вызывает каждый раз функции модулей по очереди,
передавая каждой следующей функции результат предыдущей.

Тоесть получится нечто такое:

PHP:
скопировать код в буфер обмена
  1.  
  2. <html>
  3. <div id='menu'> Yandex | Google </div>
  4. <div id='content' >
  5. <?PHP
  6.  
  7. echo apply_content_modules("Основное отличие поисковых сист... ");
  8.  
  9. function apply_content_modules($data)
  10. {
  11.   global $modulesList;
  12.   foreach($modulesList as $module)
  13.     if ( $module['place']=='content' )
  14.     {
  15.        include($module['script']);
  16.        $data = $module['function'] ($data);
  17.     }
  18.  
  19.    return $data;
  20. }
  21.  
  22. ?>
  23. </div>
  24. </html>
  25.  


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


-----
Truly yours, Sasha.
 
My status
 Top
D1mOn
Отправлено: 23 Июня, 2008 - 00:12:53
Post Id



Частый гость


Покинул форум
Сообщений всего: 222
Дата рег-ции: Янв. 2008  
Откуда: Гагастан


Помог: 0 раз(а)

[+][+][+][+][+]


Даже сказать ничего не могу ) А может заменить сканирование папки с модулями, которое происходит каждый раз при обращении к странице, например, массивом с именнами модулей, которые можно добавлять только через админ-панель.

Минус всех этих CMS - тяжеловесность. Да и зачем Вам изобретать велосипед? Тем более сейчас очень часто вижу как ругают все эти системы.

Но если Вы хотите понять, а то и улучшить саму технику создания таких систем, то это конечно нужно.

з.ы: я рядом)
 
 Top
valenok Модератор
Отправлено: 23 Июня, 2008 - 00:42:53
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




Цитата:
Минус всех этих систем - тяжеловесность

Именно..

Цитата:
заменить сканирование папки с модулями

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

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

Как понять что значит не трогать ядро ->
это значит что можно ряд скриптом обработать zend encoder ом
загрузить на сервер и будет тебе простая кмс, а если в папку modules чтото положить
то будет доп функционал, типа гостевой книги или счётчика запросов..

зы: спасибо)


-----
Truly yours, Sasha.
 
My status
 Top
Джур
Отправлено: 23 Июня, 2008 - 11:00:22
Post Id



Посетитель


Покинул форум
Сообщений всего: 423
Дата рег-ции: Март 2007  


Помог: 0 раз(а)




как-то вы все усложнили на мой вкус... Закатив глазки

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

цель ядра:
1. получить от юзвера запрос о получении странички
2. проверить существует ли такая страничка
3. сходить в "базу" и взять массив с данными, какие блоки и с какими параметрами, в какой шаблон надо собрать. ()
4. вывести через выбраный шаблон.

допустим юзверь запрасил страничку "главная"... ядро смотрит... так, шаблон "стандартный-летний" в слот "меню" надо вставить "меню", в слот "текст" надо вставить "модуль_текст(добро пожаловать на сайт)" а следом "модуль_новости(row=3)"

если вдруг комуто взбредет добавить модуль "модуль_показывающий_валюты" в слот "меню" то он не будет потрашить код, он просто укажет в описании странички куда и на какое место он хочет данный модуль пихнуть

итого у нас будет две папки, в первой библиотеки, а во второй собственно сами модули. библиотеки можно подгружать через __autoload().. вот вам и простейшая, расширяемая до упора система

(Отредактировано автором: 23 Июня, 2008 - 11:03:53)



-----
Тамбовский каджит тебе товарищ
 
 Top
scuter
Отправлено: 23 Июня, 2008 - 12:16:51
Post Id



Посетитель


Покинул форум
Сообщений всего: 282
Дата рег-ции: Янв. 2008  


Помог: 0 раз(а)




Цитата:
index.php?mod=calendar

хм, такой вариант системы я делал в первых своих CMS,
к сожалению весьма не желательный вариант,

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


да к стати затраты не велики если приложить голову.

(Отредактировано автором: 23 Июня, 2008 - 12:25:42)

 
 Top
D1mOn
Отправлено: 23 Июня, 2008 - 13:36:18
Post Id



Частый гость


Покинул форум
Сообщений всего: 222
Дата рег-ции: Янв. 2008  
Откуда: Гагастан


Помог: 0 раз(а)

[+][+][+][+][+]


Я Вам скажу, что грузить базы для получения массива с модулями бла бла бла, не имеет смысла, т.к. придется писать интерфейс, потом обрабатывать... Проще редактировать такой файлик через Текстарею, и самому добавлять модули, имхо один раз "нагрузить" чтобы прописать все модули, и возможно потом Вам не надо будет уже обращаться к этому файлу! А так представте, каждый заходящий, делает один запрос к базе, чтобы посути получать каждый раз одно и тоже! Я как глянул на среднее кол-во запросов на одной странице, меня чуть унэкспектед не охватил ) Представте, Вам надо и забаненных разбанить, и неактивированных удалить, и много еще чего! Ужос!

Имхо, ядро должно грузить файлы конфигураций, файлы функций, файл в котором находится наш с вами массив с именами модулей и т.д. Больше от ядра ничего не надо!
 
 Top
scuter
Отправлено: 23 Июня, 2008 - 13:45:38
Post Id



Посетитель


Покинул форум
Сообщений всего: 282
Дата рег-ции: Янв. 2008  


Помог: 0 раз(а)




D1mOn пишет:
бла бла бла

действительно бла бла бла,
лучше посмотреть как другие делают,
потом сделать как они, а потому сделать лучше них.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB