В прошлом уроке мы создали модуль выводящий некоторую информацию в блок, модуль получился крайне сырой, давайте его улучшим. Названия хуков ссылаются на описание в 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);
Урок получился небольшой, но надеюсь познавательный, оставайтесь на связи -)
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Комментарии
Максим (чт, 2010-04-29 14:49)
Довольно непросто писать модуль для друпал.
RemaGe (сб, 2010-05-01 12:00)
Действительно -)
An43 (чт, 2010-05-06 11:38)
Звучит как: "Довольно непросто иметь мозг" :)
RemaGe (чт, 2010-05-06 13:51)
или как "довольно непросто им пользоваться" -)
Guron (пн, 2010-06-14 11:27)
Отличные уроки, автору очень большое спасибо.
Так же хорошая ссылка про формы. очень много понятно сразу становится, с каждым днем все больше и больше нравится друпал.
Виктор 78 (пн, 2010-07-19 17:10)
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 к чему относится?
НУ а третье - это название темплэйта, это ясно из контекста. АА вот куда пихать этот темплэйт? В папку с темой? В модуль?
Заранее спасибо.
Peter (ср, 2010-07-28 18:53)
Здравствуйте. Можете показать пример работы с БД (запись, чтение) для модуля Drupal. Заранее очень благодарен.
Неизвестный (сб, 2010-08-28 22:55)
Не проработали вы этот урок вообще. Куда файл с шаблоном пихать, что где означает... ничего не объяснили.
RemaGe (вт, 2010-08-31 10:46)
Уроки не самостоятельны, они составляют курс, каждый новый урок пишется с оглядкой на прошлые.
set (пн, 2010-09-13 20:40)
Спасибо вам большое за уроки! :) очень нравятся :) планируете продолжать?
RemaGe (вт, 2010-09-14 11:01)
Незачто, планирую -)
2 находятся в написании -) Только нехватает времени и желания)
set (пт, 2010-09-17 12:26)
Ну, проблема со временем общеизвестна и понятно, а что за проблема с желанием? :) мотивации не хватает или кто-то\что-то отбивает это желание?
set (пт, 2010-09-17 12:29)
я вот даже зарегался у вас на сайте, так мне ваши уроки понравились :)
set (пт, 2010-09-17 17:37)
Большая просьба - для скриншотов не используйте жпег... это просто издевательство над глазами... по-возможности, используйте png-24
Чаус Константин (вт, 2011-07-05 01:51)
Помогите, плиз!
В функции seoblock_data
не работает функция theme('seoblock', $tic, $alexa, $pr);
уже пробовал theme('seoblock', "1", "1", "1");
а вот так $output="TEST" выводит соотв. TEST, тоесть не работает именно theme();
функция seoblock_theme() и файл seoblock.tpl.php (в директории модуля) есть.
В чем может быть проблема? Помогите плиз, очень уж хочу разделить функционал от отображения. Заранее спасибо!