我有一组可以使用表单编辑和删除的项目。现在,所有项目都显示在列表中作为字段集。字段集是用这种方法创建的:
$venues = db_query('SELECT vid, name, address, postcode, city FROM venues v WHERE v.uid = :uid', array(':uid' => $user->uid));
if($venues->rowCount() != 0) {
foreach($venues as $venue) {
$page['venue_editing_form'][] = drupal_get_form('venue_editor_form', $venue->vid, $venue->name, $venue->address, $venue->postcode, $venue->city);
}
}
然后使用这个函数创建表单:
function venue_editor_form($form, &$form_state, $vid, $vname, $vadd, $vpostc, $vcity) {
$form['#prefix'] = '<div class="vedit">';
$form['#suffix'] = '</div>';
$form['edit_fieldset_'.$vname] = array(
'#type' => 'fieldset',
'#title' => t($vname),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#attributes' => array('class' => array('venue-edit')),
);
$form['edit_fieldset_'.$vname]['venue_name'] = array(
'#type' => 'textfield',
'#title' => t('Venue name:'),
'#description' => t('Enter the venue name.'),
'#default_value' => $vname,
'#attributes' => array('onfocus' => 'this.value=""')
);
$form['edit_fieldset_'.$vname]['address'] = array(
'#type' => 'textfield',
'#title' => t('Address:'),
'#description' => t('The address of this venue.'),
'#default_value' => $vadd,
'#attributes' => array('onfocus' => 'this.value=""')
);
$form['edit_fieldset_'.$vname]['postcode'] = array(
'#type' => 'textfield',
'#title' => t('Postcode'),
'#description' => t('Enter the postcode for this event, so planB can position it on the map'),
'#default_value' => $vpostc,
'#attributes' => array('onfocus' => 'this.value=""', 'onblur' => 'getLatLong(this)')
);
$form['edit_fieldset_'.$vname]['city'] = array(
'#type' => 'textfield',
'#title' => t('City'),
'#description' => t('The city this venue is in.'),
'#default_value' => $vcity,
'#attributes' => array('onfocus' => 'this.value=""')
);
$form['edit_fieldset_'.$vname]['edit_submit'] = array(
'#type' => 'submit',
'#value' => t('Submit changes'),
'#validate' => array('venue_creation_form_validate')
);
$form['edit_fieldset_'.$vname]['delete_venue'] = array(
'#type' => 'submit',
'#value' => t('Delete venue'),
'#submit' => array('venue_form_delete')
);
$form['edit_fieldset_'.$vname]['venueid'] = array(
'#type' => 'value',
'#value' => $vid
);
return $form;
还有提交处理程序之一:
function venue_form_delete($form, &$form_state) {
$deleted = db_delete('venues')
->condition('vid', $form['#venueid'], '=')
->execute();
drupal_set_message('Venue deleted successfully.');
}
现在,问题是无论我按下哪个地点的删除按钮,Drupal 总是删除列表中的第一个。出于某种原因,$form['#venueid']
始终设置为提交处理程序列表中的第一个地点,但是如果我在生成表单时打印一条消息,则每个表单具有不同的 ID,这是应该的。
有没有人遇到过这个问题?
最佳答案
几周前,我的一位同事遇到了这个问题。您遇到此问题的原因是因为您试图在具有不同数据的一页上多次加载相同的表单。看起来这应该可行,但事实并非如此,因为所有表单都以相同的标记/ID 结尾。当您提交每个表单时,系统不知道您真正点击了哪个表单,因此无法采取适当的操作。
有两种方法可以解决这个问题:
1) 重新处理您的表单,以便全部使用 1 个表单而不是多个表单处理
2) 使用hook_forms(...)创建一个“基本形式”,然后为映射到“基本形式”的每个场所生成独特的形式。这将确保每个表单都有一个唯一的 ID,而不必为每个表单编写表单。
我没有 drupal 7 示例,但这里有一个页面显示如何使用 hook_forms 解决 drupal 6 的问题 http://www.computerminds.co.uk/drupal-6-multiple-instances-same-form-one-page .您应该能够应用相同的技术
我还没有测试过这段代码,但这是基本思想:
修改您的 get_form 以使用唯一的 id
foreach($venues as $venue) {
$page['venue_editing_form'][] = drupal_get_form('venue_editor_form_'. $venue->vid, $venue->vid, $venue->name, $venue->address, $venue->postcode, $venue->city);
}
实现 hook_forms
function MODULENAME_forms($form_id) {
$forms = array();
if (preg_match('/venue_editor_form_/', $form_id) {
$forms[$form_id] = array(
'callback' => 'venue_editor_form',
);
}
return $forms;
}
然后我认为您必须修改表单的提交参数以确保它们都被路由到同一个提交处理程序。尽管看起来您确实在为每个按钮添加不同的提交,因此您可能不必在那里做任何事情
$form['#submit'] => array('venue_editing_form_submit');
您可能还必须对验证函数执行相同的操作。
应该可以了。
关于php - Drupal 删除/更新数据库中的错误行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9269151/