Dokumentace:
Nástroje:
Tipy:
Při vytváření modulů bývá velmi užitečným pomocníkem modul Devel.
Váhy základních fází průběhu zpracovávání v Drupalu (bližší informace viz např. funkce theme):
Minimální adresářová strura:
Uvědomte se rozdíly mezi pojmy:
Hooks (háčky) můžeme chápat např. jako speciálně pojmenované PHP funkce. U vyhledané funkce nahraďte slovo hook_...
za název modulu např. my_module_...
např.:
hook_install() => my_module_install()
hook_enable() => my_module_enable()
hook_disable() => my_module_disable()
Pro vytvořeního vlastního modulu, který má zobrazovat nějaký blok(y) jsou třeba minimálně dva hooky:
hook_block_info() => my_module_info()
hook_block_view() => my_module_view()
Při tvorbě bloku pomocí modulu je vhodné projít si demonstrační kód viz block_example.module.
Pro jednoduché uložení a získání dat je možné využít databázovou tabulku variable a funkce variable_set() a variable_get().
Globálné proměnné např. o uživateli je možné získat zápisem:
global $user;
Textové řetězce je nutné zapisovat do funkce t()
.
stylesheets[all][] = my_module.css stylesheets[screen][] = my_module_screen.css stylesheets[print][] = my_module_print.css
scripts[] = my_module.js
/** * Implementation of hook_init(). */ function my_module_init() { $path = drupal_get_path('module', 'my_module'); drupal_add_css($path . '/my_module.css'); drupal_add_js($path . '/my_module.js'); }
/** * Implementation of hook_init(). */ function my_module_init() { drupal_add_css('body {background: #ccc;}', array('group' => CSS_THEME, 'type' => 'inline')); }
Tipy:
/** * Implements hook_preprocess_block() */ function <your-module-name>_preprocess_block(&$vars) { /* Set shortcut variables. Hooray for less typing! */ $block_id = $vars['block']->module . '-' . $vars['block']->delta; $classes = &$vars['classes_array']; $title_classes = &$vars['title_attributes_array']['class']; $content_classes = &$vars['content_attributes_array']['class']; /* Add global classes to all blocks */ $title_classes[] = 'block-title'; $content_classes[] = 'block-content'; /* Uncomment the line below to see variables you can use to target a field */ #print $block_id . '<br/>'; /* Add classes based on the block delta. */ switch ($block_id) { /* System Navigation block */ case 'system-navigation': $classes[] = 'block-rounded'; $title_classes[] = 'block-fancy-title'; $content_classes[] = 'block-fancy-content'; break; /* Main Content block */ case 'system-main': $classes[] = 'clearfix'; break; // Adding the same classes to more blocks – Grouping cases togheter /* Main Menu block */ case 'system-main-menu': /* User Login block */ case 'user-login': $title_classes[] = 'element-invisible'; break; } }
/** * Implements HOOK_entity_view(). * Limit Teaser to display only the first image of a multiple field. */ function <your-module-name>_entity_view($entity, $type, $view_mode, $langcode) { if($entity->type == 'story' && $view_mode == 'teaser') { //kpr($entity); $entity->content['field_image']['#items'] = array_slice($entity->content['field_image']['#items'], 0, 1); } }
/** * Implements hook_form_FORM_ID_alter(). */ function <your-module-name>_form_node_form_alter(&$form, $form_state) { // Set “Publishing options” vertical tab as default for node edit page. $form['additional_settings']['#default_tab'] = 'edit-options'; // Where 'edit-options' is fieldset ID. }
function <your-module-name>_node_presave($node) { if (user_is_anonymous()) $node->status = FALSE; // means unpublished }
$inline_script = " <!-- My JavaScript --> <script> // JS Content </script> <noscript> // No Script </noscript> <!-- End My JavaScript --> "; $element = array( '#type' => 'markup', '#markup' => $inline_script, ); drupal_add_html_head($element, 'my-javasript');