1

CiviCRM Web フォームでは、「タグとグループを有効にする」ことができます。これらを構成すると、Web フォームでオプション要素を作成できます。

これにより、1 つの「ウィジェット」、1 つのドロップダウン、またはチェックボックスのセットが作成されます。ユーザーにグループを選択させたい2つのフィールドインスタンスがあります-たとえば

  • どのメーリングリストを受け取りたいですか (a,b,c)
  • どの食べ物に興味がありますか (d,e,f)

a、b、c、d、e、および f はすべてグループです。私はそれを変更することはできません。

どうすればそれができますか?

4

2 に答える 2

2

以下の技術的な提案ですが、最初に、2番目の質問にグループを使用しないことが実際の解決策であることをお勧めします。グループはメーリング リストを処理するように適切に設定されていますが、関心を追跡する場合は、それらをカスタム フィールドとして設定することをお勧めします。これにより、この差し迫った問題が解決され、タンデム検索など (リスト b と好きな食べ物 d) に対処しやすくなります。

それらをグループとして持つ必要がある場合は、偽のフィールドを作成し、jQuery を使用してチェックボックスをそこに移動できます。気にしないオプションを 1 つ指定して偽のフィールドを作成しますが、「どの食べ物に興味がありますか」または同等のラベルを付けます。次に、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');

フォーム処理の観点からは、それらはすべて「グループ」フィールドとして評価されます。ただし、それらは別々に見えます。良くも悪くも、新しいグループ フィールドを追加するときに、これを調整する必要があります。

于 2015-02-19T23:31:23.003 に答える
0

Andrew Huntsの提案をしばらく使用した後、ここで説明されているように、カスタムモジュールでWebフォームロジックを使用して、サーバー側でこれを最終的に解決しました http://www.webomelette.com/drupal-webform-submission-presave-hook

基本的に、事前保存時に、グループ ID を含む 2 つのカスタム フィールドを探します (この例では郵送と食品)。次に、これらを CiviCRM グループ フィールドに追加します。

以下のコードを追加します。これにはさらにロジックがあります。

  • 柔軟にするために、1 つの隠しフィールドを使用して、civicrm グループ セレクターのフィールドキーを格納し、他のフィールドを追加します。そのフィールドは「the_groups_element」と呼ばれます (ただし、グループ要素ではなく、グループ要素のキーが含まれます)。
  • 食品グループは 1 つしか許可されていないため、食品グループに追加する前に、他のすべての食品グループをグループ セレクターから削除します。

おそらくもっと一般的なものにすることもできますが、私はグループごとに異なるロジックを持っていたので、これは私に適していました.

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);

    }
于 2015-11-02T13:33:31.307 に答える