Jak stworzyć własny moduł w Drupalu 8 lub 9

Na żywym przykładzie pokazuję jak zrobić własny moduł do CMS Drupal 8 lub 9

  • Moduł examples jako baza wyjściowa
  • Struktura modułu
  • Tworzenie własnego bloku
  • Deklaracja własnego pliku twig (templates)
  • Wyświetlanie danych w twig

Wersja do oglądania

Moduł umieszcza się w katalogu modules/custom i tam tworzysz katalog z nazwą własnego modułu, w moim przypadku block_custom

Plik block_custom.info.yml

W nim znajduje się definicja naszego modułu, jest to jedyny wymagany plik do tego by stworzyć moduł

name: Block Custom
type: module
description: Demonstrates how a module can define blocks.
package: Custom Blocks
core: 8.x
core_version_requirement: ^8 || ^9
dependencies:
  - drupal:block
  - drupal:node

Główna klasa bloku - plik DropitBlock.php.

Trzeba go umieścić w module w katalogu src/Plugin/Block

To  w nim znajduje się deklaracja naszego nowego bloku oraz to co ma on wyświetlać.

<?php

namespace Drupal\block_custom\Plugin\Block;

use Drupal\Core\Block\BlockBase;

/**
 * Provides a 'Example: uppercase this please' block.
 *
 * @Block(
 *   id = "dropit_block",
 *   admin_label = @Translation("Example: dropit block")
 * )
 */
class DropitBlock extends BlockBase {

  /**
   * {@inheritdoc}
   */
  public function build() {

    $articles = \Drupal::entityTypeManager()
      ->getStorage('node')
      ->loadByProperties(['type' => 'article', 'status' => 1]);

    $titles = [];
    if (!empty($articles)) {
      foreach ($articles as $article) {
        $titles[] = $article->get('title')->value;
      }
    }

    return [
      '#theme' => 'dropit_block',
      '#titles' => $titles,
    ];
  }

}

Pliku block_custom.module

Zawiera hook_theme dzięki któremu zdefiniowana jest customowa templatka twig

<?php

/**
 * Implements hook_theme().
 */
function block_custom_theme($existing, $type, $theme, $path) {
  return [
    'dropit_block' => [
      'variables' => [
        'titles' => NULL
      ],
    ],
  ];
}

Plik twig (dropit-block.html.twig) ląduje w katalogu templates (jest on oczywiście w katalogu modułu)

{% for title in titles %}
  <ul>
      <li>Article * {{ title }}</li>
  </ul>
{% endfor %}