Вывод списка тегов всех постов блогов — различия между версиями
Kalexey (обсуждение | вклад) |
Mad grant (обсуждение | вклад) |
||
(не показано 10 промежуточных версий 1 участника) | |||
Строка 1: | Строка 1: | ||
[[category:Написание кастомных макросов]] | [[category:Написание кастомных макросов]] | ||
+ | [[category:Верстка в XSLT]] | ||
+ | [[category:Верстка в TPL]] | ||
+ | [[Категория:Модуль Блоги20]] | ||
+ | '''Актуально для версии 2.9''' | ||
+ | |||
<p> | <p> | ||
'''Задача''': | '''Задача''': | ||
Строка 11: | Строка 16: | ||
<p> | <p> | ||
Для решения данной задачи воспользуемся протоколом выборки данных - "[http://wiki.umisoft.ru/Selector_-_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BA%D0%B8_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85 Selector]". Напишем макрос, который с помощью Selector'a будет формировать список тегов и выводить их по шаблону: | Для решения данной задачи воспользуемся протоколом выборки данных - "[http://wiki.umisoft.ru/Selector_-_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BA%D0%B8_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85 Selector]". Напишем макрос, который с помощью Selector'a будет формировать список тегов и выводить их по шаблону: | ||
+ | </p> | ||
+ | <p style="text-align: right;"> | ||
+ | '''Листинг 1. Код макроса''' | ||
</p> | </p> | ||
<source lang="PHP"> | <source lang="PHP"> | ||
/* | /* | ||
@param String | @param String | ||
− | $template - шаблон вывода тегов | + | $template - шаблон вывода для TPL |
+ | @param Integer | ||
+ | $limit - количество выводимых тегов | ||
*/ | */ | ||
− | public function tagList($template = 'default') { | + | public function tagList($template = 'default', $limit = false) { |
− | |||
− | |||
− | |||
$posts = new selector('pages'); | $posts = new selector('pages'); | ||
$posts->types('hierarchy-type')->name('blogs20', 'post'); | $posts->types('hierarchy-type')->name('blogs20', 'post'); | ||
Строка 30: | Строка 37: | ||
$tags = array_values(array_unique($tags)); | $tags = array_values(array_unique($tags)); | ||
+ | if(!$template) | ||
+ | $template = 'default'; | ||
+ | |||
list($tags_block, $tags_block_tag, $tags_block_empty) = | list($tags_block, $tags_block_tag, $tags_block_empty) = | ||
def_module::loadTemplates('blogs20/tags/'.$template, 'tags_block', 'tags_block_tag', 'tags_block_empty'); | def_module::loadTemplates('blogs20/tags/'.$template, 'tags_block', 'tags_block_tag', 'tags_block_empty'); | ||
− | $ | + | $total = count($tags); |
− | if($ | + | if($total > 0) { |
+ | if($limit) | ||
+ | $total = (($limit < $total) ? $limit : $total); | ||
+ | |||
$lines = array(); | $lines = array(); | ||
− | for($i = 0; $i < $ | + | for($i = 0; $i < $total; $i++) { |
$line_arr = array(); | $line_arr = array(); | ||
$line_arr['tag'] = $tags[$i]; | $line_arr['tag'] = $tags[$i]; | ||
Строка 53: | Строка 66: | ||
</source> | </source> | ||
<p> | <p> | ||
− | Код макроса | + | Код макроса поместим в файл "/classes/modules/blogs20/__custom.php" после строки "//TODO: Write here your own macroses". Теперь нам нужно добавить разрешения для макроса. Для этого создадим в той же директории файл "permissions.custom.php" со следующим содержанием: |
+ | </p> | ||
+ | <p style="text-align: right;"> | ||
+ | '''Листинг 2. Добавление разрешений''' | ||
</p> | </p> | ||
<source lang="PHP"> | <source lang="PHP"> | ||
Строка 63: | Строка 79: | ||
</source> | </source> | ||
<p> | <p> | ||
− | + | Если Вы используете TPL шаблонизатор, также необходимо сделать шаблон, по которому будет организован вывод тегов. В папке "/tpls/blogs20/" создаём папку "tags", а в ней создаём файл "default.tpl" и размещаем в нём текст: | |
+ | </p> | ||
+ | <p style="text-align: right;"> | ||
+ | '''Листинг 3. Шаблон вывода тегов для TPL''' | ||
</p> | </p> | ||
<source lang="PHP"> | <source lang="PHP"> | ||
Строка 90: | Строка 109: | ||
</source> | </source> | ||
<p> | <p> | ||
− | Блок "tags_block" - контейнер списка тегов, "tags_block_tag" | + | Блок "tags_block" - контейнер списка тегов, внутри блока используется макрос %lines%, на его место подставляется код, указанный в блоке "tags_block_tag". Блок "tags_block_tag" предназначен для отдельно взятого тега, текст тега доступен через макрос %tag%. Блок "tags_block_empty" подставляется в том случае, если список тегов пуст. |
+ | </p> | ||
+ | <p> | ||
+ | Примеры использования макроса: | ||
+ | </p> | ||
+ | <p style="text-align: right;"> | ||
+ | '''Листинг 4. Пример использования макроса в TPL''' | ||
+ | </p> | ||
+ | <source lang="php"> | ||
+ | %blogs20 tagList(20)% | ||
+ | </source> | ||
+ | <p style="text-align: right;"> | ||
+ | '''Листинг 5. Пример использования макроса в XSLT''' | ||
</p> | </p> | ||
+ | <source lang="html4strict"> | ||
+ | <xsl:value-of select="document('udata://blogs20/tagList/20/')/lines/tag/." disable-output-escaping="yes" /> | ||
+ | </source> |
Текущая версия на 11:52, 5 июня 2013
Актуально для версии 2.9
Задача:
Вывести по шаблону список тегов всех постов блогов.
Решение:
Для решения данной задачи воспользуемся протоколом выборки данных - "Selector". Напишем макрос, который с помощью Selector'a будет формировать список тегов и выводить их по шаблону:
Листинг 1. Код макроса
/*
@param String
$template - шаблон вывода для TPL
@param Integer
$limit - количество выводимых тегов
*/
public function tagList($template = 'default', $limit = false) {
$posts = new selector('pages');
$posts->types('hierarchy-type')->name('blogs20', 'post');
$tags = array();
foreach($posts as $post)
$tags = array_merge($tags, $post->tags);
$tags = array_values(array_unique($tags));
if(!$template)
$template = 'default';
list($tags_block, $tags_block_tag, $tags_block_empty) =
def_module::loadTemplates('blogs20/tags/'.$template, 'tags_block', 'tags_block_tag', 'tags_block_empty');
$total = count($tags);
if($total > 0) {
if($limit)
$total = (($limit < $total) ? $limit : $total);
$lines = array();
for($i = 0; $i < $total; $i++) {
$line_arr = array();
$line_arr['tag'] = $tags[$i];
$lines[] = def_module::parseTemplate($tags_block_tag, $line_arr, $tags);
}
$block_arr = array();
$block_arr['void:lines'] = $lines;
return def_module::parseTemplate($tags_block, $block_arr);
} else {
return $tags_block_empty;
}
}
Код макроса поместим в файл "/classes/modules/blogs20/__custom.php" после строки "//TODO: Write here your own macroses". Теперь нам нужно добавить разрешения для макроса. Для этого создадим в той же директории файл "permissions.custom.php" со следующим содержанием:
Листинг 2. Добавление разрешений
<?php
$permissions = Array(
'common' => array('tagList')
);
?>
Если Вы используете TPL шаблонизатор, также необходимо сделать шаблон, по которому будет организован вывод тегов. В папке "/tpls/blogs20/" создаём папку "tags", а в ней создаём файл "default.tpl" и размещаем в нём текст:
Листинг 3. Шаблон вывода тегов для TPL
<?php
$FORMS = Array();
$FORMS['tags_block'] = <<<END
<div>%lines%</div>
END;
$FORMS['tags_block_tag'] = <<<END
<span> - <b>%tag%</b> - </span>
END;
$FORMS['tags_block_empty'] = <<<END
<b>Пусто!</b>
END;
?>
Блок "tags_block" - контейнер списка тегов, внутри блока используется макрос %lines%, на его место подставляется код, указанный в блоке "tags_block_tag". Блок "tags_block_tag" предназначен для отдельно взятого тега, текст тега доступен через макрос %tag%. Блок "tags_block_empty" подставляется в том случае, если список тегов пуст.
Примеры использования макроса:
Листинг 4. Пример использования макроса в TPL
%blogs20 tagList(20)%
Листинг 5. Пример использования макроса в XSLT
<xsl:value-of select="document('udata://blogs20/tagList/20/')/lines/tag/." disable-output-escaping="yes" />