HOOKS

HOOKS

Vad är hooks?

Hooks är ett sätt för oss att modifiera beteende i Drupal core eller Moduler utan att ändra i originalfilerna.

Drupal själva definierar det kort såhär

Specially-named functions that a module defines, which are discovered and called at specific times, usually to alter behavior or data.

Så vad låter då hooks oss att göra?

Reagera på en händelse

  • En användare loggar in/ut

  • Innehåll sparas

Modifiera befintliga strukturer

  • Lägga till nya element till ett formulär innan det visas

  • Ändra värdet för ett tema innan det renderas

Registrera ny funktionalitet

  • Registrera template filer

  • Registrera hjälptext

Hur ser en hook ut?


function hook_user_login(Drupal\user\UserInterface $account) {}

Startar alltid med hook

Har oftast med modulens namn

Hur använder jag en hook i min .module fil?


function hook_user_login(Drupal\user\UserInterface $account) {}

function min_modul_user_login(Drupal\user\UserInterface $account) {}

Hook ersätts med namnet på våran modul

Va hittar jag information om hooks?

  • Drupals API dokumentation

  • *.api.php filer i moduler

  • Google!

Hooks vi kommer att titta lite närmre på idag

hook_node_presave

Anropas innan en nod sparas. En nod är innehåll på sajten som t.ex en Artikel.

hook_user_login

Anropas när en användare loggar in.

hook_form_FORM_ID_alter

Anropas när ett formulär byggs och låter oss modifiera strukturen.

hook_theme

Används för att registrera nya templates.

hook_node_presave()


/**
 * Implements hook_node_presave().
 */
function example_hooks_node_presave(Drupal\Core\Entity\EntityInterface $node) {

  $node->setTitle('I change all the titles before save!');

}

hook_user_login()


/**
 * Implements hook_user_login().
 */
function example_hooks_user_login(Drupal\user\UserInterface $account) {
  
  $message = 'Welcome back @username, nice to see you again!';

  drupal_set_message(new TranslatableMarkup($message, [
    '@username' => $account->getUsername(),
  ]));
}

hook_form_FORM_ID_alter()


/**
 * Implements hook_form_FORM_ID_alter().
 */
function example_hooks_form_user_login_form_alter(&$form, $form_state, $form_id) {

  $title = new TranslatableMarkup('Remember me');
  $description = new TranslatableMarkup('Please remember me for two weeks.');
  
  $form['remember_me'] = [
    '#type' => 'checkbox',
    '#title' => $title,
    '#description' => $description,
  ];
}

FORM_ID Ersätts med maskin-namnet på formuläret, i detta fallet "form_user_login".

hook_theme()


/**
 * Implements hook_theme().
 */
function example_templates_theme() {
  return [
    'example_theme_test' => [
      'variables' => [
        'text' => null,
      ],
    ];
};

Maskin-namn på vår template

Variabler som finns tillgängliga i vår template och som kan skickas in utifrån via en render array.

Från hook_theme() till template


/**
 * Implements hook_theme().
 */
function example_templates_theme() {
  return [
    'example_theme_test' => [
      'variables' => [
        'text' => null,
      ],
    ];
};

I hook_theme() definierar vi våran templates maskin-namn med understreck men vår template-fil ska ha bindestreck. Alla template filer i Drupal ska ha .html.twig på slutet.

Hur ser template filen ut?


{% if text %}
  <div class="text-wrapper">
    {{ text }}
  </div>
{% endif %}

Variabeln vi definierade i vår hook_theme() tidigare.


/**
 * Implements hook_theme().
 */
function example_templates_theme() {
  return [
    'example_theme_test' => [
      'variables' => [
        'text' => null,
      ],
    ];
};

Snabb repetition av TWIG

{% if text %}
  <div class="text-wrapper">
    {{ text }}
  </div>
{% endif %}
{% if colors %}
  <ul class="colors">
    {% for color in colors %}
      <li class="color color-{{ color|lower }}">
        {{ color }}
      </li>
    {% endfor %}
  </ul>
{% endif %}
{{ text }}

Skriva ut en variabel

Statements

Loopar

Läs mer om TWIG på

http://twig.sensiolabs.org/documentation

Live kod!

Dagens övningar

Drupal 8 Hooks

By Christoffer Palm