Добавить конфигурацию форму для блока
Теперь давайте скажем, что мы хотим добавить возможность для строителя сайта вводить часть конфигурации для каждого экземпляра нашего пользовательского блока. Всегда имейте в виду, что все конфигурации построения сайта в 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.