如何更改段落字段中包含的表单字段的行为?


18

我正在使用Drupal 8中的“ 段落”模块,试图改变包含在段落字段中的表单字段的行为。这样一来,我就可以添加行为,例如AJAX回调,使用状态隐藏显示其他字段等。

我可以使用此功能访问段落父字段:

function hook_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) { 
}

但是,如何访问该段内的字段?

我已经尝试过,hook_field_widget_form_alter但没有成功。

我该怎么做呢?

注意:我对Drupal开发还很陌生。


试试这个在您的ALTER,kint($form);kint($form_id);这应该给你的钩ID更改ID,然后它也应该给你你想要改变什么阵列的路径。
丹尼·英格兰

Answers:


14

从第1.3节开始,您可以使用hook_field_widget_WIDGET_TYPE_form_alter()(我链接了8.2版本,因为有关使用该挂钩的评论很好)。

您可以在下面看到以下示例 modules/contrib/paragraphs/tests/modules/paragraphs_test/paragraphs_test.module

/**  
 * Implements hook_field_widget_WIDGET_TYPE_form_alter().  
 */  
function paragraphs_test_field_widget_entity_reference_paragraphs_form_alter(&$element, &$form_state, $context) {
  if ($element['#paragraph_type'] == 'altered_paragraph') {
    $element['subform']['field_text']['widget'][0]['#title'] = 'Altered title';
  }
}

6
请注意,如果您使用的是“ Paragraphs EXPERIMENTAL”小部件,而不是“ Paragraphs Classic”,则小部件类型为paragraphs而不是entity_reference_paragraphs
大林

1
一些有用的事情(因为不可能调试这些钩子): /* @var $paragraph \Drupal\paragraphs\Entity\Paragraph */ $paragraph = $form_state->get('paragraph'); $delta = $context['delta'];
Dalin

1

使用hook_form_alter您可以更改表单中的任何内容,甚至包括来自小部件的内容。它很容易变得凌乱,当您与小部件弄乱时,它很容易折断。

如果您想更改小部件,可以做些自己的小部件。小部件是插件(PHP类),因此您可以使自己的子类成为您自己的子类,并通过完全覆盖函数或扩展函数来进行更改。

小部件使用注释系统,因此您需要在类上方定义名称,id等作为注释。最简单的方法是简单地复制原始窗口小部件并更改其名称和ID,其余部分应与需要一样。

记住要清除缓存以使Drupal找到新插件。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.