is.jpegВ прошлом уроке мы создали модуль выводящий некоторую информацию в блок, модуль получился крайне сырой, давайте его улучшим.

Названия хуков ссылаются на описание в api.drupal.ru, если увидели название, кликните, и прочитайте инфу по хуку, без этого понять урок будет затруднительно.

Перво наперво, нужно загнать блок в кеш, и сделать обновление по cron'у. За работу с cron'ом отвечает hook hook_cron. Обработку данных для удобства засунем в отдельную функцию, которую назовем seoblock_data.

function seoblock_cron() {
  seoblock_data();
}

функция предельно проста, при запуске крона, она вызывает функцию seoblock_data();
function seoblock_data() {
  if(!$cash = cache_get('seoblock')) {
$result='';
    $tic= variable_get('tic', false);
    $alexa= variable_get('alexa', false);
    $pr= variable_get('pr', false);

    if ($tic or $alexa or $pr) {  
      if ($tic)    $result .= 'Яндекс.Тиц: '.cy(variable_get('sitename', false)).'<br>';
      if ($alexa)  $result .= 'Alexa rank: '.alexa(variable_get('sitename', false)).'<br>';
      if ($pr)     $result .= 'Google.PR: '.getPageRank(variable_get('sitename', false));
    }
    $output=$result;
    cache_set("seoblock", $output, 'cache', time() + 36000);

  } else {
    $output = $cash->data;
  }
  return $output;
}

Тут все интереснее. Вначале мы проверяем есть ли сохранненый кеш
if(!$cash = cache_get('seoblock'))

и если есть, то помещаем его в переменную $cash. Если же кеша нет, то происходит запрос инфы
$result='';
    $tic= variable_get('tic', false);
    $alexa= variable_get('alexa', false);
    $pr= variable_get('pr', false);

    if ($tic or $alexa or $pr) {  
      if ($tic)    $result .= 'Яндекс.Тиц: '.cy(variable_get('sitename', false)).'<br>';
      if ($alexa)  $result .= 'Alexa rank: '.alexa(variable_get('sitename', false)).'<br>';
      if ($pr)     $result .= 'Google.PR: '.getPageRank(variable_get('sitename', false));
    }

и помещение информации в кеш на 10 часов (параметры сайта обновляются не часто)
cache_set("seoblock", $output, 'cache', time() + 36000);

функция seoblock_block тоже изменилась, если раньше мы каждый раз запрашивали инфу, то теперь вызываем функцию seoblock_data().
function seoblock_block($op='list', $delta=0) {

  if ($op == "list") {
    $block = array();
    $block[0]["info"] = t('seoblock');
    return $block;
  }
  else if ($op == 'view') {
    switch ($delta) {
      case 0:
    $block['content'] = seoblock_data();
    $block['subject'] = 'seoblock';
      break;

    }
return $block;
  }
}  // end seoblock_block

Следующая задача — отделить дизайн, и выкинуть его в отдельный tpl.php файл. Для этого используется hook hook_theme. Он регистрирует темизации.
function seoblock_theme() {
  return array(
    'seoblock' => array(
      'arguments' => array('tic' => $tic, 'alexa' => $alexa, 'pr' => $pr),
      'template' => 'seoblock',
    ),
  );
} // end seoblock_theme

в данном случае мы передаем функции 3 аргумента, и задаем файл темизации
'template' => 'seoblock',

tpl.php к названию, за нас добавит drupal. Если бы данной строки не было, то пришлось добавить функцию тимизации «theme_seoblock».

В связи с разделением кода и дизайна, изменилась функция seoblock_data

function seoblock_data() {
  if(!$cash = cache_get('seoblock')) {
$result='';
    $tic= variable_get('tic', false);
    $alexa= variable_get('alexa', false);
    $pr= variable_get('pr', false);

    if ($tic or $alexa or $pr) {  
      if (variable_get('tic', false))    $tic = cy(variable_get('sitename', false));
      if (variable_get('alexa', false))  $alexa = alexa(variable_get('sitename', false));
      if (variable_get('pr', false))     $pr = getPageRank(variable_get('sitename', false));
    }
    $output=theme('seoblock', $tic, $alexa, $pr);
    cache_set("seoblock", $output, 'cache', time() + 3600);

  } else {
    $output = $cash->data;
  }
  return $output;
}

появился вызов
theme('seoblock', $tic, $alexa, $pr);

файл seoblock.tpl.php

<?php
// $Id;
?>

  <?php if ($tic): ?>
    Яндекс.Тиц: <?php print $tic ?><br>
  <?php endif; ?>

  <?php if ($alexa): ?>
    Alexa rank: <?php print $alexa ?><br>
  <?php endif; ?>

  <?php if ($pr): ?>
    Google.PR: <?php print $pr ?><br>
  <?php endif; ?>

Урок получился небольшой, но надеюсь познавательный, оставайтесь на связи -)

Комментарии

Довольно непросто писать

Довольно непросто писать модуль для друпал.

Действительно -)

Действительно -)

Звучит как: "Довольно

Звучит как: "Довольно непросто иметь мозг" :)

или как "довольно непросто им

или как "довольно непросто им пользоваться" -)

Отличные уроки, автору очень

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

function

function <strong>seoblock</strong>_theme() {
  return array(
    '<strong>seoblock</strong>' => array(
      'arguments' => array('tic' => $tic, 'alexa' => $alexa, 'pr' => $pr),
      'template' => '<strong>seoblock</strong>',
    ),
  );
}

И вызываем theme('seoblock', $tic, $alexa, $pr);

Прокомментируйте пожалуйста, первое seoblock может быть написано как, скажем, seoblocker?
Второе seoblock к чему относится?
НУ а третье - это название темплэйта, это ясно из контекста. АА вот куда пихать этот темплэйт? В папку с темой? В модуль?

Заранее спасибо.

Здравствуйте. Можете показать

Здравствуйте. Можете показать пример работы с БД (запись, чтение) для модуля Drupal. Заранее очень благодарен.

Не проработали вы этот урок

Не проработали вы этот урок вообще. Куда файл с шаблоном пихать, что где означает... ничего не объяснили.

Уроки не самостоятельны, они

Уроки не самостоятельны, они составляют курс, каждый новый урок пишется с оглядкой на прошлые.

Спасибо вам большое за уроки!

Спасибо вам большое за уроки! :) очень нравятся :) планируете продолжать?

Незачто, планирую -) 2

Незачто, планирую -)
2 находятся в написании -) Только нехватает времени и желания)

Ну, проблема со временем

Ну, проблема со временем общеизвестна и понятно, а что за проблема с желанием? :) мотивации не хватает или кто-то\что-то отбивает это желание?

я вот даже зарегался у вас на

я вот даже зарегался у вас на сайте, так мне ваши уроки понравились :)

Большая просьба - для

Большая просьба - для скриншотов не используйте жпег... это просто издевательство над глазами... по-возможности, используйте png-24

Помогите, плиз! В функции

Помогите, плиз!

В функции seoblock_data
не работает функция theme('seoblock', $tic, $alexa, $pr);
уже пробовал theme('seoblock', "1", "1", "1");

а вот так $output="TEST" выводит соотв. TEST, тоесть не работает именно theme();
функция seoblock_theme() и файл seoblock.tpl.php (в директории модуля) есть.

В чем может быть проблема? Помогите плиз, очень уж хочу разделить функционал от отображения. Заранее спасибо!

RSS-материал RSS-материал