Extra Block Types (EBT) - New Layout Builder experience❗

Extra Block Types (EBT) - styled, customizable block types: Slideshows, Tabs, Cards, Accordions and many others. Built-in settings for background, DOM Box, javascript plugins. Experience the future of layout building today.

Demo EBT modules Download EBT modules

❗Extra Paragraph Types (EPT) - New Paragraphs experience

Extra Paragraph Types (EPT) - analogical paragraph based set of modules.

Demo EPT modules Download EPT modules

Scroll
25/04/2020, by maria

Теперь давайте скажем, что мы хотим добавить возможность для строителя сайта вводить часть конфигурации для каждого экземпляра нашего пользовательского блока. Всегда имейте в виду, что все конфигурации построения сайта в Drupal 8 можно экспортировать с сайта разработки и импортировать на рабочий сайт (известный как Управление конфигурацией). Вы, как сборщик модулей, можете также предоставить конфигурацию по умолчанию для автоматического заполнения формы, когда создатель сайта создает новый блок.

В существующий класс HelloBlock с предыдущей страницы добавьте эти операторы «use», следующие за уже существующими:

use Drupal\Core\Block\BlockPluginInterface;
use Drupal\Core\Form\FormStateInterface;

Обновите объявление класса, чтобы включить этот новый оператор "реализаций BlockPluginInterface":

class HelloBlock extends BlockBase implements BlockPluginInterface {

Затем добавьте следующий метод в класс. Подобный, полный файл находится здесь, но обратите внимание, что имя формы и имена конфигурации не совпадают с этим руководством.

Этот код будет только добавлять форму, обработка формы и сохранение результатов будут следовать на следующих страницах.

  /**
   * {@inheritdoc}
   */
  public function blockForm($form, FormStateInterface $form_state) {
    $form = parent::blockForm($form, $form_state);

    $config = $this->getConfiguration();

    $form['hello_block_name'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Who'),
      '#description' => $this->t('Who do you want to say hello to?'),
      '#default_value' => isset($config['hello_block_name']) ? $config['hello_block_name'] : '',
    ];

    return $form;
  }

В этом примере форма сначала определяется ссылкой на ее родительский класс с помощью следующей инструкции кода $form = parent::blockForm($form, $form_state );. Далее мы добавляем новое поле в форму. Этот процесс называется полиморфизмом и является одним из важных преимуществ использования методов объектно-ориентированного программирования (ООП).

Далее мы должны указать Drupal сохранить значения из нашей формы в конфигурацию для этого блока. Вот пример:

  /**
   * {@inheritdoc}
   */
  public function blockSubmit($form, FormStateInterface $form_state) {
    parent::blockSubmit($form, $form_state);
    $values = $form_state->getValues();
    $this->configuration['hello_block_name'] = $values['hello_block_name'];
  }

Чтобы просмотреть форму, перейдите к ранее добавленному экземпляру в admin-> Structure-> Block Layout и нажмите Configure для (Hello World) блока.

Чтобы добавить несколько отправьте на ту же форму.

  /**
   * {@inheritdoc}
   */
  public function blockForm($form, FormStateInterface $form_state) {
    $form = parent::blockForm($form, $form_state);

    $config = $this->getConfiguration();

    $form['hello_block_name'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Who'),
      '#description' => $this->t('Who do you want to say hello to?'),
      '#default_value' => isset($config['hello_block_name']) ? $config['hello_block_name'] : '',
    ];

    $form['actions']['custom_submit'] = [
      '#type' => 'submit',
      '#name' => 'custom_submit',
      '#value' => $this->t('Custom Submit'),
      '#submit' => [[$this, 'custom_submit_form']],
    ];    

    return $form;
  }

Новое пользовательское действие отправки

  /**
   * Custom submit actions.
   */
  public function custom_submit_form($form, FormStateInterface $form_state) {
    $values = $form_state->getValues();
    // Perform the required actions.
  }

 

Drupal’s online documentation is © 2000-2020 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.