Action — это относительно независимый фрагмент кода НПЖ, который может быть вызван из произвольного документа с помощью синтаксиса {{ActionName param1="value1" param2=value2 ...}}. Как можно заметить, у Action есть имя, которое соответствует файлу с фрагментом кода и ряд параметров.
Результат работы этого фрагмента кода вставляется вместо {{.....}} при выводе документа (а не при сохранении!). Типичными Actions являются: {{Feed}}, {{Changes}}, {{ClusterFacet}}, {{Search}}, {{TableOfContents}}.
Где расположен код Actions
Код каждого Action расположен в отдельном php-файле, а все эти файлы как правило находятся в каталоге npj/actions (это может быть изменено в конфигурации узла, но зачем бы?).
Например, код Action {{Search}} находится в файле npj/actions/search.php — обратите внимание на то, что имя файла записывается всегда в нижнем регистре.
Как сделать простой Action
Самый простой Action можно сделать, всего лишь создав файл в каталоге npj/actions, соответствующий имени вашего Action и написав в нём что-то вроде:
Если имя файла соответствует том, что указано в примере, то указав в документе {{HelloWorld}}, вы получите рамочку с надписью “Hello, Cruel World” внутри. Обратите внимание, что имя файла должно быть в нижнем регистре, а как уж вы запишете его вызов в вака-синтаксисе — безразницы. Хоть {{HeLlOwOrLd}}.
Как получить параметры и имя Action внутри него самого
Action может иметь произвольное число параметров, и, что весьма ценно, их можно заполучить в php-коде Action — все они лежат в массиве $params. В примере выводится сумма параметров “x” и “y” (все примеры представляют собой полноценный Action):
Кроме того, что параметры доступны по имени, можно также получить значение первого, второго и далее параметров по порядку (это используется, например, в Action {{Include}} )
Имя Action, приведённое в нижний регистр можно получить из переменной $script_name. Чтобы получить имя Action, как оно было набрано в документе, придётся потрудиться — смотрите пример:
<?php return "Вы вызвали действие -- ". $tpl->GetValue("Action:Name"); ?>
Как сделать Action доступным через URL
Некоторые действия очень удобно вызывать через URL, например, http://www.npj.ru/node/tree или http://www.npj.ru/kuso/facetfilter — более того, многие возможности сервиса именно так и работают =). Для того, чтобы сделать написанный вами Action (например, Unknown action "HelloWorld", рассмотренный ранее) через URL необходимо сделать следующие действия:
1. Отредактировать config_tunes.php или npj/config.php (в зависимости от того, будет ли входить написанный Вами action в поставку НПЖ
редактируем npj/config.php (этого не надо делать, если вы уже отредактировали config_tunes.php)
<?php // было $this->NPJ_ACTIONS = 'directory|users|communities|workgroups|accounts|'. 'tree|keywordstree|clustertree|'. 'changes|recentchanges|journalchanges|clusterchanges|nodechanges|'. 'index|clusterindex|journalindex|'. 'toc|tableofcontents|'. 'keywords|clusterfacet|backlinks|search|feed|modfeed|moderatefeed|'. 'facetfilter'; // стало $this->NPJ_ACTIONS = 'directory|users|communities|workgroups|accounts|'. 'tree|keywordstree|clustertree|'. 'changes|recentchanges|journalchanges|clusterchanges|nodechanges|'. 'index|clusterindex|journalindex|'. 'toc|tableofcontents|'. 'keywords|clusterfacet|backlinks|search|feed|modfeed|moderatefeed|'. 'facetfilter'. '|helloworld'; // добавилась вот эта строчка ?>
Добавить русское (или другое человеческое) имя Action в messageset
Для этого не нужно понимать, что такое messageset?, а нужно лишь найти файл навроде npj/messagesets/std.php и в нём сделать нечто подобное следующему:
<?php // было // Названия всех акшнов "Actions" => array( "a" => "Страничная ссылка (якорь)", "anchor" => "Страничная ссылка (якорь)", "backlinks" => "Ссылки на этот документ", // стало // Названия всех акшнов "Actions" => array( "helloworld" => "Привет, мир!", // добавилась вот эта строчка "a" => "Страничная ссылка (якорь)", "anchor" => "Страничная ссылка (якорь)", "backlinks" => "Ссылки на этот документ", ?>
Как сделать синоним (алиас) для Action
Если вы хотите, например, сделать, чтобы написание {{HelloCruelWorld}} соответствовало вызову Action с определённым параметром — например: {{HelloWorld how="cruel"}}, то вам нужно посмотреть файл npj/actions/modfeed.php или npj/actions/users.php и сделать аналогичным образом.
Алиас делается доступным через URL абсолютно также как и сам Action (посмотрите чуть выше, как именно).
Как убрать рамочку вашего Action навсегда
Из документации пользователя мы знаем, что рамочки вокруг Action можно переключать и вообще отключать. Но если наш Action вообще не нуждается в рамочке, то её можно принудительно отключить с помощью php-кода:
<?php $tpl->Assign("Action:NoWrap", 1); ?>
Тогда сколько бы пользователи не пытались вернуть рамочку, у них этого не выйдет.
Как изменить стандартный заголовок Action
Если ваш Action занесён в messageset (см. выше об этом), то рамочка вокруг результатов его работы будет иметь заголовок, соответствующий тому имени, под которым он туда занесён. Конечно, это удобно. Конечно, нужно уметь это менять. Вот как полностью сменить заголовок Action:
Гораздо чаще нужно дописать что-то к стандартному заголовку. Хороший пример — действие {{RecentChanges}}. Тогда делаем как-нибудь так:
<?php $tpl->Assign("Action:TITLE", $tpl->GetValue("Action:TITLE")." дописываем в конец"); ?>
Как работать с шаблонами и другими объектами из Action
Во многих примерах выше мы пользовались $tpl->Assign, $tpl->GetValue — всё это часть стандартного окружения программного кода НПЖ. Более подробно о нём можно прочитать где-нибудь здесь?, когда я об этом напишу. Пока ограничимся наиболее важными моментами:
$tpl->Assign( “tpl_var”, $value ) — занести в домент парсера шаблонов некоторое значение. В шаблоне его можно будет вывести, написав что-то вроде {{tpl_var}}
$tpl->GetValue( “tpl_var” ) — это вернёт нам значение, записанное ранее. Полезные варианты:
$tpl->GetValue( «/» ) — вернёт абсолютный адрес корня НПЖ-сайта
$tpl->GetValue( “images” ) — вернёт абсолютный адрес каталога с картинками текущей шкуры ( themes/xxxx/images )
$tpl->Parse( $template_name ) — отпарсить шаблон с указанным именем (как правило это будет «actions/sometplt.html») и вернуть результат
$rh->node_name — название текущего узла (записано в вашем config.php) — аналогичным образом можно достучаться и до других переменных конфига
$tpl->message_set[ “Encoding” ] — вот так получаем данные из текущего messageset
$this или $object — ссылка на документ, в теле которого был вызван Action. Там есть куча полезных методов, но не здесь же их перечислять.
MVC или Page Listing Action — что это?
Часто в разговорах разработчики-аксакалы говорят “MVC-Action” или, возможно, “Page Listing Action”. Под это определение подходит некоторые Actions, результатом выполнения которых является выводимый в том или ином (но очень похожем друг на друга) формате список страниц. Это такие Actions, как:
Feed
Facet
Changes
Tree / Index
Search
и многие другие (которых пока даже ещё нет).
Для таких Actions были написаны несколько специальных методов и «недо-Actions», благодаря чему достигнута довольно большая степень универсальности в выводе результатов. Более подробно о них стоит почитать по адресу ДокументацияРазработчика.Actions/PageListing.