Пишем модуль под Drupal. Часть 5. Хук пермишен и файл инсталляции

вт, 06.04.2010 13:30 :: olk

Помните, в начале статьи я говорил о том, что мы добавим несколько «фич» к нашему трэкеру:

  • возможность не показывать конкретный материал (в независимости от типа)
  • возможность закрепить материал вверху списка.
Причем эту возможность мы дадим не всем пользователям, а только пользователям с определенными ролями. Поэтому настала пора определить хук perm.
Данный хук определяет права доступа пользователя. После реализации хука на странице прав доступа пользователей появится возможность разрешить или запретить определенные действия, выполняемые модулем. Для проверки права доступа используется функция user_access().

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

  • Разрешение на запрет размещение ноды в трэкере
  • Разрешение на закрепление ноды вверху списка трэкера.

Шаг номер 11: Определим наш хук perm следующим образом:

данный хук должен быть расположен в главном файле модуля cctracker.module

  1. function cctracker_perm() {
  2.   return array('access not place cctracker', 'access sticky cctracker');
  3. }
Следующим шагом нам надо определиться, где хранить данные о ноде с нашими дополнительными настройками. Логично предположить, что нам понадобится своя таблица в базе данных со связкой один к одному к таблице node. Для создания данной таблицы нам надо разобраться еще с одним важным файлом в системе построения модулей под Друпал. Название этого файла строится как - имя_модуля.install, или в нашем случае cctracker.install.
Как видно из расширения, данный файл отвечает за процесс инсталляции и деинсталляции модуля в системе (а также за процесс обновления модуля).

Шаг номер 12: Определяем схему нашей таблицы, она достаточно проста

Функция cctracker_schema тоже является хуком, который используется при выполнении функций drupal_install_schema/drupal_uninstall_schema

Для определения таблиц используется Scheme API, которое позволяет модулю определить свою(и) таблицу(ы) в базе данных и обеспечивает функции API для создания, удаление и изменение таблицы, столбцов, ключей и индексов.

  1. <?php
  2. // $Id$
  3. /**
  4.  * File: cctracker.install
  5.  * Install/uninstall module cctracker.
  6.  */
  7.  
  8. function cctracker_schema() {
  9.   $schema['node_cctracker'] = array(
  10.     'fields' => array(
  11.       'nid' => array(
  12.         'type' => 'int',
  13.         'unsigned' => TRUE,
  14.         'not null' => TRUE,
  15.         'default' => 0,
  16.        ),
  17.       'cc_sticky' => array(
  18.         'type' => 'int',
  19.         'unsigned' => TRUE,
  20.         'not null' => TRUE,
  21.         'default' => 0,
  22.        ),
  23.       'cc_sticky_weight' => array(
  24.         'type' => 'int',
  25.         'not null' => TRUE,
  26.         'default' => 0,
  27.        ),
  28.       'cc_not_public' => array(
  29.         'type' => 'int',
  30.         'unsigned' => TRUE,
  31.         'not null' => TRUE,
  32.         'default' => 0,
  33.        ),
  34.     ),
  35.     'indexes' => array(
  36.       'cc_sticky'        => array('cc_sticky','cc_sticky_weight'),
  37.       'cc_not_public'    => array('cc_not_public'),
  38.     ),
  39.     'primary key' => array('nid'),
  40.   );
  41.   return $schema;
  42. }
Имя создаваемой таблицы определяется именем ключа в массиве $schema. Кстати, в хуке scheme можно определить более одной таблицы.

Основной хук в используемый в данном файле это хук install

Этот хук будет вызван, когда модуль впервые активирован на странице настройки модулей. Наиболее типичным применением для хука install является создание таблиц, используемых в модуле.

Также мы используем хук uninstall , который запускается во время удаления модуля (не деактивации модуля а именно удаления)

Хорошей практикой считается «подчищать» за собой все переменные и таблицы, которые создал ваш модуль, в момент его удаления из системы.

Шаг номер 13: Добавляем два хука - install и uninstall в файл cctracker.install.

  1. function cctracker_install() {
  2.   // Создаем таблицу.
  3.   drupal_install_schema('cctracker');
  4.   // понизим вес нашего модуля в системе
  5.   // нечего ему выполнятся в начале цепочки вызова хуков
  6.   db_query("UPDATE {system} SET weight = 10 WHERE name = 'cctracker'");
  7. }
  8.  
  9. function cctracker_uninstall() {
  10.   // Удаляем таблицу
  11.   drupal_uninstall_schema('cctracker');
  12.   // подчищаем за собой (удаляем переменные из таблицы variable созданные нашим модулем
  13.   db_query("DELETE FROM {variable} WHERE  name LIKE 'cctracker%%'");
  14. }
Теперь на странице настройки модулей отключите (если он у вас был включен) и удалите модуль cctracker, за тем опять активируйте модуль. В вашей базе данных должна появится таблица node_cctracker (если вы используете префикс в базе, то соответственно {префикс}_node_cctracker). Не забываем повторить настройку модуля, так как во время удаления модуля все настройки нашего модуля хранящиеся в таблице variable были удалены.
Добавить комментарий
« Добавить комментарий
» Добавить комментарий