You are here

private function AdminForm::addConditionalRule in Webform CiviCRM Integration 8.5

Create a conditional rule if the source and target fields both exist. TODO: This is fairly minimal. It doesn't check if the rule already exists, and doesn't work if both fields haven't been created yet.

Parameters

array $field:

array $enabled:

1 call to AdminForm::addConditionalRule()
AdminForm::postProcess in src/AdminForm.php
Submission handler, saves CiviCRM options for a Webform node

File

src/AdminForm.php, line 2113
Webform CiviCRM module's admin form.

Class

AdminForm
@file Webform CiviCRM module's admin form.

Namespace

Drupal\webform_civicrm

Code

private function addConditionalRule($field, $enabled) {
  $utils = \Drupal::service('webform_civicrm.utils');
  list(, $c, $ent, $n, $table, $name) = explode('_', $field['form_key'], 6);
  $rgid = $weight = -1;
  foreach ($this->node->webform['conditionals'] as $rgid => $existing) {
    $weight = $existing['weight'];
  }
  $rgid++;
  $rule_group = $field['civicrm_condition'] + [
    'nid' => $this->node->nid,
    'rgid' => $rgid,
    'weight' => $weight,
    'actions' => [
      [
        'target' => $enabled[$field['form_key']],
        'target_type' => 'component',
        'action' => $field['civicrm_condition']['action'],
      ],
    ],
  ];
  $rule_group['rules'] = [];
  foreach ($field['civicrm_condition']['rules'] as $source => $condition) {
    $source_key = "civicrm_{$c}_{$ent}_{$n}_{$source}";
    $source_id = wf_crm_aval($enabled, $source_key);
    if ($source_id) {
      $options = $utils
        ->wf_crm_field_options([
        'form_key' => $source_key,
      ], '', $this->settings['data']);
      foreach ((array) $condition['values'] as $value) {
        if (isset($options[$value])) {
          $rule_group['rules'][] = [
            'source_type' => 'component',
            'source' => $source_id,
            'operator' => wf_crm_aval($condition, 'operator', 'equal'),
            'value' => $value,
          ];
        }
      }
    }
  }
  if ($rule_group['rules']) {
    $this->node->webform['conditionals'][] = $rule_group;
    \Drupal::ModuleHandler()
      ->loadInclude('webform', 'inc', 'includes/webform.conditionals');
    webform_conditional_insert($rule_group);
  }
}