在 civicrm 网络表单中,创建多个 'groups' 字段
in a civicrm webform, create multiple 'groups' fields
在 CiviCRM 网络表单中,您可以 'enable tag and groups'。配置这些允许您在网络表单中创建选项元素。
这将创建一个 'widget'、一个下拉菜单或一组复选框。我有两个字段实例,我希望用户 select 一个组 - 例如
- 您想接收哪些邮件列表 (a,b,c)
- 您对什么食物感兴趣 (d,e,f)
a,b,c,d,e 和 f 都是组。我无法改变这一点。
我该怎么做?
下面是技术建议,但首先,我建议您真正的解决方案是不要对第二个问题使用群组。组可以很好地处理邮件列表,但如果要跟踪兴趣,最好将它们设置为自定义字段。它将解决这个紧迫的问题,并且可以更轻松地处理串联搜索等(在列表 b 上并且喜欢食物 d)。
现在,如果您必须将它们分组,您可以创建一个假字段并使用 jQuery 将复选框移动到其中。使用一个您不关心的选项创建假字段,但将其标记为 "What food are you interested in" 或等效项。然后,编辑 CiviCRM 生成的组字段:将其更具体地标记为 "which mailing lists...",然后选择静态选项,这样它就不会开始提供任何组供某人选择。
现在,添加以下内容javascript:
// first remove the dummy checkboxes in your fake field
$('#yourdummyfield .form-item').each( function() { $(this).remove(); });
// now move things into the dummy field
$('#yourdummyfield').append( $('#groupsfield .form-item-d');
$('#yourdummyfield').append( $('#groupsfield .form-item-e');
$('#yourdummyfield').append( $('#groupsfield .form-item-f');
从表单处理的角度来看,它们都将被评估为 "groups" 字段。但是,它们看起来是分开的。无论好坏,这都必须在您添加新的组字段时进行调整。
在使用了一段时间 Andrew Hunts 的建议后,我终于在服务器端解决了这个问题,在一个自定义模块中,使用 webform 逻辑描述在这里
http://www.webomelette.com/drupal-webform-submission-presave-hook
基本上,在预保存时,我寻找 2 个包含组 ID 的自定义字段(示例中的邮寄和食品)。然后我将这些添加到 CiviCRM 组字段。
我将添加下面的代码,它有更多的逻辑:
- 为了灵活,我使用一个隐藏字段来包含字段键
在 civicrm 组选择器中添加其他字段。
字段称为 'the_groups_element'(但它不是组元素,它包含组元素的键)
- 只允许一个食物组,因此在将您添加到食物组之前,它会从组选择器中删除所有其他食物组。
你可以让它更通用,但由于我对不同的组有不同的逻辑,这很适合我。
function getFoodGroups() {
// return foodgroups
}
function getMailGroups() {
// return mailgroups
}
function MYMODULE_webform_submission_presave($node, &$submission) {
$groupselm = '';
$groups_cid = false;
$foods_cid = false;
$mailings_cid = false;
// http://www.webomelette.com/drupal-webform-submission-presave-hook
foreach($node->webform['components'] as $cid=>$comp) {
if ($comp['form_key']=='the_groups_element') {
$groupselm = $comp['value'];
break;
}
}
if ($groupselm) {
foreach($node->webform['components'] as $cid=>$comp) {
if ($comp['form_key']==$groupselm) $groups_cid = $comp['cid'];
if ($comp['form_key']=='the_foods') $foods_cid = $comp['cid'];
if ($comp['form_key']=='the_mailings') $mailings_cid = $comp['cid'];
}
$group_gids = $submission->data[$groups_cid];
if (!$group_gids) $group_gids=array();
if ($foods_cid!==false && $submission->data[$foods_cid]) {
// remove all current foods
foreach ($group_gids as $gidx=>$group_gid) {
foreach (getFoodGroups() as $foodgroup) {
if ($group_gid==$foodgroup['gid']) {
if ($debug) drupal_set_message('removing foodgroup '.$foodgroup['gid']);
unset($group_gids[$gidx]);
}
}
}
// validate and add submitted regions
$foodsgids = $submission->data[$foods_cid];
if (!is_array($foodsgids)) $foodsgids = array($foodsgids);
foreach ($foodsgids as $foodsgid) {
foreach (getFoodGroups() as $foodgroup) {
if ($foodsgid==$foodgroup['gid']) {
$group_gids[]=$foodsgid;
break; // only one food allowed
}
}
}
}
if ($mailings_cid!==false && $submission->data[$mailings_cid]) {
// just add submitted mailings, dont remove any
$mailinggids = $submission->data[$mailings_cid];
if (!is_array($mailinggids)) $mailinggids = array($mailinggids);
foreach ($mailinggids as $mailinggid) {
foreach (getMailGroups() as $mailing) {
if ($mailinggid==$mailing['gid']) {
if ($debug) drupal_set_message('adding mailing '.$mailing['gid']);
$group_gids[]=$mailinggid;
}
}
}
}
$submission->data[$groups_cid] = array_unique($group_gids);
}
在 CiviCRM 网络表单中,您可以 'enable tag and groups'。配置这些允许您在网络表单中创建选项元素。
这将创建一个 'widget'、一个下拉菜单或一组复选框。我有两个字段实例,我希望用户 select 一个组 - 例如
- 您想接收哪些邮件列表 (a,b,c)
- 您对什么食物感兴趣 (d,e,f)
a,b,c,d,e 和 f 都是组。我无法改变这一点。
我该怎么做?
下面是技术建议,但首先,我建议您真正的解决方案是不要对第二个问题使用群组。组可以很好地处理邮件列表,但如果要跟踪兴趣,最好将它们设置为自定义字段。它将解决这个紧迫的问题,并且可以更轻松地处理串联搜索等(在列表 b 上并且喜欢食物 d)。
现在,如果您必须将它们分组,您可以创建一个假字段并使用 jQuery 将复选框移动到其中。使用一个您不关心的选项创建假字段,但将其标记为 "What food are you interested in" 或等效项。然后,编辑 CiviCRM 生成的组字段:将其更具体地标记为 "which mailing lists...",然后选择静态选项,这样它就不会开始提供任何组供某人选择。
现在,添加以下内容javascript:
// first remove the dummy checkboxes in your fake field
$('#yourdummyfield .form-item').each( function() { $(this).remove(); });
// now move things into the dummy field
$('#yourdummyfield').append( $('#groupsfield .form-item-d');
$('#yourdummyfield').append( $('#groupsfield .form-item-e');
$('#yourdummyfield').append( $('#groupsfield .form-item-f');
从表单处理的角度来看,它们都将被评估为 "groups" 字段。但是,它们看起来是分开的。无论好坏,这都必须在您添加新的组字段时进行调整。
在使用了一段时间 Andrew Hunts 的建议后,我终于在服务器端解决了这个问题,在一个自定义模块中,使用 webform 逻辑描述在这里 http://www.webomelette.com/drupal-webform-submission-presave-hook
基本上,在预保存时,我寻找 2 个包含组 ID 的自定义字段(示例中的邮寄和食品)。然后我将这些添加到 CiviCRM 组字段。
我将添加下面的代码,它有更多的逻辑:
- 为了灵活,我使用一个隐藏字段来包含字段键 在 civicrm 组选择器中添加其他字段。 字段称为 'the_groups_element'(但它不是组元素,它包含组元素的键)
- 只允许一个食物组,因此在将您添加到食物组之前,它会从组选择器中删除所有其他食物组。
你可以让它更通用,但由于我对不同的组有不同的逻辑,这很适合我。
function getFoodGroups() {
// return foodgroups
}
function getMailGroups() {
// return mailgroups
}
function MYMODULE_webform_submission_presave($node, &$submission) {
$groupselm = '';
$groups_cid = false;
$foods_cid = false;
$mailings_cid = false;
// http://www.webomelette.com/drupal-webform-submission-presave-hook
foreach($node->webform['components'] as $cid=>$comp) {
if ($comp['form_key']=='the_groups_element') {
$groupselm = $comp['value'];
break;
}
}
if ($groupselm) {
foreach($node->webform['components'] as $cid=>$comp) {
if ($comp['form_key']==$groupselm) $groups_cid = $comp['cid'];
if ($comp['form_key']=='the_foods') $foods_cid = $comp['cid'];
if ($comp['form_key']=='the_mailings') $mailings_cid = $comp['cid'];
}
$group_gids = $submission->data[$groups_cid];
if (!$group_gids) $group_gids=array();
if ($foods_cid!==false && $submission->data[$foods_cid]) {
// remove all current foods
foreach ($group_gids as $gidx=>$group_gid) {
foreach (getFoodGroups() as $foodgroup) {
if ($group_gid==$foodgroup['gid']) {
if ($debug) drupal_set_message('removing foodgroup '.$foodgroup['gid']);
unset($group_gids[$gidx]);
}
}
}
// validate and add submitted regions
$foodsgids = $submission->data[$foods_cid];
if (!is_array($foodsgids)) $foodsgids = array($foodsgids);
foreach ($foodsgids as $foodsgid) {
foreach (getFoodGroups() as $foodgroup) {
if ($foodsgid==$foodgroup['gid']) {
$group_gids[]=$foodsgid;
break; // only one food allowed
}
}
}
}
if ($mailings_cid!==false && $submission->data[$mailings_cid]) {
// just add submitted mailings, dont remove any
$mailinggids = $submission->data[$mailings_cid];
if (!is_array($mailinggids)) $mailinggids = array($mailinggids);
foreach ($mailinggids as $mailinggid) {
foreach (getMailGroups() as $mailing) {
if ($mailinggid==$mailing['gid']) {
if ($debug) drupal_set_message('adding mailing '.$mailing['gid']);
$group_gids[]=$mailinggid;
}
}
}
}
$submission->data[$groups_cid] = array_unique($group_gids);
}