в веб-форме civicrm создайте несколько полей «группы»

В веб-форме CiviCRM вы можете «включить теги и группы». Их настройка позволяет создавать элементы параметров в веб-форме.

Это создает один «виджет», один раскрывающийся список или набор флажков. У меня есть два экземпляра поля, где я хочу, чтобы пользователь выбрал группу, например,

  • какие списки рассылки вы хотите получать (a,b,c)
  • какая еда вас интересует (г, д, е)

a,b,c,d,e и f — все группы. Я не могу это изменить.

Как я мог это сделать?


person commonpike    schedule 19.02.2015    source источник
comment
группы являются просто примерами. я не могу изменить их, но не хотел бы, если бы мог - семантически они обе группы, просто разные группы.   -  person commonpike    schedule 20.02.2015


Ответы (2)


Техническое предложение ниже, но сначала я бы посоветовал вам не использовать группы для второго вопроса. Группы хорошо настроены для обработки списков рассылки, но если они предназначены для отслеживания интересов, вам лучше настроить их как настраиваемые поля. Это решит эту насущную проблему и облегчит работу с тандемными поисками и т. д. (в списке 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');

С точки зрения обработки формы все они будут оцениваться как поле «группы». Однако они будут выглядеть раздельно. К лучшему или к худшему, это придется корректировать по мере добавления новых групповых полей.

person Andrew Hunt    schedule 19.02.2015
comment
Спасибо за предложение. Я использовал это некоторое время, но был недоволен, поскольку списки рассылки и интересы в еде (как в примере) менялись, и мне потребовалось обновить код jQuery, чтобы он соответствовал... - person commonpike; 02.11.2015

После некоторого использования предложения Эндрю Хантса я, наконец, решил это на стороне сервера, в пользовательском модуле, используя логику веб-формы, как описано здесь http://www.webomelette.com/drupal-webform-submission-presave-hook

По сути, при предварительном сохранении я ищу 2 настраиваемых поля, содержащих идентификаторы групп (почта и еда в примере). Затем я добавляю их в поле групп 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);

    }
person commonpike    schedule 02.11.2015