0

注意:我是一个 drupal 新手。我正在开发一个基于 ajax 示例的模块:add_more 和 autocomplete。这个想法是有一个表单,我可以将访问者添加到访问中,在使用 ajax 的 LDAP 连接填充的 texfield 中输入人员。这工作正常。

问题是我希望能够删除任何我想要的访问者(不仅仅是最后一个)。

我有一个添加访问者按钮,该按钮添加了一个包含访问者姓名的文本字段的字段集,并为此访问者添加了一个抑制按钮(抱歉,没有图像,我的声誉太低)。这意味着 3 个访问者,3 个带有“抑制”按钮的字段集

当用户单击访问者的禁止按钮时,我将其删除,并要求重建表单,但随后,Drupal 继续显示第一个名字,就好像我抑制了最后一个名字一样。

function gaz_edit_visit_form($form, &$form_state) {
    [...]
  // Build the fieldset with the proper number of names. We'll use
  // $form_state['num_names'] to determine the number of textfields to build.
  if (empty($form_state['num_names'])) {
    $form_state['num_names'] = 1;

    $form['visitors_fieldset']['name'][0] = array(
      '#type' => 'fieldset',
      '#title' => 'Visiteur 1'
    );

    $form['visitors_fieldset']['name'][0]['visitor'] = array(
      '#type' => 'textfield',
      '#title' => t('Nom du visiteur'),
      '#autocomplete_path' => 'gaz/visit/edit_visit_autocomplete_callback',
    );

    $form['visitors_fieldset']['add_name'] = array(
      '#type' => 'submit',
      '#value' => t('Ajouter un visiteur'),
      '#submit' => array('ajax_example_add_more_add_one2'),
      '#ajax' => array(
        'callback' => 'ajax_example_add_more_callback2',
        'wrapper' => 'visitors-fieldset-wrapper',
      ),
    );
  }
  else {
    for ($i = 0; $i < $form_state['num_names']; $i++) {
      $form['visitors_fieldset']['name'][$i] = array(
        '#type' => 'fieldset',
        '#title' => 'Visiteur ' . ($i + 1),
      );

      $form['visitors_fieldset']['name'][$i]['visitor'] = array(
        '#type' => 'textfield',
        '#title' => t('Nom du visiteur'),
        '#autocomplete_path' => 'gaz/visit/edit_visit_autocomplete_callback',
        '#default_value' => $form_state['values']['visitors_fieldset']['name'][$i]['visitor'],
      );

      if ($form_state['num_names'] > 1) {
        $form['visitors_fieldset']['name'][$i]['remove_visitor' . $i] = array(
          '#type' => 'submit',
          '#value' => t('Supprimer'),
          '#submit' => array('gaz_visitors_remove'),
          '#ajax' => array(
            'callback' => 'ajax_example_add_more_callback2',
            'wrapper' => 'visitors-fieldset-wrapper',
          ),
          '#gaz_visitor_index' => $i,
        );
      }

      $form['visitors_fieldset']['add_name'] = array(
        '#type' => 'submit',
        '#value' => t('Ajouter un visiteur'),
        '#submit' => array('ajax_example_add_more_add_one2'),
        '#ajax' => array(
          'callback' => 'ajax_example_add_more_callback2',
          'wrapper' => 'visitors-fieldset-wrapper',
        ),
      );
    }
  }

  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Confirm'),
  );

  return $form;
}

这是删除列表中特定用户的函数。

function gaz_visitors_remove($form, &$form_state) {
  array_splice($form_state['values']['visitors_fieldset']['name'], $form_state['triggering_element']['#gaz_visitor_index'], 1);
  if ($form_state['num_names'] > 1) {
    $form_state['num_names']--;
  }
  $form_state['rebuild'] = TRUE;
}

重建过程结束时的 $form (即 gaz_edit_visit_form 函数结束)似乎没问题,包括 textfields 的 default_values 但 drupal 用其他值填充它们。如果我有 3 个访问者,然后删​​除访问者 2,我希望看到 1 和 3 的名称,但我看到 1 和 2 的名称。同样,$form... 看起来不错,并且不再有用户 2 的踪迹。

我想我错过了眼前的巨大大象,但我看不到它!

4

2 回答 2

0

当 Drupal 进行 AJAX 重建时,它的执行顺序是:

  • 以您提交的状态构建表单
  • 验证表单内容
  • 执行东西(调用你的#submit 处理程序 - 我认为)
  • 重建表格以供显示
  • 返回输出(调用你的ajax #callback)

$form_state['values'] 是在第一步中构建的。如果您想在第 4 步中使用它,就像您所做的那样......那很好,但您需要记住这一点。

它解释了为什么您删除的访问者数据仍然存在。您在 $form_state['values'] 中有 (num+1) 个访问者

如何解决这个问题?这取决于您要如何更改代码,这取决于您。一种方法是有两个计数器,其中第二个与 $i 相同,但在某一时刻它可以额外增加 1,以跳过删除的值:(未经测试的代码)

$i2 = -1;
for (...) {
  $i2++;
  if (!empty($form_state['#triggering_element']) && $form_state['#triggering_element']['#value'] == t('Supprimer') && $form_state['#triggering_element']['#gaz_visitor_index'] == $i) {
    // OK, we pressed this button to delete a visitor, this one has been deleted so skip it.
    $i2++
  }
  ...
    '#default_value' => $form_state['values']['visitors_fieldset']['name'][$i2]['visitor']
  ...
于 2014-01-11T00:05:18.410 回答
0

尝试阅读本教程,https://drupal.org/node/717722。您创建表单的方式是错误的,这就是为什么不删除您想要的内容。

于 2013-10-10T12:33:35.570 回答