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