Создаем страничный контент модуля.

Главные вкладки

Аватар пользователя player player 11 декабря 2007 в 15:02

Теперь у нас с вами есть работающий блок и страница настроек. Блок отображает ограниченное количество ссылок. Тем не менее ссылок у нас может быть намного больше. Так давайте теперь создадим страницу, которая будет отображать ссылки, на весь добавленный, за прошедшую неделю, контент.
function onthisdate_all() {} .
Это функция не является хуком. Мы здесь будем использовать много кода из нашего блока. Попросту говоря почти его скопируем.
Если мы захотим использовать эту функцию из другого модуля, надо будет использовать стандартную схему имен modulename_action. Функция может быть вызвана с помощью module_invoke. Если же мы хотим сделать функцию закрытой и доступной только в пределах своего модуля, то тогда необходимо перед именем функции поставить _ подчеркивание.
<?php
function onthisdate_all() {
// переменная контента которая будет выведена на экран
$page_content = '';

// получаем сегодняшнюю дату
$today = getdate();

// считаем полночь неделю назад
$start_time = mktime(0, 0, 0, $today['mon'], ($today['mday'] - 7), $today['year']);

// считаем день
$end_time = $start_time + 86400;

$query = "SELECT nid, title, created FROM " .
"{node} WHERE created >= '" . $start_time .
"' AND created <= '". $end_time . "'";

// получаем ссылки (не отсортированы по рангу)
$queryResult = db_query($query);
while ($links = db_fetch_object($queryResult)) {
$page_content .= l($links->title, 'node/'.$links->nid).'
';
}
...
}
?>

Ну и допишем проверку на вывод.

<?php
function onthisdate_all() {

...

// проверяем есть ли контент
if ($page_content == '') {
// нет контента недельной давности
$page_content = "Нет контента";
}

return $page_content;
}
?>

После этого надо обьявить друпалу о новой функции. Делать мы будем это с помощью hook_menu.
Этот хук устанавливает ассоциации между URL и функцией создающей контент.

<?php
function onthisdate_menu() {

$items = array();

//это было уже написано ранее
$items[] = array(
'path' => 'admin/settings/onthisdate',
'title' => t('On this date module settings'),
'callback' => 'drupal_get_form',
'callback arguments' => 'onthisdate_admin',
'access' => user_access('access administration pages'),
'type' => MENU_NORMAL_ITEM,
);

//это надо добавить
$items[] = array(
'path' => 'onthisdate',
'title' => t('on this date'),
'callback' => 'onthisdate_all',
'access' => user_access('access onthisdate content'),
'type' => MENU_CALLBACK
);

return $items;
}
?>

Работает это так: пользователь идет на страницу http://.../onthisdate где отображается контент генерируемый onthisdate_all. Тип MENU_CALLBACK сообщает друпалу о том, что ссылку в меню пользователя отображать не надо. Для того что-бы пользователь видел ссылку в навигационном блоке используйте MENU_NORMAL_ITEM.
Хук меню может проверять права доступа перед отображением страницы модуля. Индекс 'access' это массив прав доступа.
Теперь просто включим наш модуль и посмотрим на /onthisdate (или ?q=onthisdate)
P.S.
Прошу меня поправить если что.

<<<< Создаем настройки модуля. <<<<

Комментарии

Аватар пользователя Гость Гость (не проверено) 28 февраля 2008 в 16:16

если честно - мне как постороннему человеку ничего из этих кусков непонятно.
можно ли опубликовать архив с модулем? чтобы можно было покопаться в цельном коде всех частей модуля...
кроме того очень неудобно делать копипасты - потому что везде лезут номера строк, попробуйте сами.

Аватар пользователя player player 28 февраля 2008 в 17:51

Из личного опыта... "...используя копи паст или другие методы выдирания кода эффективность обучения, а также его осмысленность существенно понижаются..."

Аватар пользователя zardoz zardoz 15 февраля 2010 в 3:04

а нет примера создания модуля с файлом module_name.install Что бы в нём создавалась таблицы базы для нашего модуля? Я вот пытался поколупать один модуль, но при установке моего тестового модуля таблицы не созадются почему то((( Или таблицы создаются при первом использовании модуля в работе?