【问题标题】:in a civicrm webform, create multiple 'groups' fields在 civicrm 网络表单中,创建多个“组”字段
【发布时间】:2015-02-19 18:59:00
【问题描述】:

在 CiviCRM 网络表单中,您可以“启用标签和组”。配置这些允许您在网络表单中创建选项元素。

这会创建一个“小部件”、一个下拉菜单或一组复选框。我有两个字段实例,我希望用户在其中选择一个组 - 例如

  • 您希望接收哪些邮件列表 (a,b,c)
  • 你对什么食物感兴趣(d,e,f)

a,b,c,d,e 和 f 都是组。我无法改变这一点。

我该怎么做?

【问题讨论】:

  • 这些组只是示例。我不能改变它们,但如果可以的话我不想改变——它们在语义上都是两个组,只是不同类型的组。

标签: drupal-webform civicrm


【解决方案1】:

以下是技术建议,但首先,我建议您真正的解决方案是不要将组用于第二个问题。组很好地设置来处理邮件列表,但如果它是为了跟踪兴趣,你最好将它们设置为自定义字段。它会解决这个直接的问题,并且会更容易处理串联搜索等(在列表 b 和喜欢食物 d 上)。

现在,如果您必须将它们作为组,您可以创建一个假字段并使用 jQuery 将复选框移动到其中。使用您不关心的一个选项创建假字段,但将其标记为“您对什么食物感兴趣”或等效项。然后,编辑 CiviCRM 生成的组字段:将其更具体地标记为“哪些邮件列表...”,然后选择静态选项,这样它就不会开始提供任何组供某人选择。

现在,添加以下 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');

从表单处理的角度来看,它们都将被评估为“组”字段。但是,它们看起来是分开的。无论好坏,都必须在添加新组字段时进行调整。

【讨论】:

  • 感谢您的建议。我已经使用了一段时间,但不满意邮件列表和食物兴趣(根据示例)正在发生变化,并要求我更新 jQuery 代码以匹配...
【解决方案2】:

在使用 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);

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多