注意:我是一个 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 的踪迹。
我想我错过了眼前的巨大大象,但我看不到它!