Як ви реалізуєте користувальницький обробник подання у moll_form_alter ()?


15

Я оновлював один з моїх модулів Drupal 7 до 8, і у мене виникає проблема зі зміною форми. Я додаю функцію перевірки та обробник подачі. Функція перевірки називається просто чудовою, але функція подання не звільняється. Мені цікаво, чи це означає, що існує підхід у стилі Symfony, який потрібно застосувати для додавання обробників подання до існуючих форм. Я багато шукав, і не можу знайти жодного прикладу. Також переглянув деякі незавершені модулі D8, але я теж не знайшов жодних робочих прикладів.

Хтось має уявлення про те, який правильний спосіб Drupal 8 це зробити?


2
Ви повинні опублікувати свій існуючий код, щоб люди могли його переглянути і помітити будь-які проблеми / запропонувати альтернативи.
Юрій Бабенко

Станом на D8 beta9 є геттери та сетери для обробки обробників, але я, здається, не міг змусити їх працювати, і я використав відповідь нижче. Я би сподівався, що інтерфейс вузла в майбутньому отримує певні події, оскільки я б скоріше підписався на подію, ніж використовував гачок.
Алекс Фіннарн

Відповіді:


13

Відповідно до прикладу в документації, це те саме, що і для Drupal 7:

$form['actions']['submit']['#submit'][] = 'mymodule_upload_enabled_types_submit';

Ви можете знайти подібну (робочу) логіку в

І ще кілька.


1
Я не можу посперечатися з документами API. Можливо, щось моторошне з моєю реалізацією, я копаю глибше.
Арбі

Дивіться моє оновлення вище, окрім $ form ['Actions'] ['submit'] є також розділи $ form ['Actions'] ['публікувати'] та ['unpublish'], до яких можуть бути додані обробники повідомлень.
Арбі

Мені довелося використовувати $ form ['дії'] ['опублікувати'] ['# подати'] [] замість $ form ['Actions'] ['submit'] ['# submit'] [] для мого обробника подання працювати, коли вузол був опублікований. Однак мені здається, що зворотний виклик не працює, коли вузол спочатку зберігається як неопублікований.
Алекс Фіннарн

6

Ви можете додати кількість обробників подачі, використовуючи наступний код:

 $form['actions']['submit']['#submit'][] = 'mymodule_what_ever_function';

Якщо ви хочете додати обробник подачі після цього замовчуванням, то обробник, який буде викликаний після зворотного виклику, ви можете скористатись наступним.

$form['#submit'][1] = test_function;

Щоб видалити обробник подання:

unset($form["actions"]['submit']);

3

Поведінка або змінюється, або відрізняється від конкретного випадку. За допомогою форми підтвердження множинних видалених вузлів

$form['actions']['submit']['#submit'][] = 'mymodule_upload_enabled_types_submit';

@ Код Клайва змушує Drupal ігнорувати головний обробник. У цьому випадку додайте обробник до $form['#submit']розділу:

$form['#submit'][] = 'mymodule_upload_enabled_types_submit';

1

Ось як приєднати спеціальний обробник подання до форми додавання / редагування вузла статті в Drupal 8:

<?php

use Drupal\Core\Form\FormStateInterface;

/**
 * Implements hook_form_alter().
 */
function my_module_form_alter(&$form, FormStateInterface $form_state, $form_id) {

  // Use this to reveal the form id.
  //drupal_set_message($form_id);

  // Use this with the devel module to inspect the button action(s).
  //kint($form['actions']);

  switch ($form_id) {

    case 'node_article_form':      // New article nodes.
    case 'node_article_edit_form': // Existing article nodes.

      // Attach our custom submit handler.
      $form['actions']['publish']['#submit'][] = 'my_module_node_article_form_submit';
      break;

  }

}

function my_module_node_article_form_submit($form, FormStateInterface $form_state) {
  drupal_set_message('Running custom submit handler...');
}

Мені не вдалося успішно додати користувальницьку обробку подання $form['#submit']та правильно функціонувати. Мені довелося чітко приєднати її до кнопки " Зберегти та опублікувати" під час створення нової статті, а також додати кнопку " Зберегти та зберегти опубліковану" під час редагування існуючої статті.

Крім того publish, ось деякі інші дії кнопки, доступні:

unpublish
preview
delete

Я в Друпалі 8.7.3, і my_module_node_article_form_submit($form, FormStateInterface $form_stateдав мені TypeError: Argument 2 passed to _ccad_content_log_webform_submit() must be an instance of FormStateInterface, instance of Drupal\Core\Form\FormState given; змінивши його, щоб _submit($form, $form_state)виправити помилки.
user1359
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.