CMS: Как вы реализовываете подключаемые модули?

stiff

Новичок
CMS: Как вы реализовываете подключаемые модули?

Хотелось бы услышать у людей, разрабатывающих CMS, как они реализуют подключаемые "модули"?
Под модулем я подразумеваю центральную часть страницы. Вернее код, который сгенерирует эту часть.

У меня на данный момент сделан отдельный каталог с файлом main.php. При необходимости он инклудиться и из него вызывается ф-ция plugin_main()

PHP:
  function plugin_main()
  {
    global $_httppatch, $params, $_shellpatch;

    $casekey = isset($params[1])?$params[1]:false;

    switch (true) {
      case 'abc.asp' == $casekey:

        break;
      case 'index.html' == $casekey:
      case '' == $casekey:

        break;
      default:
      	return show_notfound();
    }
  }
Как вы думаете это "правильный" подход или можно сделать как-то по-другому?

С этим подходом я столкнулся с проблемой расширяемости. Когда модуль разрастается за 1к строк перемешаться в нем становиться неудобно. Побывал решать эту проблему через include:

PHP:
      case 'abc.asp' == $casekey:
        $i=1;
        include(somefile.php);
        break;
но при этом переменная $i "не видна" в somefile.php...
 

zerkms

TDD infected
Команда форума
эхх....

1. вопрос неоднократно обсуждался
2. вопрос некорректен по той причине, что неизвестно:
- что тебе нужно
- что ты умеешь
- что у тебя уже есть
 

die_hard

Новичок
попробую свои силы в мыслечтении %-)

вот что тебе нужно %-)
PHP:
function plugin_main()
  {
    global $params;
    $def_casekey = 'not_found';
    $casekey = isset($params[1])?$params[1]:$def_casekey;
    if($casekey != $def_casekey)
    {
         show_defined($casekay);
    }
    else
    {
          show_undefined();
    }
}
function show_undefined()
{
   global $full_path_to_undefined_file;
   include($full_path_to_undefined_file);
}
function show_defined($file)
{
   global $full_path_to_broken_file, $full_path_to_defined_files_dir;
   if(!is_file($full_path_to_defined_files_dir."/".$file))
  {
     include($full_path_to_broken_file);
  }
  else
  {
      include($full_path_to_defined_files_dir."/".$file);
  }
}
с имена переменных и контентом думаю сам разберешься.
 

stiff

Новичок
Автор оригинала: zerkms
1. вопрос неоднократно обсуждался
2. вопрос некорректен по той причине, что неизвестно:
- что тебе нужно
- что ты умеешь
- что у тебя уже есть
1. Я нашел обсуждения общих вопросов, а ответа на данный вопрос там не было.
2.
- Мне нужнен масштабируемый механизм подключаемых модулей. И как лучше оформлять модуль: в виде ф-ции с switch или есть какие-то другие методы.
- а что нужно уметь?
- cms

2Gorynych: да это почти тожесамое.

2die_hard: а ф-ции show_*defined() для ограничения видимости переменных? У меня до
switch (true) {
создаются объекты, которые юзаются во всем модуле, поэтому ограничить не получиться... я вижу выход сделать

PHP:
      case 'abc.asp' == $casekey: 
        ...
        include($_shellpatch.'abc.php');
        ...
        break;
или
PHP:
      $includes = array('abc', 'qwe');
      ...
      case in_array($casekey, $includes): 
        //большие подмодули которые инклудим
        include($_shellpatch.$casekey.'.php');
        ...
        return $out;
        //маленький код, который нет смысла выносить в подмодуль
      case 'index.html' == $casekey: 
      case '' == $casekey: 
        ...
        return $out; 
      default: 
          return show_notfound();
 

die_hard

Новичок
Автор оригинала: stiff
1. Я нашел обсуждения общих вопросов, а ответа на данный вопрос там не было.
2.
- Мне нужнен масштабируемый механизм подключаемых модулей. И как лучше оформлять модуль: в виде ф-ции с switch или есть какие-то другие методы.
- а что нужно уметь?
- cms

2Gorynych: да это почти тожесамое.

2die_hard: а ф-ции show_*defined() для ограничения видимости переменных? У меня до
switch (true) {
создаются объекты, которые юзаются во всем модуле, поэтому ограничить не получиться... я вижу выход сделать

PHP:
      case 'abc.asp' == $casekey: 
        ...
        include($_shellpatch.'abc.php');
        ...
        break;
или
PHP:
      $includes = array('abc', 'qwe');
      ...
      case in_array($casekey, $includes): 
        //большие подмодули которые инклудим
        include($_shellpatch.$casekey.'.php');
        ...
        return $out;
        //маленький код, который нет смысла выносить в подмодуль
      case 'index.html' == $casekey: 
      case '' == $casekey: 
        ...
        return $out; 
      default: 
          return show_notfound();
ну и бери нужный объект откуда нужно инициализируй где нужно и передавай вторым параметром в show_defined.

можно инициализировать в внутрях show_defined

А вообще если если дело касается грамотной структуры твоей cms - то это отдельный разговор.
 

stiff

Новичок
die_hard
а если 2 объекта? а 3-4-5...
а если какойто объект нужен например в show_undefined?

> А вообще если если дело касается грамотной структуры твоей cms
касается...
 

die_hard

Новичок
Автор оригинала: stiff
die_hard
1 - а если 2 объекта? а 3-4-5...
2 - а если какойто объект нужен например в show_undefined?

> А вообще если если дело касается грамотной структуры твоей cms
3 - касается...
1 - придумай сам если можешь способ доставания нужного объекта из нужного места
2 - нужен объект - сделай
3 - CMS обзор

Честное слово - как в детском саду %-)
 

stiff

Новичок
1 - вроде предумал. код вверху
2 - зачем плодить сущности?
3 - предлагаешь перелопатить код всех упомянутых там цмс в поисках ответа? =)
 

die_hard

Новичок
1 - "предупал" -> предумал? придумал максимально похожее решение. похожее на предоставленный код
2 - Никто не предлагал плодить ненужные сущности. Фишка в том, что нужный объект ты достаешь и инициализируешь (по-моему очевидно)
3 - создание CMS - это уже можно сказать мегабаян (хоть и большой) веб-разработок. Уже выработаны некоторые принципы проектирования и разработки CMS. об этом я хотел сказать. Это, согласен, было не очевидно :)

Теперь по существу.

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

stiff

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

Нужно сделать красивое и удобное решение. Я перерабатываю некоторые модули своей ЦМС и столкнулся с необходимостью разбить модуль на части поэтому и задал сдесь вопрос...
 

tf

крылья рулят
die_hard
- Мне нужнен масштабируемый механизм подключаемых модулей. И как лучше оформлять модуль: в виде ф-ции с switch или есть какие-то другие методы.
case 'abc.asp' == $casekey:
...
include($_shellpatch.'abc.php');
...
break;
а можно хранить информацию о модулях в какойнибуть массиве или брать из базы
 

stiff

Новичок
tf информация о модулях храниться в базе. Вопрос о оформлении самого модуля
 

die_hard

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

stiff

Новичок
die_hard подскажите какие именно CMS лучше посмотреть? Не имею времени на просмотр всех представленных CMS...
 

die_hard

Новичок
не знаю какой вариант предложат мастадонты CMS дела, но я бы вам посоветовал joomla бывшая мамбо.
 

HraKK

Мудак
Команда форума
Joomla мягко скажем не лучший вариант, я бы на ней показывал пособие как не надо делать CMS

ИМХО
 

die_hard

Новичок
HraKK - вот и предложите.......... будьте любезны .......свой вариант.
 
Сверху