Про общий модуль (фреймворк)

Обсуждение CMS Made Simple в России.

Moderators: iturbay, wdwp

Post Reply
von-hamster
Power Poster
Power Poster
Posts: 339
Joined: Thu Nov 01, 2007 3:11 pm

Про общий модуль (фреймворк)

Post by von-hamster »

Ситуация следующая:
У меня есть несколько самописных модулей, которые используют один и тот же набор файлов (шаблоны, доп. библиотеки...)

Как это я реализовал:
Положил просто в папку modules свою папку (MY_functions), а затем в каждом модуле, который использует данные пишу:

Code: Select all

	function SetParameters() {
		$this->CUR_PATH = dirname(__FILE__);
		$this->FNC_PATH = "{$this->CUR_PATH}/../MY_functions";
		$this->TPL_PATH = 'file:' . realpath($this->FNC_PATH . '/templates');
	}
А в action уже пишу:

Code: Select all

include_once($this->FNC_PATH . '/function.sys_images.php');
include_once($this->FNC_PATH . '/function.lib.php');
...
При этом естественно не проверяются зависимости модулей и трудно теперь мои модули выложить для всех...

Вопрос:
Можно ли стандартно создать библиотеку для модулей (есть ли какие-то правила) или модуль, который ничего не выполняет (а только содержит библиотеки) и как использовать данные этого модуля?
User avatar
Il_Burbero
Forum Members
Forum Members
Posts: 128
Joined: Tue Apr 15, 2008 10:36 am

Re: Про общий модуль (фреймворк)

Post by Il_Burbero »

Сидел тупил минут пять над постом так и не понял нифига :)
Поэтому опишу свой опыт создания модуля.
1. Я пользовался Module Maker избавляет от рутинной работы, т.е. если примерная схема модуля есть, то можно быстренько сделать заготовку и уже с ней работать. Заготовка хорошо закомментирована на английском.
2. Еще я пользовался http://www.cmsmadesimple.org/apidoc/ тоже на английском и методом последовательного тыка некоторых функций до меня доходил постепенно их смысл, а некоторые и без этого были понятны - по названию. Конечно просто список функций не дает полноты знаний об АПИ но все же лучше чем ничего.
3. Понял что все настройки модуля лучше проводить через Смарти, алгоритм такой:
Если в method.install.php добавить $this->SetPreference('nazvanie', 'znachenie');  то это автоматом создаст при установке соответствующю запись в БД.
Затем проделывается самое муторное создается описание и смарти подписка всяких значений формы:1)action.options.php, шаблон вывода формы: 2)adminprefs.tpl, и обработка формы: 3)action.admin_saveprefs.php
1)

Code: Select all

$smarty->assign('formstart',$this->CreateFormStart($id,'admin_saveprefs',$returnid));

$smarty->assign('formend',$this->CreateFormEnd());

$smarty->assign('submit',$this->CreateInputSubmit($id,'submit',$this->Lang('submitpref')));

