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
Форумы портала PHP.SU :: Версия для печати :: модули. принцип написания
Форумы портала PHP.SU » Объявления » FreeLance » модули. принцип написания

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

1. valenok - 18 Сентября, 2007 - 22:21:55 - перейти к сообщению
На этот раз тема относится к другой части этого форума.

Не совместной разработке, а "современные тенденции разработки приложений на PHP".

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

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4.  
  5. // Читаем содержимое папки modules.
  6. // readdir() и т.д.
  7. // $modules список модулей
  8.  
  9. // Дальше выводим меню.
  10. echo "<a href='?mod=".$modules[0]."' >".$modules[0]."< br>";
  11. echo "<a href='?mod=".$modules[1]."' >".$modules[1]."< br>";
  12.  
  13. // Получаем
  14.  
  15. // Форум
  16. // Контакты
  17. // Фильмы
  18. // и т.д.
  19.  
  20. // и инклудим нужный модуль
  21.  
  22. @ include("modules/".$_GET['mod']."/index.php");
  23.  

Код очень примерный, главное смысл.


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

Далее вопрос, как это работает на форумах?
Прежположим я написал модуль кармы.
Создал доп. таблицу для кармы, вывожу нужные ссылки для поднятия - понижения кармы, проверяю чтоб один человек дважды не поднимал карму и т.д.

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

А если мне нужно чтоб она вызывалась в конце каждого сообщения и модуль рейтинга сообщений а не пользователей?
А если нужно чтоб выводилось в главном списке форумом рейтинг тем ?

Тоесть фактически include модулей нужно проставить везде и в каждом месте,
и проверять - должен ли он быть тут или нет.

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


Был бы рад получить от вас приемлимые решения проблемы.

Далее привожу своё решение.
Может кому придлёт в голову чтото на его основе, или ещё что подскажет.



На каждом углу ставить не вызов скрипта проверяющего какие модули должны быть на этом углу и запускать их, а на каждом углу поставить что то в стиле
PHP:
скопировать код в буфер обмена
  1. <?
  2. echo $messageEditBar_module_return;
  3. echo $messageTop_module_return;
  4. echo $row['message'];
  5. echo $messageBottom_module_return;
  6. echo "< hr>Следующее сообщение:";
  7.  
  8. // потом для автора слева от сообщения чтото типа
  9. echo $authorTop_module_return;
  10. echo $row['authorName'].$row['authorAvatar'].$row['id'];
  11. echo $authorBottom_module_return;
  12.  
  13.  


Естественно объём кода возрастает поднебесно
Так что хотелось бы услышать ещё предположения и идеи.

Как говорил наш химик когда задвал вопрос, а все молчали
- любая догадка выигрывает

P.S. -> В современных форумах это дело не реализованно.
Тоесть там идут так называемые built-in модули
и вглыядит это так

PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. echo $row['authorName'].$row['authorAvatar'].$row['id'];
  4. if($admin['conf']['karma']) echo "Поднять карму / понизить карму";
  5.  


Возможно я и ошибаюсь, но я не видел чего то другого.

Вообщем надеюсь суть ясна.
2. Delvin - 19 Сентября, 2007 - 13:08:46 - перейти к сообщению
Предлагаю другой метод разработки модулей, основанный на ООП

Я так еще не реализовывал, но идея крутится довольно долго в голове.

и так

Цитата:

<?
//Функция загрузки модуля
function loadModule ($modName)
{
$mod_path = SITE_ROOT . DIRECTORY_SEPARATOR . 'modules' . DIRECTORY_SEPARATOR . modName . '.php';
$class_name = 'm_' . $modName;
if (file_exists($mod_path))
{
include_once ($mod_path);
return new $class_name;
}
}
?>


в файле модуля создаем класс m_ИмяМодуля и сохраняем по казаному пути с именем ИмяМодуля.php

Дальше думаю все понятно.
3. valenok - 19 Сентября, 2007 - 17:23:29 - перейти к сообщению
А вызывать эту функцию где?
Мне нужно чтоб ladmodule подключал один модуль в начале сообщения, второй модуль в конце, третий после аватара и мне там везде ставиьт вызов этой функции?
Тем более автор модуля не должен редактировать код форума, а только написать сам модуль и где именно его подключать.
4. valenok - 19 Сентября, 2007 - 21:14:10 - перейти к сообщению
и так вариант номер два для решения
это весь output буферизовать, а потом вызывать модули, которые будут редактировать буфер.

Ну ещё варинаты, предположения, идеи ?
Любую подвхватим, проработаем
5. Delvin - 19 Сентября, 2007 - 21:52:00 - перейти к сообщению
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;

$user_arr[$uid] = '<p>Статистика: <em>' . $this->statistica . '</em></p>';
}
//.....
}



Все информация о пользователе обновлена.
теперь выводим

echo make_user_info($uid);
6. valenok - 19 Сентября, 2007 - 22:13:01 - перейти к сообщению
значит нужно будет редактировать ядро и в нужном месте самому вписывать вызов make_user_info()

А цель написать такое ядро, чтоб программист мог написать модуль
(кусочек скрипта который будет вызываться где либо)
положить в директорию modules/
Вписать в файл modules/modules_list.txt строку типа
Цитата:
someModuleName;endOfMessage

и в конце каждого сообщения будет вызываться модуль (выполнение некого кода) автоматически

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

