Создаем собственный модуль.

Попробуем сделать простой модуль, который будет отображаться в блоке на каждой странице и выводить актуальные данные о курсах валют.
Так же добавим в настройки возможность отображать этот блок не для всех групп.
Прежде всего, необходимо создать в каталоге kernel/modules подкаталог для нашего модуля. Пусть он будет называться currency_block.
Внутри каталога создаем файлы index.php и config.xml
 

каталог модуля


 
Файл config.xml делаем таким:
XML

<?xml version="1.0" encoding="UTF-8"?>
<module>
  <name>курсы валют</name>
  <describe>модуль позволяет получать данные у курсах валют с сайта Центробанка России и отображать их в блоке на странице сайта</describe>
  <static>1</static>           <!-- статичный модуль -->
    <access>
      <permis>                 <!-- возможные права -->
        <name>read</name>      <!-- название переменной -->
        <type>boolean</type>
        <title>Просмотр</title>
        <describe>Данная группа может просматривать информацию модуля</describe>
      </permis>
    </access>
</module>
 

собственно, наш модуль готов - его уже можно устанавливать, подключать, настраивать и пр. Другой вопрос, что он пока ничегошеньки не делает, но это мы в скором времени исправим.
Итак, для начала установим модуль:
идем в админке в раздел управления модулями, находим только что созданный модуль и нажимаем иконку "установить".
 

Установка модуля


 
Теперь переходим в раздел управления правами и разрешаем просмотр информации только зарегистрированным пользователям.
 

Настройка групп пользователей


разрешаем просмотр зарегистрированным пользователям


 
В структуре сайта подключаем модуль к корневому элементу сайта (чтобы он отображался на всех страницах), после чего добавляем в шаблон код {$_module_currency_block}  в то место, где мы хотим увидеть блок.

Переключаемся на собственный дизайн


 
Начинаем писать код модуля в файле kernel/modules/currency_block/index.php
 
PHP
<?php
//если у пользователя нет прав для просмотра - прекращаем выполнение модуля
if (!access('read')) return;
//указываем какой шаблон надо использовать
LabCMS::i()->setModuleTemplate('currences.tpl');
//получаем данные от центробанка
$xml=file_get_contents('http://www.cbr.ru/scripts/XML_daily.asp?date_req=01/01/2011');
//формируем массив интересующей нас информации
$currences=getCurrences($xml);
//передаем полученную информацию в шаблонизатор
Tpl::i()->assign('currences', $currences);
 
function getCurrences($xml)
{
    $doc = new DOMDocument;
    $doc->preserveWhiteSpace = false;
    $doc->loadXML($xml);
    $xpath = new DOMXPath($doc);
    $query="/ValCurs/Valute[@ID='R01239']/Value";
    $euro=$xpath->query($query)->item(0)->nodeValue;
    $query="/ValCurs/Valute[@ID='R01235']/Value";
    $usd=$xpath->query($query)->item(0)->nodeValue;
    return array('usd'=>$usd, 'euro'=>$euro);
}

Коль скоро мы указали используемый шаблон - давайте создадим и его. Для начала надо создать подкаталог с названием модуля в каталоге текущего дизайна:
skins/mydisign/currency_block
а в этом подкаталоге создаем тот самый шаблон currences.tpl следующего содержания:
Smarty
<table>
  <tr><td>Валюта</td><td>курс (руб.)</td></tr>
  {foreach $currences as $currency=>$value}
  {* так как источник данных в этом случае не является 100% надежным - переменные на всякий случай экранируем*}
  <tr><td>{$currency|escape}</td><td>{$value|escape}</td></tr>
  {/foreach}
</table>

Пробуем перезагрузить страницу - появились данные. И будут появляться каждый раз при перезагрузке страницы... пока сайт центробанка нас не забанит Понятное дело - им не доставляет удовольствия что мы их дергаем при каждом чихе... равно как и нам - не быстрое это дело. Поэтому делаем следующее:
 
PHP
//указываем какой шаблон надо использовать
LabCMS::i()->setModuleTemplate('currences.tpl');
//кэшируем готовый html на 6 часов
if (LabCMS::i()->is_cached(LabCMS::i()->getModuleTemplate(), 60*60*6)) return;

Теперь мы запрашиваем информацию от центробанка только раз в 6 часов, а все остальное время берем готовый блок из кэша.

 

Всего комментариев: 2

  • PHP
    if (LabCMS::i()->is_cached(LabCMS::i()->getModuleTemplate(), 60*60*6)) return;

    в этой строке надо двоеточие добавить, иначе чудо не произойдет.
     
    видимо пример устаревший, во-первых, при выводе шаблона:
    Smarty
    {foreach $currences as $currency}
      {* так как источник данных в этом случае не является 100% надежным - переменные на всякий случай экранируем*}
      <tr><td>{$currency.name|escape}</td><td>{$currency.value|escape}</td></tr> 

    результатом будет:
    PHP
    3 3
    4 4
     

    я решил это так:
    Smarty
    {foreach from=$currences key=k item=i}
      <tr><td>{$k|escape}</td><td>{$i|escape}</td></tr>

     
    во-вторых, модуль отображается и для зарегистрированных, и для незарегистрированных юзеров, хотя права выставлены на просмотр модуля только зарегистрированными пользователями. как это поправить?
    • Вы правы. Внес исправления в статью - так будет правильнее.
Имя*:

Email: