Сидел тупил минут пять над постом так и не понял нифига

Поэтому опишу свой опыт создания модуля.
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!