形成API自定义元素 -- forms 领域 和 ajax 领域 drupal 相关 的问题

Forms API custom element


1
vote

问题

中文

我当前将一些自定义表单API元素转换为Drupal 8等价物,但是我正在运行几个问题。

首先,我似乎没有在元素进程中收到'triggering_element'返回我的$ form_state,它在ajax回调中 - 但不是在进程中,它在d7中允许我实现不同的逻辑在使用不同按钮/表单控件的过程函数中。我不确定是否有一种不同的方法来抓住它,但$ form_state-> getTriggeringElement()在元素进程中返回null,即使它在ajax事件之后的处理。

其次,$ comment ['#ID']现在在每个进程中更改,因为在一个父形式中可能存在此元素的多个实例,我使用该ID作为尝试确保每个Ajax包装器是唯一的手段。既然ID更改了AJAX请求运行一次,那么再也不会(当#id已更改,但标记ID中的包装器/容器是相同的)。有没有不同的方式,我应该在d8中针对我的包装?

我已经剥去了,包括一些代码,希望能够深入了解我正在做的事情。

任何援助都会非常感谢!

  class AddressSelector extends FormElement {   public function getInfo(){     ...   }    static function test_module_address_selector_process($element, &$form_state, &$form)   {     $element['postcode'] = array(       '#type' => 'textfield',       '#title' => t('Please enter your postcode and click find address'),     );      $element['lookup_btn'] = array(       '#type' => 'submit',       '#value' => t('Find address'),       '#ajax' => array(         'callback' => 'Drupal est_moduleElementAddressSelector::test_module_address_selector_lookup_cb',         'wrapper' => $element['#id'] . '-lookup-wrapper',         ),     );      $element['wrapper'] = array(       '#attributes' => array(         '#id' => $element['#id'] . '-lookup-wrapper',       );     );         $entered_postcode = isset($element['#value']['postcode'])             ? $element['#value']['postcode'] : FALSE;      if($entered_postcode){       $address_opts = test_module_lookup_postcode($entered_postcode);        $element['wrapper']['select_address'] = array(         '#type' => 'select',         '#options' => $address_opts,         '#title' => t('Please select your address'),       );     }   }    static function test_module_address_selector_lookup_cb($form, &$form_state){     $f = $form;     $triggeringElement = $form_state->getTriggeringElement();     // I'm unsure if there's a neat way to do this - I need to find this 'instance' of the element in the      // parent form so I'm able to return the correct chunk of form, in this case the wrapper.     for($x = 0; $x < count($triggeringElement['#array_parents']); $x++){       $f = $f[$triggeringElement['#array_parents'][$x]];       if($f['#type'] == 'address_selector'){         $ele = $f['wrapper'];         return $ele;       }     }   } }   
英文原文

I'm currently converting some of our custom forms API elements into Drupal 8 equivalents, however I'm running into a couple of issues.

Firstly I don't seem to receive a 'triggering_element' back in my $form_state in the element process, it's there in the ajax callback - but not in the process, it was there in D7 and allowed me to implement different logic in the process function for different buttons / form controls being used. I'm not sure if there's a different way to grab it but $form_state->getTriggeringElement() returns null whilst in the element process, even if it's processing following an ajax event.

Secondly the $element['#id'] changes on each process now, as there could be multiple instances of this element within one parent form I was using the ID as a means of trying to ensure each ajax wrapper was unique. Now that the ID changes the ajax request works once, then never again (as the #id has changed, but the wrapper/container in the markups ID is the same). Is there a different way I should be targetting my wrappers in D8?

I've stripped down and included some of the code which will hopefully offer an insight into what I'm doing.

Any assistance would be greatly appreciated!

class AddressSelector extends FormElement {   public function getInfo(){     ...   }    static function test_module_address_selector_process($element, &$form_state, &$form)   {     $element['postcode'] = array(       '#type' => 'textfield',       '#title' => t('Please enter your postcode and click find address'),     );      $element['lookup_btn'] = array(       '#type' => 'submit',       '#value' => t('Find address'),       '#ajax' => array(         'callback' => 'Drupal\test_module\Element\AddressSelector::test_module_address_selector_lookup_cb',         'wrapper' => $element['#id'] . '-lookup-wrapper',         ),     );      $element['wrapper'] = array(       '#attributes' => array(         '#id' => $element['#id'] . '-lookup-wrapper',       );     );         $entered_postcode = isset($element['#value']['postcode'])             ? $element['#value']['postcode'] : FALSE;      if($entered_postcode){       $address_opts = test_module_lookup_postcode($entered_postcode);        $element['wrapper']['select_address'] = array(         '#type' => 'select',         '#options' => $address_opts,         '#title' => t('Please select your address'),       );     }   }    static function test_module_address_selector_lookup_cb($form, &$form_state){     $f = $form;     $triggeringElement = $form_state->getTriggeringElement();     // I'm unsure if there's a neat way to do this - I need to find this 'instance' of the element in the      // parent form so I'm able to return the correct chunk of form, in this case the wrapper.     for($x = 0; $x < count($triggeringElement['#array_parents']); $x++){       $f = $f[$triggeringElement['#array_parents'][$x]];       if($f['#type'] == 'address_selector'){         $ele = $f['wrapper'];         return $ele;       }     }   } } 
     
     
     

回答列表

相关问题

1  联系表单:来自节点电子邮件字段的收件人  ( Contact form recipient from nodes email field ) 
用例:企业目录。 描述:我需要创建一个动态联系人表单,将每个节点的(业务列表内容类型)单个电子邮件字段作为联系表单的主收件人,或者至少作为碳副本('cc') 。 我花了2天寻找模块以及网络周围的各种编码建议,没有成功。 示例: Drupal 8中的每个节点的联系人8? 这很容易在D7中完成 视图联系表格 模块...

2  如何将表单作为桌子呈现?  ( How do i render a form as a table ) 
默认表单布局具有在单个div标签中包装的每个表单元素,带有标签和内部输入。我想整齐地展示一些东西,并为现场标签创建一个列,以及输入区域的另一列。 我可以看到这一点以两种方式之一完成: - 我可以使用表元素或div创建一个表,并将标签与输入分开。我会用枝条吗? - 或者,也许有一个创造性的方法可以使用CSS与默认结...

1  如何使用ajax单击它后更改按钮名称  ( How to change the button name after click on it using ajax ) 
我是司布的新手。我创建了一种执行AJAX动作的表单。如何在使用Ajax后单击后更改按钮名称。 function auktion_fav_form($form, &$form_state, $auktion_id) { form['add_to_fav'] = array( '#type' => 's...

5  如何找到hook_form_form_id_alter的form_id?  ( How do i find a form id for hook form form id alter ) 
我想改变我为视频创建的内容类型的表单。该类型称为视频。如何使用hook_form_alter更改表单以创建内容? ...

2  如何在条件选择类型下触发AJAX后从分组的表单字段中获取值  ( How to fetch value from grouped form fields after ajax is fired under conditiona ) 
我也使用dpm($ form_state-&gt; getValue('input_select','text')); 和DPM($ form_state-&gt; getValue('input_select','body'));它在Ajax处理程序被称为... 之后 在Drupal 8中为分组的表单字段获...

1  在块中显示表单数据[重复]  ( Showing form data in a block ) 
这个问题已经在这里有答案: 存储匿名用户的数据/会话 (5个答案) 关闭 ...

0  你可以在ctools中做分支多学分表吗?  ( Can you do branching multistep forms in ctools ) 
我在项目中的几个地方使用ctools multiSep表单代码,并希望将用户的路径分支通过表单。也就是说,在步骤1中,我从用户那里获得一些东西,允许我确定用户应该被发送到步骤2a,2b和2c,或3a,3b和3c。我一直在看,但尚未找到任何关于这个的东西; CTOOLS是可以使用CTOOL的分支多步形式? ...

1  托管文件元素以$ form_state为匿名用户的  ( Managed file element empty in form state on submit for anonymous user ) 
我有一个用drupal 8 fapi构建的表格。这是一个复杂的"联系我们" 类型的东西,包括上传文件的能力。 其中它包括多个Managed_file元素。 元素在buildform()中定义。 $form['myfile'] = [ '#type' => 'managed_file', '#upl...

4  将值插入$ form_state  ( Insert a value to form state ) 
function form_example_form($form, &$form_state) { $form_state ['store_value'] =1; $form['submit_button'] = array( '#type' => 'submit'...

0  submit_preprocess中更改表单值  ( Alter form value in submit preprocess ) 
如何更改值,在这种情况下,在form_alter hook的预处理功能中,节点对象表单的标题字段。 $form['actions']['publish']['#submit'][] = MODULE_submit_preprocess'; function MODULE_submit_preprocess($f...

3  我可以将字段集合添加到块吗?  ( Can i add a field collection to a block ) 
我已经制作了一个字段集合,导出为一个功能,现在我想将它添加到一个块。有没有人有什么建议?我已添加字段以通过表单API块,但这似乎没有应用。 我想通过代码添加此字段集合,而是找到模块。 我看了看着hook_block_configure以在那里添加表单,但我不知道我是否可以在 form api参考。 ...

0  #ajax回调使用错误的回调  ( Ajax callback uses the wrong callback ) 
我不知道为什么,但是使用这个代码,当我点击标记类 - 类 - 添加提交按钮时,它执行 type_callback 回调,不是 marker_category_add_callback 。为什么? 如果我在表单中注释所有标记类型字段,它使用正确的回调。 function food_truck_form_admin(...

2  白色屏幕的钩形形式改变  ( White screen of death in hook form alter ) 
我在Drupal 8中启用了SimbleNews模块,我试图将输入字段的宽度从 60 降低到 30 。我正在尝试实施表单更改挂钩并安装了Devel模块。我使用了dsm($ form_id);要识别表单,然后为了识别要更改的表单属性,我试图使用DSM($表格),DPM($ FORM)和PRINT_R($表格),所有这些...

5  依赖注入不工作自定义表单  ( Dependency injection not working custom form ) 
我有一个带有表单类的自定义模块,在那里我正在尝试注入自定义服务以在它的提交方法中使用: namespace Drupalmy_moduleForm; use DrupalCoreFormFormBase; use DrupalCoreFormFormStateInterface; use Drupalmy_mo...

1  按列订购表  ( Ordering table by column ) 
我尝试通过表元素标题中按列顺序添加可能性。 我开始使用drupal 8,我找不到关于API站点上表的任何清晰文档,以执行我想要的东西... 提前感谢。 ...

2  如何更改节点添加表单  ( How to change node add form ) 
我不知道我怎样才能改变节点添加形式在Drupal 8.在Drupal 7的布局我Panopoly工作,可能会覆盖在页面管理器中的网址,并添加面板变种。我认为它在Drupal 8中可以在同样的方式工作,但在面板中,我无法添加表单项目。因此,我在激活变体上获得一个空白页。 任何想法? ...

1  如何在节点编辑表单中更改“添加菜单链接”复选框中的选项吗?  ( How do i alter the options in the add menu link checkbox in the node edit form ) 
我用 hook_form_node_page_edit_form_alter() 挂钩节点编辑表单。如何在为该节点添加菜单项时更改可用选项? 我只需要显示给定节点ID的菜单项: if (isset($form['menu'])) { $node_ids = array(1,2,3); // only sh...

0  最佳存储不是公开可查看的数据? [关闭]  ( Best way to store not publicly viewable data ) 
关闭。这个问题是基于意见的。它目前不接受答案。 想要改进这个问题?更新问题,以便通过编辑此帖的事实和引用来回答。 关闭 4年前。 ...

1  特定链接不通过PCA测试  ( Specific links do not pass pca test ) 
我有一个drupal 7网站。它是HTTPS启用。当我进行PCA合规性测试时,某些引用/站点/默认/文件/样式/ *的链接失败了。失败消息说".. ......请求传递的文本信息...... 在样式文件夹中,我有一些其他文件夹,在我为网站创建内容时,保存了图像。我在内部/样式文件夹中添加了一个.httaccess文...

3  在分层/表格形式结构中的复选框元素上的FormState GetValue破坏了吗?  ( Formstate getvalue on checkbox elements in hierarchical tabular form structure ) 
我似乎无法使用呼叫中的阵列样式键检索正确发布的复选框表单元素值 998887661 方法。如果将元素压制成非嵌套结构,则GetValue方法工作。但是,我需要使用表格表单元素铺设组件。我回来的值(空或"0" )与在 submitForm 中发布的时间不匹配实际的用户选中的框状态。我还尝试了一个reversed #p...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.