Вовпрос в том, как сделать вызов модуля в нужном месте, тоесть к примеру в конце каждого сообщения.
Это только к примеру в конце сообщения, а на самом деле там где написанно в modules_list.txt

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

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

P.S. для код используйте теги [php][/php]
7. Delvin - 19 Сентября, 2007 - 22:51:20 - перейти к сообщению
Смотри пример.

Написал специально, что бы показать идею.
Пример простой, возможно глючный Улыбка

Если ты пишешь с нуля движок, то главное - грамотно организовать API, что бы разработчик модуля не ковыряя его имел доступ ко всем необходимым переменным и методам.
8. EuGen - 20 Сентября, 2007 - 09:47:40 - перейти к сообщению
2 valenok: если можно, поподробнее в чем вообще задача состоит и где трудности.. может, чем помогу ((* А то сразу с кодов началось я так и не понял, то ли проблемы с движком, то ли с модулями(*
9. valenok - 20 Сентября, 2007 - 19:02:58 - перейти к сообщению
Delvin
Давай попробуем на более практичном примере.

Вот форум я набросал за пару минут.
И так, там же нужно создать директорию modules
в этой директории будут находится папки с именами модулей к примеру /image/
в папке /modules/image/ будет лежать index.php выводящий картинку на экран.

Длее в саму директорию modules/ я кладу файл такого содержания
Название файла: image
Цитата:

Module name: Картинка
Module dir: image
Module inc place: MESSAGE_BOTTOM


ТОже самое делаю с модулем кармой

Название файла: karma
Цитата:

Module name: Карма
Module dir: karmadir
Module inc place: MESSAGE_AUTHOR




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

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

* Можно сразу писать исходя из того что скрипт уже знает что
$modules['karma']['place'] = MESSAGE_AUTHOR ;
$modules['image']['place'] = MESSAGE_BOTTOM ;
10. Джур - 21 Сентября, 2007 - 05:30:50 - перейти к сообщению
1. Для этого придется делать что-то вроде визуального мастера, в котором вы будете тягать свою "карму"

2. вносить изменения в шаблон сайта... это не ядро, а значит это тоже решение.
11. evgenijj - 21 Сентября, 2007 - 09:01:58 - перейти к сообщению
Джур пишет:
вносить изменения в шаблон сайта... это не ядро, а значит это тоже решение.


Да, мне тоже такая мысль пришла в голову. Хотя это и несколько странно - шаблон управляет логикой.

showmessage.tpl.html
PHP:
скопировать код в буфер обмена
  1.  
  2. <tr>
  3. <td>{authorName}{authorAvator}{moduleName*functionName}</td>
  4. <td>{message}</td>
  5. </tr>
  6.  


После того, как мы считаем содержимое шаблона в переменную
$html = file_get_contents("templates/showmessage.tpl.html");
И произведем замены
$html = str_replace("{authorName}", $authorName, $html);
мы проверяем с помощью регулярных выражений, а нет ли в нем конструкций вида
{moduleName*functionName}
и если есть, проверяем наличие в папке modules файла moduleName.php, подключаем его и вызываем функцию functionName (проверив праедварительно ее существование с помощью function_exists). Но тут возникает проблема - как передать этой функции параметры?
12. Джур - 21 Сентября, 2007 - 09:51:51 - перейти к сообщению
Цитата:
Да, мне тоже такая мысль пришла в голову. Хотя это и несколько странно - шаблон управляет логикой.

Ничего подобного... шаблон отображает, а модуль это логика, так что все впорядке... Улыбка
правда вместо {moduleName*functionName} я бы написал <?=modul('karma');?> проще в понимании, легче в исполнении.
13. valenok - 21 Сентября, 2007 - 23:02:25 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3.  <tr>
  4.  <td>{authorName}{authorAvator}{moduleName*functionName}</td>
  5.  <td>{message}</td>
  6.  </tr>
  7.  
  8.  


простыми словами это почти то что я думал и предлогал в своём первом сообщении. Везде понатыкать этих вот {moduleName*functionName}.

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

Тоесть модуль должен в нашем случае просто заменить полностью файл шаблона ?
А ещё добрые старые сообщения должны оставаться..
В принципе модуль дожен ещё изменить струтуру таблиц, поэтому уместно предпологать существование /modules/galery/install.php
14. evgenijj - 21 Сентября, 2007 - 23:35:55 - перейти к сообщению
valenok пишет:

В принципе модуль дожен ещё изменить струтуру таблиц, поэтому уместно предпологать существование /modules/galery/install.php


Модуль, заменяющий шаблоны (причем временно) да еще и перезаписывающий файлы *.php - нет, этого я себе представить не могу. Для меня слишком сложно.
15. valenok - 22 Сентября, 2007 - 03:02:11 - перейти к сообщению
В общем с такими модулями как тема-галерея
думаю придётся позволить топикам быть не топиками,
а простыми ссылками на внешний скрипт галереи.

Насчёт реализации посика по форуму так чтоб искал и по комментариям к фоткам, наверное следует создать таблицу

модуль | таблица модуля | поле для поиска | возваращемое значение | вовзращаемый скрипт

К примеру запись в таблице будет иметь вид
модуль: Galery
таблица: galery_images
поле для поиска: image_comments
возваращемое значение: id
вовзращаемый скрипт: galery.search.php

или просто таблицу которая будет содержать название скрипта поиска по галерее, и туда передавать искомое значение

 

Powered by ExBB FM 1.0 RC1