【发布时间】:2012-02-13 22:41:52
【问题描述】:
我有一组可以使用表单编辑和删除的项目。现在,所有项目都以字段集的形式显示在列表中。使用此方法创建字段集:
$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,应该是。
以前有人遇到过这个问题吗?
【问题讨论】:
-
视频从哪里来?你是说nid吗?
-
vid 是场地ID,它来自数据库查询以获取所有场地的详细信息。然后,我使用 foreach 循环遍历所有结果和 drupal_get_form('venue_editor_form', $venue->vid ...)
-
重读这个问题,是不是你有一个表单,有多个字段集和多个提交/删除按钮(即每个场地一个字段集)?
-
有多个带有多个删除/更新按钮的字段集,但每个字段集只有一个表单。通过从数据库中获取场地并在调用 drupal_get_form 的 foreach 循环中创建表单。
标签: php mysql forms drupal drupal-7