我正在学习drupal 8.我想创建一个包含'two dimensionnal''添加另一个项目'表单的页面.我的代码几乎运行良好,但是当我向房子添加房间时我有一个奇怪的行为(我的调试日志中有一个来自FormStateInterface :: getTriggeringElement()的奇怪值,请参见底部的代码和日志)
第一:我有两个结构,房子和房间.用户可以创建一些房屋,每个房子,他可以创建一些房间:
当我添加一些房子,表格工作正常:
当我将一些房间添加到最后一个房子时,表格也可以正常工作:
但是,当我向任何"没有最后"的房子添加一些房间时,表格不能正常工作(在屏幕截图中,我点击了一次"阻止房屋"中的"添加房间",标签为"房子1"成了"房子2"(?!),点击添加5个房间(?!):
这里是我的代码和一个奇怪的调试日志,我不解释为什么我得到这个值(来自room_addMoreSubmit回调中的getTriggeringElement(),这是我认为的问题)
<?php
namespace Drupal\projet\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
class HouseForm extends FormBase {
public function getFormId(){
return 'custom_rooms_form';
}
function buildForm(array $form, FormStateInterface $form_state) {
$house_count = $form_state->get('house_count');
if (is_null($house_count)) {
$house_count = 1;
$form_state->set('house_count', $house_count);
}
$form['house'] = array(
//'#tree' => TRUE,
'#prefix' => '<div id="house-replace">',
'#suffix' => '</div>'
);
for ($house_delta = 0; $house_delta < $house_count; $house_delta++) {
if (!isset($form['house'][$house_delta])) {
$room_count[$house_delta] = $form_state->get('room_count_'.$house_delta);
if (is_null($room_count[$house_delta])) {
$room_count[$house_delta] = …Run Code Online (Sandbox Code Playgroud) 我在文本字段上编写了ajax回调,并在模糊事件上调用它.
但是在它进行ajax回调之前,我想检查textfield不为空的条件.
所以我想,如果textfield不为空,则调用ajax回调,否则不应该调用它.
提前致谢
form_example是我的模块名称
表格控制
$form['price_form']['item'] = array(
'#type' => 'textfield',
'#title' => 'Item Name?',
'#size' => 10,
'#maxlength' => 25,
'#id' => 'nameId',
'#required' => TRUE,
'#ajax' => array(
// #ajax has two required keys: callback and wrapper.
// 'callback' is a function that will be called when this element changes.
'callback' => 'form_example_simplest_callback',
'wrapper' => 'listDiv',
'effect' => 'fade',
),
'#autocomplete_path' => 'examples/form_example/item_name_autocomplete_callback',
);
Run Code Online (Sandbox Code Playgroud)
JS代码
(function($){
$(document).ready(function(){
alert('Hi, Javascript successfully attached');
Drupal.behaviors.form_example = {
attach: function (context, …Run Code Online (Sandbox Code Playgroud) 我希望用户能够通过AJAX提交节点和评论.我还想对节点和注释表单做一些相当广泛的自定义.
我花时间浏览了Drupal 7的Form API和Ajax框架的文档和代码示例,但我发现它非常复杂.因此,我只想在HTML中创建自己的表单,并使用我自己的JavaScript代码通过Ajax提交它.我还将设置一个特定的URL来处理这些Ajax请求,这些URL将最终调用node_save()或comment_save()在适当的时候调用.
与通过Form API和Ajax框架相比,这样做有什么缺点?我不是在为社区做贡献而创建模块.一切都只适用于我自己的网站.