Drupal 8 własny moduł - tworzenie formularza w panelu admina

Kolejny artykuł z serii tworzenia modułów w Drupalu 8. Tym razem przedstawię jak stworzyć stronę konfiguracyjną w panelu admina. Do stworzonego w jednym z poprzednich artykułów modułu dodamy stronę konfiguracyjną. Najpierw w katalogu src dodaj katalog o nazwie Form a w nim plik MessagesForm.php. Tworzenie formularza składa się z kilku części: sam formularz, routing mapujący formularz na adres URL, dzięki czemu można uzyskać do niego dostęp oraz element menu w systemie menu Drupala, dzięki czemu można uzyskać do niego dostęp z menu administracyjnego.

W pliku MessagesForm.php zaczniemy od stworzenia bazowej klasy dziedziczącej po ConfigFormBase.
<?php  
/**  
 * @file  
 * Contains Drupal\my_module\Form\MessagesForm.  
 */  
namespace Drupal\my_module\Form;  
use Drupal\Core\Form\ConfigFormBase;  
use Drupal\Core\Form\FormStateInterface;  

class MessagesForm extends ConfigFormBase {  

}
Dodamy następujące metody do klasy: getEditableConfigNames() - pobiera nazwę konfiguracji getFormId() - zwraca unikalny identyfikator formularza buildForm() - zwraca tablicę formularza validateForm() - sprawdza poprawność formularza submitForm() - przetwarza przesłanie formularza
class MessagesForm extends ConfigFormBase {  
  /**  
   * {@inheritdoc}  
   */  
  protected function getEditableConfigNames() {  
    return [  
      'my_module.adminsettings',  
    ];  
  }  

  /**  
   * {@inheritdoc}  
   */  
  public function getFormId() {  
    return 'my_module_form';  
  }
  
  /**  
   * {@inheritdoc}  
   */  
  public function buildForm(array $form, FormStateInterface $form_state) {  
    $config = $this->config('my_module.adminsettings');  

    $form['my_module_message'] = [  
      '#type' => 'textarea',  
      '#title' => $this->t('Hello message'),  
      '#description' => $this->t('Message display to users when they login'),  
      '#default_value' => $config->get('my_module_message'),  
    ];  

    return parent::buildForm($form, $form_state);  
  }
  
  /**  
   * {@inheritdoc}  
   */  
  public function submitForm(array &$form, FormStateInterface $form_state) {  
    parent::submitForm($form, $form_state);  

    $this->config('my_module.adminsettings')  
      ->set('my_module_message', $form_state->getValue('my_module_message'))  
      ->save();  
  }
  
}  
Omówmy co robi każda z części kodu. Linijka
$config = $this->config('my_module.adminsettings');
inicjalizuje zmienną konfiguracyjną o nazwie my_module.adminsettings. W tym formularzu jest tylko jeden element typu textarea, tekst wiadomości powitalnej:
$form['my_module_message'] = [  
	'#type' => 'textarea',  
	'#title' => $this->t('Hello message'),  
	'#description' => $this->t('Message display to users when they login'),  
	'#default_value' => $config->get('my_module_message'),  
];
Wartość domyślna jest zwracana z obiektu konfiguracyjnego. Wywołuje metodę get() z nazwą właściwości do pobrania, czyli my_module_message. Metoda submitForm() odpowiada za zapisanie danych formularza podczas przesyłania formularza. Spójrz na kod wewnątrz metody - zapisujemy przesłaną konfigurację z formularza do zmiennej konfiguracyjnej naszego modułu. Aby uzyskać dostęp do właśnie utworzonego formularza, musisz dodać do niego routing. Spowoduje to zmapowanie adresu URL do formularza. W pliku my_module.routing.yml dodaj:
my_module.admin_settings_form:  
  path: '/admin/config/my_module/adminsettings'  
  defaults:  
    _form: '\Drupal\my_module\Form\MessagesForm'  
    _title: 'MessagesForm'  
  requirements:  
    _permission: 'access administration pages'  
  options:  
    _admin_route: TRUE
Trasa jest mapowana do kontrolera formularza (\Drupal\my_module\Form\MessagesForm). Gdy przejdziesz na stronę /admin/config/my_module/adminsettings, zobaczysz formularz z textareą do wpisania powitalnej wiadomości. Jeśli dodasz wiadomość i wyślesz formularz, a następnie odświeżysz stronę, wiadomość pozostanie w obszarze tekstowym, ponieważ jest teraz zapisywana w bazie danych i używana jako domyślna wiadomość dla pola formularza. Po zmapowaniu trasy do kontrolera formularza możesz trafić na adres URL, aby pobrać formularz. Aby uczynić to bardziej użytecznym, musimy dodać go do systemu menu Drupala. W tym celu zmodyfikuj plik my_module.links.menu.yml. Dodaj w nim co następuje.
my_module.admin_settings_form:  
  title: 'Welcome message configuration'  
  route_name: my_module.admin_settings_form  
  description: 'My module message admin'  
  parent: system.admin_config_system  
  weight: 99
Po wyczyszczeniu cache powinieneś teraz zobaczyć link do formularza w elemencie menu admin/config. Możesz użyć zapisanych danych formularza w różnych miejscach. Możesz pobrać konfigurację modułu za pomocą statycznej metody Drupal::config() z nazwą konfiguracji modułu (my_module.adminsettings).
$config = \Drupal::config('my_module.adminsettings');
$config->get('my_module_message');