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 раз(а)
На этот раз тема относится к другой части этого форума.
Не совместной разработке, а "современные тенденции разработки приложений на PHP".
На этот раз расчитываю на проявление вашей сообразительности.
И так, расскажу как мне кажется действуют модули в phpNuke, к примеру.
Причём расскажу сразу кодом
Таким образом я могу написать модуль интернет магазина, положить его в папку modules
и он автоматически появится в меню сайта.
Далее вопрос, как это работает на форумах?
Прежположим я написал модуль кармы.
Создал доп. таблицу для кармы, вывожу нужные ссылки для поднятия - понижения кармы, проверяю чтоб один человек дважды не поднимал карму и т.д.
Теперь, мне нужно чтоб это выводилось ни где попало, а под аватаром в сообщение.
Тоесть вызов скрипта модуля делать нужно именно там.
А если мне нужно чтоб она вызывалась в конце каждого сообщения и модуль рейтинга сообщений а не пользователей?
А если нужно чтоб выводилось в главном списке форумом рейтинг тем ?
Тоесть фактически include модулей нужно проставить везде и в каждом месте,
и проверять - должен ли он быть тут или нет.
Вопрос -как быть.
Потому что вызывать на каждом углу это не дело - и громоздко, и углов может оказаться слишком много, и долго скрипт выполняться будет.
Был бы рад получить от вас приемлимые решения проблемы.
Далее привожу своё решение.
Может кому придлёт в голову чтото на его основе, или ещё что подскажет.
На каждом углу ставить не вызов скрипта проверяющего какие модули должны быть на этом углу и запускать их, а на каждом углу поставить что то в стиле
в файле модуля создаем класс m_ИмяМодуля и сохраняем по казаному пути с именем ИмяМодуля.php
Дальше думаю все понятно.
valenok
Отправлено: 19 Сентября, 2007 - 17:23:29
Здесь могла бы быть ваша реклама
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006 Откуда: Israel
Помог: 3 раз(а)
А вызывать эту функцию где?
Мне нужно чтоб ladmodule подключал один модуль в начале сообщения, второй модуль в конце, третий после аватара и мне там везде ставиьт вызов этой функции?
Тем более автор модуля не должен редактировать код форума, а только написать сам модуль и где именно его подключать.
----- Truly yours, Sasha.
valenok
Отправлено: 19 Сентября, 2007 - 21:14:10
Здесь могла бы быть ваша реклама
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006 Откуда: Israel
Помог: 3 раз(а)
и так вариант номер два для решения
это весь output буферизовать, а потом вызывать модули, которые будут редактировать буфер.
Ну ещё варинаты, предположения, идеи ?
Любую подвхватим, проработаем
----- Truly yours, Sasha.
Delvin
Отправлено: 19 Сентября, 2007 - 21:52:00
Новичок
Покинул форум
Сообщений всего: 4
Дата рег-ции: Сент. 2007
Помог: 0 раз(а)
valenok пишет:
А вызывать эту функцию где?
Мне нужно чтоб ladmodule подключал один модуль в начале сообщения, второй модуль в конце, третий после аватара и мне там везде ставиьт вызов этой функции?
Тем более автор модуля не должен редактировать код форума, а только написать сам модуль и где именно его подключать.
Все зависит от реализации движка.
например какие-то данные о пользователе хранятся в глобальном массиве $user_arr[uid][0]...[uid][3] который далее будет обрабатываться функцией
function make_user_info($uid)
{
global $user_arr;
for ($i=0; $i < count($arr[$uid]); $i++)
{
$info .= $arr[$uid][$i];
}
return $info;
}
и например у нас есть модуль statistica.php
и соотвественно класс : class m_statistica
{
private $statistica = '';
//.....
// класс выполняет какие -то действия
// и по окончанию например выполняет такую функцию
//.....
function add_user_info($uid)
{
global $user_arr;
Все информация о пользователе обновлена.
теперь выводим
echo make_user_info($uid);
valenok
Отправлено: 19 Сентября, 2007 - 22:13:01
Здесь могла бы быть ваша реклама
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006 Откуда: Israel
Помог: 3 раз(а)
значит нужно будет редактировать ядро и в нужном месте самому вписывать вызов make_user_info()
А цель написать такое ядро, чтоб программист мог написать модуль
(кусочек скрипта который будет вызываться где либо)
положить в директорию modules/
Вписать в файл modules/modules_list.txt строку типа
Цитата:
someModuleName;endOfMessage
и в конце каждого сообщения будет вызываться модуль (выполнение некого кода) автоматически
Тоесть задача написать ядро которое будет само обрабатывать папку модулей и файл модульсЛист.тхт и само вызывать выполнения того или иного куска кода в указанном месте.
Вовпрос в том, как сделать вызов модуля в нужном месте, тоесть к примеру в конце каждого сообщения.
Это только к примеру в конце сообщения, а на самом деле там где написанно в modules_list.txt
Это значит что в ядре после каждого сообщения нужно вызывать функцию которая будет проверять - нужно ли здесь вызывать тот или иной модуль или нет.
Но если я после каждого сообщения будут вызывать такую функцию,
да и не только в конце каждого сообщения, но ещё и допустим в списке тем, профиле и т.д. - получится совсем не хорошо.
P.S. для код используйте теги [php][/php]
----- Truly yours, Sasha.
Delvin
Отправлено: 19 Сентября, 2007 - 22:51:20
Новичок
Покинул форум
Сообщений всего: 4
Дата рег-ции: Сент. 2007
Помог: 0 раз(а)
Смотри пример.
Написал специально, что бы показать идею.
Пример простой, возможно глючный
Если ты пишешь с нуля движок, то главное - грамотно организовать API, что бы разработчик модуля не ковыряя его имел доступ ко всем необходимым переменным и методам.
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
2 valenok: если можно, поподробнее в чем вообще задача состоит и где трудности.. может, чем помогу ((* А то сразу с кодов началось я так и не понял, то ли проблемы с движком, то ли с модулями(*
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
valenok
Отправлено: 20 Сентября, 2007 - 19:02:58
Здесь могла бы быть ваша реклама
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006 Откуда: Israel
Помог: 3 раз(а)
Delvin
Давай попробуем на более практичном примере.
Вот форум я набросал за пару минут.
И так, там же нужно создать директорию modules
в этой директории будут находится папки с именами модулей к примеру /image/
в папке /modules/image/ будет лежать index.php выводящий картинку на экран.
Длее в саму директорию modules/ я кладу файл такого содержания
Название файла: image
Как отредактировать ядро, чтоб читало * файл моудлей, проверяло где какой модуль подключать и в конце каждого сообщения показывло картинку, а под ником каждого автора показывало ссылку "Прибавить к рейтингу"
При этом так чтобы заранее мы, авторы ядра, не знали какие модули лежат и где их хотят запускать, а иначе получается бюлт-ин, а не динамические.
* Можно сразу писать исходя из того что скрипт уже знает что
$modules['karma']['place'] = MESSAGE_AUTHOR ;
$modules['image']['place'] = MESSAGE_BOTTOM ;
После того, как мы считаем содержимое шаблона в переменную
$html = file_get_contents("templates/showmessage.tpl.html");
И произведем замены
$html = str_replace("{authorName}", $authorName, $html);
мы проверяем с помощью регулярных выражений, а нет ли в нем конструкций вида
{moduleName*functionName}
и если есть, проверяем наличие в папке modules файла moduleName.php, подключаем его и вызываем функцию functionName (проверив праедварительно ее существование с помощью function_exists). Но тут возникает проблема - как передать этой функции параметры?
Покинул форум
Сообщений всего: 423
Дата рег-ции: Март 2007
Помог: 0 раз(а)
Цитата:
Да, мне тоже такая мысль пришла в голову. Хотя это и несколько странно - шаблон управляет логикой.
Ничего подобного... шаблон отображает, а модуль это логика, так что все впорядке...
правда вместо {moduleName*functionName} я бы написал <?=modul('karma');?> проще в понимании, легче в исполнении.
----- Тамбовский каджит тебе товарищ
valenok
Отправлено: 21 Сентября, 2007 - 23:02:25
Здесь могла бы быть ваша реклама
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006 Откуда: Israel
простыми словами это почти то что я думал и предлогал в своём первом сообщении. Везде понатыкать этих вот {moduleName*functionName}.
Но дело в том что а если я захочу модуль не который выводит слова "поднять карму", а модуль галереи
позволяющий вместо обычного списка сообщений одним за другим показывать фотографии с "постраничной навигацией" .
Тоесть модуль должен в нашем случае просто заменить полностью файл шаблона ?
А ещё добрые старые сообщения должны оставаться..
В принципе модуль дожен ещё изменить струтуру таблиц, поэтому уместно предпологать существование /modules/galery/install.php
----- Truly yours, Sasha.
evgenijj
Отправлено: 21 Сентября, 2007 - 23:35:55
Участник
Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006 Откуда: Москва
Помог: 10 раз(а)
valenok пишет:
В принципе модуль дожен ещё изменить струтуру таблиц, поэтому уместно предпологать существование /modules/galery/install.php
Модуль, заменяющий шаблоны (причем временно) да еще и перезаписывающий файлы *.php - нет, этого я себе представить не могу. Для меня слишком сложно.
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006 Откуда: Israel
Помог: 3 раз(а)
В общем с такими модулями как тема-галерея
думаю придётся позволить топикам быть не топиками,
а простыми ссылками на внешний скрипт галереи.
Насчёт реализации посика по форуму так чтоб искал и по комментариям к фоткам, наверное следует создать таблицу
модуль | таблица модуля | поле для поиска | возваращемое значение | вовзращаемый скрипт
К примеру запись в таблице будет иметь вид
модуль: Galery
таблица: galery_images
поле для поиска: image_comments
возваращемое значение: id
вовзращаемый скрипт: galery.search.php
или просто таблицу которая будет содержать название скрипта поиска по галерее, и туда передавать искомое значение
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.