Вы здесь

Пишем свой модуль для Drupal часть 2. Cron, темизация, tpl.php

В прошлом уроке мы создали модуль выводящий некоторую информацию в блок, модуль получился крайне сырой, давайте его улучшим. Названия хуков ссылаются на описание в 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)).' '; 
                if ($alexa) $result .= '
                Alexa rank: '.alexa(variable_get('
                sitename ', false)).'
                '; 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)).
    '
    '; if ($alexa) $result .= '
    Alexa rank: '.alexa(variable_get('
    sitename ', false)).'
    '; 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);
  

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

Комментарии

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

function seoblock_theme() {
return array(
'seoblock' => array(
'arguments' => array('tic' => $tic, 'alexa' => $alexa, 'pr' => $pr),
'template' => 'seoblock',
),
);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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