【发布时间】:2014-02-04 14:23:59
【问题描述】:
我有一个使用表单 API 在自定义模块中创建的表单。这是一个相当基本的表格,只有 4 个字段。它基本上为用户注册工作警报系统。我们仅基于带有一些搜索参数的电子邮件地址。我们希望人们能够快速匿名地设置搜索代理,这意味着他们不会创建 Drupal 用户帐户,因为我们不希望他们必须处理密码等。他们只需输入他们的电子邮件地址,检查关闭一些偏好,我们将保存数据。
现在我需要处理的问题是允许用户稍后编辑他们的偏好和/或取消订阅。同样,这不是高安全性,也不需要如此。我想做的是最初只在表格中询问他们的电子邮件地址并允许他们提交。然后我会检查数据库,看看我们是否已经有该电子邮件地址的条目,如果有,显示预先填写的表格供他们编辑或取消订阅,否则只显示空白表格。所以我只是想找出解决这个问题的最佳方法。我在想我只有一个包含所有字段的表单,包括电子邮件地址,但在成功调用数据库后,不知何故只显示电子邮件地址以外的其他字段。我只是想知道如何做到这一点。
编辑: 我想知道是否可以使用 Drupal 的 AJAX 功能来实现这一点?我试过这个,但我无法让它工作。我在我的提交按钮上放置了一个 Ajax 属性,带有一个包装器 ID 和一个回调函数。我在我的表单中创建了一个带有空白标记的表单元素,并使用了一个前缀和后缀,它使用我在 AJAX 参数中使用的 ID 创建了一个包装器 div。然后我想在我的回调函数中我可以进行数据库查找,然后将我需要预填充或不需要的表单元素返回到创建的包装器 div 中,但是当我这样做时,表单确实通过 AJAX 提交,我获取纺车,但无论我在回调中返回什么,它都不会出现在我的输出包装器 div 中。我会以正确的方式解决这个问题吗?我还确保我有 $form_state['rebuild'] = TRUE;在我原来的表格上。
这是我尝试过的,但没有成功。
/**
* Implements hook_form().
*/
function _vista_form($form, &$form_state) {
$form = array();
$form_state['rebuild'] = TRUE;
$form['email'] = array(
'#type' => 'textfield',
'#title' => 'Email',
'#required' => TRUE,
);
$form['render_area'] = array(
'#type' => 'markup',
'#markup' => '',
'#prefix' => '<div id="job-agent-form">',
'#suffix' => '</div>',
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
'#attributes' => array('class' => array('submit')),
'#ajax' => array(
'callback' => '_display_form',
'wrapper' => 'job-agent-form',
'method' => 'replace',
'effect' => 'fade',
),
return $form;
}
function _display_form($form, &$form_state) {
// there are other form elements that would go here also, I just added two for example
$type_options = array(
'VISTA-HealthCare-Partners-Government' => 'Vista Healthcare Partners',
'International' => 'International Locum Tenens',
'Permanent' => 'Permanent Physician',
'US-Locum-Tenens' => 'US Locum Tenens',
);
$form['job_type'] = array(
'#type' => 'checkboxes',
'#multiple' => TRUE,
'#title' => 'Type of Job',
'#options' => $type_options,
'#empty_option' => 'Choose a placement type',
'#empty_value' => 'all',
//'#default_value' => $type_selected,
);
$form['active'] = array(
'#type' => 'checkbox',
'#title' => 'Subscribe/Unsubscribe',
'#default_value' => 1,
);
return $form;
}
【问题讨论】:
-
为什么不能使用现有的订阅模块?
-
在不进行重大修改的情况下,它们都没有按照我们希望的方式工作。从头开始创建我们需要的东西更容易。