УрокСоздаём простой модуль с нуля
Не так давно я рассказывал как сделать свои табы. И тогда же обещал рассказать как оформить это в модуль вместо функции. Выполняю своё обещание - перед вами урок по созданию модуля, который автоматически создаст блок с табами.
Назовём модуль myTabs.
Модуль, как и тема, в обязательном порядке содержит info-файл. Он будет называться mytabs.info. Для нашего модуля его содержимое будет выглядеть так:
name = myTabs
description = my first module with tabs
core = 6.x
Всё просто - имя, описание модуля, и ядро друпала, под которое модуль написан.
Теперь создаём файл mytabs.module - основной файл модуля, в котором описаны основные функции, выполняемые для работы модуля. Из него можно подключать другие файлы, но т.к. наш модуль маленький, то за рамки этого файла мы выходить не будем.
Теперь о содержимом mytabs.module:
<?php /** * Implementation of hook_block(). */ function mytabs_block($op = 'list', $delta = 0, $edit = array()) { switch ($op) { case 'list': //так будет блок выглядеть в разделе /admin/build/block $block[0]['info'] = t('Block with tabs'); $block[0]['cache'] = BLOCK_CACHE_GLOBAL; return $block; case 'configure': //так будет блок выглядеть при его настройке $form['news_amount'] = array( '#type' => 'textfield', '#title' => t('Amount of news titles'), '#default_value' => variable_get('news_amount', 5), ); $form['afisha_amount'] = array( '#type' => 'textfield', '#title' => t('Amount of afisha titles'), '#default_value' => variable_get('afisha_amount', 5), ); return $form; case 'save': // когда в настройках блока жмём "сохранить" происходит следующее: // сохраняются в базу данных переменные news_amount и afisha_amount variable_set('news_amount', (int)$edit['news_amount']); variable_set('afisha_amount', (int)$edit['afisha_amount']); break; case 'view': //при просмотре блока подключаем его css и js drupal_add_css(drupal_get_path('module','mytabs') . '/mytabs.css'); drupal_add_js(drupal_get_path('module','mytabs') . '/mytabs.js'); //заголовок блока делаем пустым $block['subject'] = ''; //содержимое получаем из функции mytabs_get_content() $block['content'] = mytabs_get_content(); return $block; } } /** * Функция возвращает содержимое блока с табами */ function mytabs_get_content() { // Получаем значение переменных, хранящих количество выводимых // новостей и афиш. Если переменная не задана - то это значение равно 5 $news_amount = variable_get('news_amount', 5); $afisha_amount = variable_get('afisha_amount', 5); // Получаем заголовки для типа материала news и afisha соответственно $news = mytabs_get_titles('news', $news_amount); $afisha = mytabs_get_titles('afisha', $afisha_amount); // Создаём html-структуру для наших табов, в которую заносим наши // списки с заголовками $afisha и $news $output = ' <div id = "tabs"> <div class = "header"> <div class = "news active">' . t('News') . '</div> <div class = "afisha">' . t('Afisha') . '</div> </div> <div class = "body"> <div class = "news-content">' . $news . '</div> <div class = "afisha-content" style = "display: none;">' . $afisha . '</div> </div> </div>'; return $output; } /** * Функция возвращает список материалов заданного типа */ function mytabs_get_titles($type, $n) { // Запрос к базе данных, который получает nid и title последних $n статей из заданного типа материала $result = db_query_range('SELECT title, nid FROM {node} WHERE type = "%s" AND status = 1 ORDER BY created DESC', $type, 0, $n). // Обрабатываем данные, которые мы получили в результате запроса $links = array(); while ($node = db_fetch_object($result)) { // В массив ложим ссылку на материал $links[] = l($node->title, 'node/' . $node->nid); } // Возвращаем список материалов return theme('item_list', $links); }
Все комментарии в коде, так что я думаю разобраться можно что есть что :) Всё - несложный модуль готов. Конечно, не самый кошерный вариант. Ещё было бы неплохо вынести шаблон табов в отдельный файл для возможности перекрытия его в теме, но об этом в следующих уроках. А пока наслаждаемся модулем табов :)
- Spleshka
- 01.11.2010
- 13766
Комментарии
А существует ли готовый модуль для организации личного портфолио каждого пользователя? если нету, сложно ли организовать ?
Есть модуль по созданию личных профилей. Буквально завтра-послезавтра будет готов видеоурок на эту тему. Возможно, это именно то что тебе надо
Очень буду ждать
Круто! :YAHOO:
Сейчас буду разбиратся, спасибо :)
Да, классный урок. Сам думаю попробовать один вроде бы простенький модуль написать. Но, правда, не думаю что это будет просто(
Приветствую. Спасибо за уроки! Очень хорошо написаны и полезны.
Вопрос такой:
Я использую модуль Organic Group. Появилась необходимость создать табы (Новости, События, Проекты...) в каждой из групп. Как создать для одной группы понятно (как в уроке), а чтобы в каждой группе свои новости, события, проекты открывались не могу разобраться. Понятно, что скорее всего, разбираться надо с аргументами. В принципе, возможно сделать с помощью views все, но хотелось бы модулем или функциями. В коде модуля каким-то образом при выборке заголовков из БД можно указывать условие что-то вроде WHERE node.type IN ('groups') AND node.nid = og.nid (что видимо должно передаваться аргументом)? Или вообще не в ту степь копаю? :)
Надеюсь вопрос понятен)
Спасибо.
У вас в скрипте куча ошибок
Например?
Где модулю отображается в админке?
Нигде, это модуль без админки.
Теперь создаём файл mytabs.module - основной файл модуля, в котором описаны основные функции, выполняемые для работы модуля. Из него можно подключать другие файлы, но т.к. наш модуль маленький, то за рамки этого файла мы выходить не будем.
А разве нельзя перечислить загружаемые файлы в .info ?
1 абзац - цитата
Комментировать