Working with Configuration Forms

Last updated on
10 August 2017

Use $config in Form Context

You can use configuration forms to figure out how $config can grab the data entered by the user and change the data in the {module}.settings.yml file. Here is the code to declare a $config object in the form, which you can find in Form Settings PHP file.

The Drupal Core ConfigFactory class is a way to read and write configuration data, and it is used to instantiate a Config object based on the contents of a specified configuration file. The new Config object can then be used to perform CRUD operations on that data.

$Config Object with Form
 

Form definition example (located at example/src/Form/exampleSettingsForm.php) :

namespace Drupal\example\Form;

use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;

/**
 * Configure example settings for this site.
 */
class exampleSettingsForm extends ConfigFormBase {
  /** 
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'example_admin_settings';
  }

  /** 
   * {@inheritdoc}
   */
  protected function getEditableConfigNames() {
    return [
      'example.settings',
    ];
  }

  /** 
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $config = $this->config('example.settings');

    $form['example_thing'] = array(
      '#type' => 'textfield',
      '#title' => $this->t('Things'),
      '#default_value' => $config->get('things'),
    );  

    $form['other_things'] = array(
      '#type' => 'textfield',
      '#title' => $this->t('Other things'),
      '#default_value' => $config->get('other_things'),
    );  

    return parent::buildForm($form, $form_state);
  }

  /** 
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
      // Retrieve the configuration
      \Drupal::configFactory()->getEditable('example.settings')
      // Set the submitted configuration setting
      ->set('things', $form_state->getValue('example_thing'))
      // You can set multiple configurations at once by making
      // multiple calls to set()
      ->set('other_things', $form_state->getValue('other_things'))
      ->save();

    parent::submitForm($form, $form_state);
  }
}

Routing file (example.routing.yml) :

example.settings:
  path: '/admin/structure/example/settings'
  defaults:
    _form: '\Drupal\example\Form\exampleSettingsForm'
    _title: 'example'
  requirements:
    _permission: 'administer site configuration'

Using the Config object, you can simplify your data collected from the form. Having the above code in your Form Settings file, you will be able to store form data in {module}.settings.yml.

Any class that extends ConfigFormBase must implement the method getEditableConfigNames and return an array of the names of the configuration fields that it edits.