УрокСоздаём простой модуль с нуля

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

Назовём модуль 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);
}

Все комментарии в коде, так что я думаю разобраться можно что есть что :) Всё - несложный модуль готов. Конечно, не самый кошерный вариант. Ещё было бы неплохо вынести шаблон табов в отдельный файл для возможности перекрытия его в теме, но об этом в следующих уроках. А пока наслаждаемся модулем табов :)

Комментарии

Аватар пользователя Тайный поклонник
Тайный поклонник написал:

А существует ли готовый модуль для организации личного портфолио каждого пользователя? если нету, сложно ли организовать ?

04.11.2010 15:29
Аватар пользователя Spleshka
Spleshka написал:

Есть модуль по созданию личных профилей. Буквально завтра-послезавтра будет готов видеоурок на эту тему. Возможно, это именно то что тебе надо

04.11.2010 17:29
Аватар пользователя Тайный поклонник
Тайный поклонник написал:

Очень буду ждать

05.11.2010 01:05
Аватар пользователя AK47
AK47 написал:

Круто! :YAHOO:
Сейчас буду разбиратся, спасибо :)

05.11.2010 16:25
Аватар пользователя D.Choomc
D.Choomc написал:

Да, классный урок. Сам думаю попробовать один вроде бы простенький модуль написать. Но, правда, не думаю что это будет просто(

09.11.2010 21:35
Аватар пользователя Oleg I. Kudryavcev
Oleg I. Kudryavcev написал:

Приветствую. Спасибо за уроки! Очень хорошо написаны и полезны.
Вопрос такой:
Я использую модуль Organic Group. Появилась необходимость создать табы (Новости, События, Проекты...) в каждой из групп. Как создать для одной группы понятно (как в уроке), а чтобы в каждой группе свои новости, события, проекты открывались не могу разобраться. Понятно, что скорее всего, разбираться надо с аргументами. В принципе, возможно сделать с помощью views все, но хотелось бы модулем или функциями. В коде модуля каким-то образом при выборке заголовков из БД можно указывать условие что-то вроде WHERE node.type IN ('groups') AND node.nid = og.nid (что видимо должно передаваться аргументом)? Или вообще не в ту степь копаю? :)
Надеюсь вопрос понятен)
Спасибо.

07.04.2011 19:48
Аватар пользователя Ананий
Ананий написал:

У вас в скрипте куча ошибок

05.12.2011 18:01
Аватар пользователя Spleshka
Spleshka написал:

Например?

05.12.2011 20:31
Аватар пользователя TaRaNTuL
TaRaNTuL написал:

Где модулю отображается в админке?

10.02.2012 12:29
Аватар пользователя Spleshka
Spleshka написал:

Нигде, это модуль без админки.

10.02.2012 13:34
Аватар пользователя lIME
lIME написал:

Теперь создаём файл mytabs.module - основной файл модуля, в котором описаны основные функции, выполняемые для работы модуля. Из него можно подключать другие файлы, но т.к. наш модуль маленький, то за рамки этого файла мы выходить не будем.
А разве нельзя перечислить загружаемые файлы в .info ?

28.05.2014 16:01
Аватар пользователя LIME
LIME написал:

1 абзац - цитата

28.05.2014 16:03

Комментировать