Vlastní modul

Drupal 8

Dokumentace:

  • drupal.org/developing/modules/8
    (befused.com/drupal/first-drupal8-module)

Nástroje:

  • PhpStorm
  • drupal.org/project/console

Tipy:

  • blinkreaction.com/blog/video-and-blog-tutorial-programmatically-creating-a-block-in-drupal-8 (PhpStorm)
  • webomelette.com/drupal-8 (2015)
  • sitepoint.com/series/how-to-build-a-drupal-8-module (2014)
  • drupalwoo.com/content/blog/my-first-drupal-8-module (2014)
  • getlevelten.com/blog/ian-whitcomb/drupal-8-module-development-part-1-getting-started (2013)
  • sitepoint.com/how-to-build-multi-step-forms-in-drupal-8

Drupal 7

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):

  1. MODULE_preprocess(&$variables, $hook) – "nejnižší" priorita
  2. MODULE_preprocess_HOOK(&$variables)
  3. THEME_preprocess(&$variables, $hook)
  4. THEME_preprocess_HOOK(&$variables)
  5. MODULE_process(&$variables, $hook)
  6. MODULE_process_HOOK(&$variables) – "nejvyšší" priorita

Vytvoření vlastního mini modulu

Minimální adresářová strura:

  • my_module/
    • my_module.info
    • my_module.module (seznam vhodných hooks)
    • (my_module.install – použije se pouze při prvním zapnutí modulu)

Uvědomte se rozdíly mezi pojmy:

  1. instalace modulu – aplikuje se pouze při prvním zapnutí modulu (např. vytovří tabulky v databázi)
  2. zapnutí modulu – umožňuje modul používat a upravovat jeho nastavení
  3. vypnutí modulu – zachová nastavené hodnoty
  4. odinstalace modulu – umožňuje např. odstranit tabulky v databázi

Hooks

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()

Bloky

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()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().

Formátování zdrojového kódu

  • funkce se zapisují malými písmeny
  • počátení { se píše za názvem funkce, ukončující } se píše smostatn na novém řádku
  • pro odsazení se používají 2 znaky

Možnosti připojení CSS a JavaScriptu

  • my_module.info
    • stylesheets[all][] = my_module.css
      stylesheets[screen][] = my_module_screen.css
      stylesheets[print][] = my_module_print.css
    • scripts[] = my_module.js
  • my_module.module
    • /**
      * 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');
      }
    • nebo inline styl vkládaný přímo do hlavičky stránky (užitečné např. pro dynamické CSS)
    • /**
      * Implementation of hook_init().
      */
      function my_module_init() {
        drupal_add_css('body {background: #ccc;}', array('group' => CSS_THEME, 'type' => 'inline'));
      }
      

Tipy:

  • Přidání vlastních CSS tříd do bloků (případně moduly Skinr , Fusion Accelerator a Block Class)
  • /**
    * 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;
      }
    }
  • Zobrazení pouze prvního obrázku v úvodníku
  • /**
    * 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);
      }
    }
  • Nastavení výchozí vertikální záložky při editaci uzlu
  • /**
    * 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.
    }
  • Presave status
  • function <your-module-name>_node_presave($node) {
      if (user_is_anonymous()) $node->status = FALSE; // means unpublished
    }
  • Přidání vlastního inline scriptu
  • $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');
  • One node redirect