Tworzenie modułów dla CMS Drupal 6, cz. 2
Pierwszy hook, który zostanie opisany to hook_init. Hook ten jest wykonywany przy każdym wywołaniu strony. Można w nim np.: zmieniać ustawienia globalnych zmiennych, dodawać pliki CSS i JS.
/** * Implements hook_init(). */ function mymodule_init() { // Switch theme to default for non administrators. if (arg(0) == 'admin') { if (!user_access('access administration pages')) { global $custom_theme; $custom_theme = variable_get('theme_default', ''); } } }
Powyższy kod jest przydatny, jeśli używamy innej skórki dla stron administracyjnych niż domyślna skórka systemu. Kod ten zmienia skórkę na domyślną, jeśli użytkownik bez uprawnień 'access administration pages' będzie próbował wejść na strony /admin/*.
Funkcje użyte w kodzie:
- arg($index) - zwraca komponent drupalowego adresu url, przykładowa ścieżka: admin/settings/performance:
- arg(0) - admin
- arg(1) - settings
- arg(2) - performance
- arg() - zwraca tablicę z elementami adresu
- user_access($permission) - sprawdza czy aktualnie zalogowany użytkownik ma przypisane uprawnienia $permission
- variable_get($name, $default) - pobiera wartość zmiennej drupalowej z bazy danych
- global $custom_theme - nazwa zmiennej globalnej służącej do nadpisania ustawień domyślnego szablonu
Kolejną często używaną funkcją w Drupalu jest drupal_set_message($message).
/** * Implements hook_init(). */ function mymodule_init() { // Switch theme to default for non administrators. if (arg(0) == 'admin') { if (!user_access('access administration pages')) { global $custom_theme; $custom_theme = variable_get('theme_default', ''); } } drupal_set_message(t('Hello')); }
Powyższy wpis w hook_init spowoduje, że na każdej stronie zobaczymy wiadomość "Hello" w sekcji wiadomości drupalowych.
W tworzeniu modułów bardzo przydatna jest funkcja print_r($variable). Funkcja ta wypisuje wszystkie elementy złożonych zmiennych (tablic i obiektów).
/** * Implements hook_init(). */ function mymodule_init() { drupal_set_message('
'.print_r(arg(), TRUE).'
'); }
Powyższy kod wyświetli zawartość tablicy zwracanej przez funkcję arg(), czyli listę elementów, z których składa się aktualny adres URL.
Utworzymy teraz nowy moduł o nazwie Developerhelper. Dodamy w nim kilka funkcji przydatnych w czasie tworzenia serwisu internetoweg. Dobrym rozwiązaniem jest utworzenie katalogu sites/all/modules/developer i umieszczanie w nim wszystkich modułów, które są potrzebne tylko na czas tworzenia serwisu. Na serwerze produkcyjnym możemy wszystkie moduły z tego katalogu wyłączyć.
Tworzymy katalog sites/all/modules/develeper/developerhelper a w nim dwa pliki: developerhelper.info i developerhelper.module. Zawartość pliku developerhelper.info:
name = Developer helper description = Functions for developers core = 6.x package = Development version = 6.x-1.0-beta1
Zawartość pliku developerhelper.module zaczynamy od hook_help - tak powinien się zaczynać każdy moduł Drupalowy. Zawartość pliku:
<?php /** * @file * Main module file. */ /** * Implements hook_help(). */ function developerhelper_help($path, $arg) { switch ($path) { case 'admin/help#developerhelper': $output = '
' . t('Developer helper module') . '
'; return $output; } }
Dodamy teraz hook_init dla tego modułu:
/** * Implements hook_init(). */ function developerhelper_init() { // Show debug messages. if (variable_get('developerhelper_enabled', 0)) { drupal_set_message('
'.print_r(arg(), TRUE).'
'); } }
Funkcje do zarządzania zmiennymi drupalowymi:
- variable_get($name, $default) – pobiera zmienną z systemu
- variable_set($name, $value) – ustawia wartość zmiennej systemowej
- variable_del($name) – usuwa zmienną systemową
Wartości zmiennych są przechowywany w bazie danych w tabeli "variable", można np za pomocą phpMyAdmin zobaczyć ich wartości.
Utworzymy teraz stronę administracyjną. Do tworzenia nowych stron w drupalu używany jest hook_menu:
/** * Implements hook_menu(). */ function developerhelper_menu() { $items = array(); $items['admin/settings/developerhelper'] = array( 'title' => 'Developer helper settings', 'page callback' => 'drupal_get_form', 'page arguments' => array('developerhelper_settings_form'), 'access arguments' => array('administer site configuration'), 'file' => 'developerhelper.admin.inc', ); return $items; }
- admin/settings/developerhelper - adres nowej strony
- 'page callback' => 'drupal_get_form', - nazwa funkcji, która będzie wywołana po otworzeniu strony
- 'page arguments' => array('developerhelper_settings_form'), - argumenty przekazywany do powyższej funkcji, tu jest to nazwa formularza (funkcji z formularzem)
- 'file' => 'developerhelper.admin.inc', - plik, w którym jest zdefinowana funkcja z formularzem
Należy teraz utworzyć plik developerhelper.admin.inc i w nim umieścić definicję funkcji developerhelper_settings_form:
<?php /** * @file * Settings file. */ /** * Module settings. * * @return * Form. */ function developerhelper_settings_form() { $form = array(); $form['developerhelper_enabled'] = array( '#type' => 'radios', '#title' => t('Enable devel messages'), '#default_value' => variable_get('developerhelper_enabled', 0), '#options' => array( 0 => t('Disabled'), 1 => t('Enabled'), ), ); return system_settings_form($form); }
Użyto tutaj nowej funkcji system_settings_form($form). Funkcja ta dodaje domyślne przyciski submit do formularza oraz zapisuje wartości z formularza w zmiennych systemowych o nazwach takich samych jak elementy formularza (tutaj w zmiennej o nazwie developerhelper_enabled). W tej funkcji jest tworzony prosty formularz z elementem typu "radios". Pełna dokumentacja dla formularzy dostępna jest na stronie http://api.drupal.org/api/drupal/developer%21topics%21forms_api_reference.html/6
Mamy już gotowy prosty moduł. Możemy go teraz włączyć i przejść do strony 'admin/settings/developerhelper gdzie znajdzie się formularz umożliwiający włączenie wyświetlania informacji w hook_init.
Po dwóch częściach opisu tworzenia modułów dla Drupala powinieneś umieć wykonać proste moduły. Pamiętaj, że wiele informacji znajdziesz w serwisie www.drupal.org - jest tam potężna dokumentacja i rozwiązania wielu częstych problemów programistycznych. http://drupal.org/project/examples - to specjalny moduł z przykładami, znajdziesz tu wiele pomocy przy tworzeniu modułów.
Pisanie modułów dla Drupala 7 jest podobne. Informacje o konwersji modułów z Drupala 6 do 7 znajdziesz na stronie http://drupal.org/node/224333
Jeśli szukasz pomocy, zgłoś się do nas. Jesteśmy agencją drupalową i specjalizujemy się we wsparciu drupala. Chętnie pomożemy.
Czy będzie kolejna część kursu? Zobaczymy :)