Drupalのモジュール作成方法 Part.2

モジュールの作り方 Part.1ではControllerから直接Hello there!を表示しましたが、今回は管理画面のフォームで文言を入力し、入力した文言が表示されるモジュールです。今回は管理画面で入力用画面から文言が入力できるモジュールの一部分をご紹介いたします。

具体的には下記の画面のように、拡張機能(モジュール)の一覧画面で該当のwordsoutputモジュールのConfigureをクリックすると、

 

モジュール設定

 

下記の入力用画面が開きます。そこで好きな文を入力するとその文字が指定されたURLで表示されるというモジュールです。今回はサイトURL/wordsで表示されるようにしたいと思います。

モジュール入力

 

今回はモジュール名をwordsoutputとします。下記がフォルダ構成ですが、Part.1との違いは管理画面用のconfigフォルダがあり、管理画面の設定情報などの情報が必要となります。また、入力用のフォームWordsoutputForm.phpが必要となります。

drupal/modules/wordsoutput/

  |-wordsoutput.info.yml
  |-wordsoutput.routing.yml
  |-src
     |-Controller
         |-wordsoutputController.php
     |-Form
         |-WordsoutputForm.php
  |-config
     |-install
         |wordsoutput.settings.yml
     |-schema
         |wordsoutput.schema.yml

①wordsoutput.info.ymlについて

設定configure: wordsoutput.formが追加されています。これはモジュールの一覧でConfigureが表示され wordsoutput.formを呼ぶ出す処理になります。

name: Words Output module.
type: module
description: 'This is your second module.'
core: 8.x
configure: wordsoutput.form

②WordsoutputForm.phpの内容を一部表示いたします。WordsoutputFormクラスのbuildFormメソッドで入力フォームの内容を設定しています。またsubmitFormメソッドでは、フォームで入力した値を'wordsoutput.words'にセットしています。

class WordsoutputForm extends ConfigFormBase {

  public function getFormId() {
    return 'wordsoutput_form';
  }

  public function buildForm(array $form, FormStateInterface $form_state) {
    // Form constructor
    $form = parent::buildForm($form, $form_state);
    // Default settings
    $config = $this->config('wordsoutput.settings');
    // Words field
    $form['words'] = array(
      '#type' => 'textfield',
      '#title' => $this->t('好きな文を入力してください。'),
      '#default_value' => $config->get('wordsoutput.words'),
      '#description' => $this->t('好きな文を入力してください。'),
    );
  return $form;
  }
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $config = $this->config('wordsoutput.settings');
    $config->set('wordsoutput.words', $form_state->getValue('words'));

    $config->save();
    return parent::submitForm($form, $form_state);
  }