$smarty->assign('prompt_nazvanie',
        $this->Lang('select_nazvanie''));
$smarty->assign('input_nazvanie'',
        $this->CreateInputDropdown($id,'nazvanie'', array('On'=>'znachenie', 'Off'=>'znachenieOff')));          

echo $this->ProcessTemplate('adminprefs.tpl');
В примере естественно самая малость от того что использует modform.inc.php

2) шаблон как обычно:

Code: Select all

{$formstart}
<table border="0" cellspacing="5" cellpadding="0" style="margin:0 20px 0 0">
  <tr>
    <td>{$prompt_nazvanie}</td>
    <td> {$input_nazvanie}</td>
  </tr>
  
  <tr>
    <td>{$submit}</td>
    <td>  </td>
    <td> </td>
    <td> </td>
  </tr>
</table>


{$formend}
соответственно значения типа $this->Lang('nazvanieoperatsii') выносится в язык lang/en_US.php в виде $lang['nazvanieoperatsii'] = 'Nazvanie operatsii';   

обработка формы тогда сводится к виду

Code: Select all

if( !isset($gCms) ) exit;

if( !$this->CheckPermission('Modify Site Preferences') )
  {
    echo $this->ShowErrors($this->Lang('error_permissiondenied'));
    return;
  }

$this->SetPreference('nazvanie',$params['nazvanie']);

$this->Redirect($id, 'defaultadmin', $returnid, array("module_message"=>$this->Lang('opions_saved'),"tab"=>"options"), $params);
Потом эти настройки очень легко достаются в пределах видимости модуля $znach = $this->GetPreference('nazvanie'); там будет то что было выбрано и сохранено в array('On'=>'znachenie', 'Off'=>'znachenieOff')

4) Далее классы, функции внутренние и внешние принцип одинаков.
Я прикручивал сторонние классы кладя их в папку lib модуля и добавлял их так:

Code: Select all

require_once(dirname(__FILE__). DIRECTORY_SEPARATOR .'lib' . DIRECTORY_SEPARATOR .'myclass.php'); 
Иногда требовался вызов имеющихся в CMS классов я его делал так:

Code: Select all

$config =& $gCms->GetConfig();      
require_once($config['root_path']. DIRECTORY_SEPARATOR .'lib' . DIRECTORY_SEPARATOR .'misc.functions.php'); 
Вообще $gCms (Class CmsObject) позволяет вызвать кучу классов и переменных относящися к ядру, например $contentops =& $gCms->GetContentOperations(); позволяет получить доступ к операциям с контентом, например $contentops->CreateNewContent($contentparam['content']) создает новую страничку с пустыми переменными.     

Последнее.
Еще очень хорошая штука $params в ней можно передавать данные между скриптами. Например где то определяем

Code: Select all

$params[message] = 'Hellow word!'; 

и затем редирект с передачей

Code: Select all

$this->Redirect($id, 'default', $returnid, array('message'=>$params[message]));
здесь default это название между action и .php т.е. в примере скрипт находится в action.default.php. После редиректа переменная будет доступна в  action.default.php в $params[message], т.е. сделав echo $params[message]; получим   Hellow word!
von-hamster
Power Poster
Power Poster
Posts: 339
Joined: Thu Nov 01, 2007 3:11 pm

Re: Про общий модуль (фреймворк)

Post by von-hamster »

Не, как создать модуль - я представляю... Вопрос в том, что делать, если несколько модулей используют одну и ту-же библиотеку и одинаковые шаблоны... Как их вынести? Не копировать-же в каждый модуль одно и тоже, а потом синхронизировать это все (это пройденый этап)... Нужно что-то типа пустого модуля, который нигде никак не подключается автоматом, чтобы не загружать систему, а содержит только нужные функции/методы/шаблоны...
User avatar
Il_Burbero
Forum Members
Forum Members
Posts: 128
Joined: Tue Apr 15, 2008 10:36 am

Re: Про общий модуль (фреймворк)

Post by Il_Burbero »

function GetDependencies() позволяет требовать зависимость от другого модуля. Ну и я думаю что много чего уже определено в Class CMSModule (/class.module.inc.php)
Я не делал подобные штуки, но предполагаю что схема такая:
Делаете пустой модуль Х который нигде не отображается и пихаете туда все ваши библиотеки.
В других модулях Y в функцию GetDependencies пишете зависимость от модуля Х.
В модулях Y я думаю надо поковырять Class CMSModule (/class.module.inc.php) там вроде как можно вызывать модуль, какие то параметры вызванного модуля.
Наверное  AddEventHandler  (string $modulename, string $eventname, [boolean $removable = true])  инициализирует модуль, а RemoveEventHandler  (string $modulename, mixed $eventname) деструктирует. Правда создает новый или вызвывает то что есть хз.
Надо короче вызывать Class CMSModule где нибудь и смотреть по функциям чего он делает. Сделать модуль пустышку вызывать класс и смотреть...
Sonya

Re: Про общий модуль (фреймворк)

Post by Sonya »

Модули подгружаются так (на примере CMSMailer):

Code: Select all

$cmsmailer =& $this->GetModuleInstance('CMSMailer');
Объект $cmsmailer содержит все доступные методы:

Code: Select all

$cmsmailer->AddAddress( $mail);
....
von-hamster
Power Poster
Power Poster
Posts: 339
Joined: Thu Nov 01, 2007 3:11 pm

Re: Про общий модуль (фреймворк)

Post by von-hamster »

Code: Select all

$cmsmailer =& $this->GetModuleInstance('CMSMailer');
Подразумевает, что этот самый инстанс существует, тоесть модуль грузится при открытии страницы... А мне этого не нужно... Особенно для презентационной части... Т.к. этот код относится только к административной части...

Как я понял - при загрузке любой страницы грузятся все модули, создаются объекты, и помещаются в массив... А уже потом оттуда дергаются...

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

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

Re: Про общий модуль (фреймворк)

Post by Sonya »

von-hamster wrote: От модуля мне нужно только то, чтобы он подгружался в административном разделе и можно было проверять зависимости... Или по другому - можно ли и как настроить модуль, чтобы информация о нем не попадала в презентационный раздел.
Тогда нужно в классе модуля добавить/изменить метод

Code: Select all

  function IsAdminOnly()
  {
    return true;
  }
Такие модули грузятся только в админке. Или я опять чего не поняла? :)
von-hamster
Power Poster
Power Poster
Posts: 339
Joined: Thu Nov 01, 2007 3:11 pm

Re: Про общий модуль (фреймворк)

Post by von-hamster »

скорее всего то, что нужно...
Post Reply

Return to “Russian - русский”