Вывод списка тегов всех постов блогов — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
 
(не показано 7 промежуточных версий 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
 
   @param Integer
 
     $limit - количество выводимых тегов
 
     $limit - количество выводимых тегов
 
  */
 
  */
 
public function tagList($template = 'default', $limit = false) {
 
public function tagList($template = 'default', $limit = false) {
  if(!$template)
 
    $template = 'default';
 
 
 
 
   $posts = new selector('pages');
 
   $posts = new selector('pages');
 
   $posts->types('hierarchy-type')->name('blogs20', 'post');
 
   $posts->types('hierarchy-type')->name('blogs20', 'post');
Строка 32: Строка 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');
Строка 58: Строка 66:
 
</source>
 
</source>
 
<p>
 
<p>
Код макроса необходимо поместить в файл "/classes/modules/blogs20/__custom.php" после строки "//TODO: Write here your own macroses". Теперь нам нужно добавить разрешения для макроса. Для этого создадим в той же директории файл "permissions.custom.php" со следующим содержанием:
+
Код макроса поместим в файл "/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">
Строка 68: Строка 79:
 
</source>
 
</source>
 
<p>
 
<p>
Осталось сделать шаблон, по которому будет организован вывод тегов. В папке "/tpls/blogs20/" необходимо создать папку "tags", а в ней создать файл "default.tpl" и написать в нём текст:
+
Если Вы используете TPL шаблонизатор, также необходимо сделать шаблон, по которому будет организован вывод тегов. В папке "/tpls/blogs20/" создаём папку "tags", а в ней создаём файл "default.tpl" и размещаем в нём текст:
 +
</p>
 +
<p style="text-align: right;">
 +
'''Листинг 3. Шаблон вывода тегов для TPL'''
 
</p>
 
</p>
 
<source lang="PHP">
 
<source lang="PHP">
Строка 97: Строка 111:
 
Блок "tags_block" - контейнер списка тегов, внутри блока используется макрос %lines%, на его место подставляется код, указанный в блоке "tags_block_tag". Блок "tags_block_tag" предназначен для отдельно взятого тега, текст тега доступен через макрос %tag%. Блок "tags_block_empty" подставляется в том случае, если список тегов пуст.
 
Блок "tags_block" - контейнер списка тегов, внутри блока используется макрос %lines%, на его место подставляется код, указанный в блоке "tags_block_tag". Блок "tags_block_tag" предназначен для отдельно взятого тега, текст тега доступен через макрос %tag%. Блок "tags_block_empty" подставляется в том случае, если список тегов пуст.
 
</p>
 
</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>
 +
<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" />