NPJ next: Документация/ЕщеОдинПримерМодуля ...

Главная | Каталог | Изменения | НовыеКомментарии | Пользователи | Вам запрещён доступРегистрация | Вход:  Пароль:  

Информация по созданию модулей для НПЖ


Структура модулей опущена в документации ( Сторонние модули для НПЖ ), поэтому приходится восстанавливать все самому. Чтобы не забыть или не запутаться, буду писать здесь. Перед тем, как читать этот документ, обязательно ознакомьтесь с Официальной документацией! Иначе половины не поймете или не заставите модуль работать.

Типы модулей

Модули, как подпространство


Например, пространство пользователя mine@npj – npj.ru/mine/. Мои фотографии это его подпространство (кроме фотграфий я еще иногда кодирую на PHP, например – это тоже может быть подпространством, но врядли оно потребует какого-то функционала, не реализованного в НПЖ). Логично обозвать его photos, а ссылаться вот так: npj.ru/mine/photos/. Тем более, что механизма публикации фотографий в НПЖ сейчас нет. Для реализации подпространств с функциональностью, которой нет в НПЖ можно (необходимо) использовать механизм модулей. В этом случае модуль должен быть «модулем-подпространством».

Модули, как аккаунты


Ничего не знаю про это.

Файл конфигурации модуля

<?
$this
->modules["MyCoolPhotoLibrary"] = array(
        
"subspace"          => "photos",
             
// если модуль - ((#МодулиКакПодпространство подпространство))
             // то данный параметр должен строго соответствовать
             // имени подпространства.
        
"name"              => "Моя крутая фотобиблиотека",
        
"module_dir"        => "mycoolpl/",
             
// где физически на диске лежит модуль, относительно корня инсталляции
        
"messageset_prefix" => "DK_Demo",
        
"classname"         => "MyCoolPhotoLibrary",
             
// имя класса. файл, содержащий дефиницию класса, должен именоваться
             // точно так же + .php.
);
?>

Структура каталогов

classes


Здесь лежат дефиниции классов модуля. Может быть несколько модулей в одном подкаталоге. Имя файла должно быть идентично имени класса из файла конфигурации и расширения php. Один модуль – один класс – один файл дефиниции. Дефиниция должна включать описание класса и своего рода диспетчер методов модуля:
<?
class MyCoolPhotoLibrary extends NpjModule
{
  var 
$module_name "MyCoolPhotoLibrary"// for use in debug

  
function Init$rel_url )
  {
    
$this->method "default";                  // Обработчик по умолчанию - default (handlers/default.php)
    
$this->params = array();
    
$parts explode("/"trim($rel_url,"/"));  // Разбор URL и задание параметров обработчика
    
if ($rel_url == "gallery")                  // Если вызван метод gallery, то
    
{
      
$this->method "gallery";                // Скажем коду, отвечающему за отображение модуля
      
$this->params $parts;                   // что надо вызвать обработчик gallery, который
      
array_shift($this->params);               // лежит в подкаталоге handlers в файле gallery.php
    
}
  }
}
?>

handlers


Обработчики методов модуля, если можно так сказать. Метод модуля, грубо говоря, это все, что расоположено после наименования модуля в адресной строке. Например модуль называется MyCoolPhotoLibrary и работает, как подпространство, а ссылка в адресной строке выглядит так: npj.ru/mine/photos/gallery, то в конечном итоге будет исполнен скрипт gallery.php Вообще-то, хэндлеры, это действия, которые может выполнять модуль, например, добавить изображение, показать изображение и т.п.

Типичный преступник хэндлер выглядит примерно так:
тут нет проверок аутентичности
<?

  
// Сначала заводим свой темплейт и задаем необходимые параметры
  
$TE = &$this->GenerateTemplateEngine();
  
$TE->Assign("user",$principal->data["user_name"]);

  
// Затем заполняем поля "внешнего" темплейта
  
$tpl->Assign("Html:TITLE",        $this->module_name );
  
$tpl->Assign("Preparsed:TITLE",   "" );

  
// И всовываем туда то, что сделали на первом этапе
  
$tpl->Assign("Preparsed:CONTENT"$TE->Parse("default.html") );
  
$tpl->Assign("Preparsed:TIGHT"1);
  
$tpl->Assign("Preparsed:TIGHT_COMMENTS"1);

  
// Надо вернуть GRANTED, иначе... А что иначе?
  
return GRANTED;
?>


 
Один файл. [Показать файлы/форму]
Комментариев нет. [Показать комментарии/форму]
Поделиться ссылкой