webform_civicrm-8.x-5.0-beta3/webform_civicrm.install

webform_civicrm.install
<?php

/**
 * @file
 * Webform CiviCRM module's install, uninstall and upgrade code.
 */

use Drupal\webform\Entity\Webform;
use Drupal\Core\Form\FormState;

/**
 * Implements hook_requirements().
 */
/*
function webform_civicrm_requirements($phase) {
  $requirements = array();

  if ($phase == 'runtime') {
    $t = get_t();
    $status = _webform_civicrm_status();
    if (!$status['webform_civicrm']) {
      $requirements['webform_civicrm'] = array(
        'title' => 'Webform CiviCRM Integration',
        'value' => $t('Version error'),
        'severity' => REQUIREMENT_ERROR,
        'description' => $t('The versions of the Webform CiviCRM Integration, Webform, CiviCRM enabled are not compatible. ') .
        l($t('See the Webform CiviCRM Integration project page for version compatibility'), 'https://drupal.org/project/webform_civicrm'),
      );
    }
    else {
      $requirements['webform_civicrm'] = array(
        'title' => 'Webform CiviCRM Integration',
        'severity' => REQUIREMENT_OK,
        'value' => t('Required version of CiviCRM and Webform are enabled.'),
      );
    }
  }

  return $requirements;
}
*/

/**
 * Implements hook_schema().
 */
function webform_civicrm_schema() {
  $schema = [];
  $schema['webform_civicrm_forms'] = [
    'description' => 'CiviCRM settings for individual Webform nodes.',
    'fields' => [
      'nid' => [
        'type' => 'int',
        'unsigned' => TRUE,
        'not null' => TRUE,
        'default' => 0,
        'description' => 'Webform Node ID',
      ],
      'data' => [
        'type' => 'text',
        'serialize' => TRUE,
        'description' => 'Array of entity data for this webform',
      ],
      'prefix_known' => [
        'description' => 'Form prefix for known users.',
        'type' => 'text',
        'not null' => TRUE,
      ],
      'prefix_unknown' => [
        'description' => 'Form prefix for unknown users.',
        'type' => 'text',
        'not null' => TRUE,
      ],
      'message' => [
        'type' => 'varchar',
        'length' => 255,
        'not null' => TRUE,
        'default' => '',
        'description' => 'Message to show to known users',
      ],
      'confirm_subscription' => [
        'description' => 'Send confirmation for mailing list subscriptions.',
        'type' => 'int',
        'size' => 'tiny',
        'not null' => TRUE,
        'default' => 0,
      ],
      'block_unknown_users' => [
        'description' => 'Only allow known contacts to use form.',
        'type' => 'int',
        'size' => 'tiny',
        'not null' => TRUE,
        'default' => 0,
      ],
      'create_new_relationship' => [
        'description' => 'Create new relationship if duplicate record exists and is expired or inactive.',
        'type' => 'int',
        'size' => 'tiny',
        'not null' => TRUE,
        'default' => 0,
      ],
      'create_fieldsets' => [
        'description' => 'Add fieldsets around contacts.',
        'type' => 'int',
        'size' => 'tiny',
        'not null' => TRUE,
        'default' => 0,
      ],
      'new_contact_source' => [
        'type' => 'varchar',
        'length' => 255,
        'not null' => TRUE,
        'default' => '',
        'description' => 'Source label for newly created contacts',
      ],
    ],
    'primary key' => ['nid'],
  ];
  $schema['webform_civicrm_submissions'] = [
    'description' => 'Link between form submissions and CiviCRM data.',
    'fields' => [
      'sid' => [
        'type' => 'int',
        'unsigned' => TRUE,
        'not null' => TRUE,
        'default' => 0,
        'description' => 'Webform Submission ID',
      ],
      'contact_id' => [
        'type' => 'varchar',
        'length' => 2000,
        'not null' => TRUE,
        'default' => '',
        'description' => 'CiviCRM contact ids from this submission',
      ],
      'civicrm_data' => [
        'type' => 'text',
        'serialize' => TRUE,
        'description' => 'Array of entity ids for this submission',
      ],
    ],
    'primary key' => ['sid'],
  ];
  return $schema;
}

/**
 * Update receipt setting as per the value set in the contribution page.
 */
function webform_civicrm_update_8001() {
  \Drupal::service('civicrm')->initialize();
  $utils = \Drupal::service('webform_civicrm.utils');
  $webforms = Webform::loadMultiple();
  foreach ($webforms as $webform) {
    $handler = $webform->getHandlers('webform_civicrm');
    $config = $handler->getConfiguration();
    if (empty($config['webform_civicrm'])) {
      continue;
    }
    $contribution = wf_crm_aval($config, "webform_civicrm:settings:data:contribution:1:contribution:1", []);
    if (!empty($contribution['contribution_page_id'])) {
      $returnParams = [
        "financial_type_id", "currency", "bcc_receipt", "cc_receipt",
        "receipt_text", "pay_later_receipt", "receipt_from_name", "receipt_from_email", "is_email_receipt"
      ];
      $contribution_page = current($utils->wf_crm_apivalues('ContributionPage', 'get', [
        'return' => $returnParams,
        'id' => $contribution['contribution_page_id'],
      ]));
      $settings = &$config['webform_civicrm']['settings'];
      $settings['civicrm_1_contribution_1_contribution_enable_contribution'] = $settings['data']['contribution'][1]['contribution'][1]["enable_contribution"] = 1;
      unset($settings['data']['contribution'][1]['contribution'][1]["contribution_page_id"]);
      $settings['civicrm_1_contribution_1_contribution_financial_type_id'] = $settings['data']['contribution'][1]['contribution'][1]["financial_type_id"] = $contribution_page['financial_type_id'] ?? '';
      $settings['contribution_1_settings_currency'] = $settings['data']['contribution'][1]['currency'] = $contribution_page['currency'] ?? '';
      if (!empty($contribution_page['is_email_receipt'])) {
        $settings['receipt_1_number_of_receipt'] = $settings['data']['receipt']['number_number_of_receipt'] = 1;
        $receiptValues = ['cc_receipt', 'bcc_receipt', 'receipt_text', 'pay_later_receipt', 'receipt_from_name', 'receipt_from_email'];
        foreach ($receiptValues as $val) {
          $settings["receipt_1_number_of_receipt_{$val}"] = $settings['data']['receipt']["number_number_of_receipt_{$val}"] =  $contribution_page[$val] ?? '';
        }
      }
      $handler->setConfiguration($config);
      $webform->save();
    }
  }
}

/**
 * Remove timepart field from
 * all the webforms.
 */
function webform_civicrm_update_8002() {
  \Drupal::service('civicrm')->initialize();
  $webforms = Webform::loadMultiple();
  foreach ($webforms as $webform) {
    $handler = $webform->getHandlers('webform_civicrm');
    $config = $handler->getConfiguration();
    if (empty($config['webform_civicrm'])) {
      continue;
    }
    $settings = &$config['webform_civicrm']['settings'];
    foreach ($settings as $key => $val) {
      if (substr($key, -9) == '_timepart') {
        $dateKey = str_replace('_timepart', '', $key);
        $dateElement = $webform->getElement($dateKey);
        $timeElement = $webform->getElement($key);
        if ($dateElement['#type'] == 'date') {
          $dateElement['#type'] = 'datetime';
          $dateElement['#date_time_step'] = '60';
          $dateElement['#date_date_min'] = !empty($dateElement['#extra']['start_date']) ? $dateElement['#extra']['start_date'] : '-50 years';
          $dateElement['#date_date_max'] = !empty($dateElement['#extra']['end_date']) ? $dateElement['#extra']['end_date'] : '+50 years';
          unset($dateElement['#extra']);
          if (!empty($timeElement['#extra']['hourformat']) && $timeElement['#extra']['hourformat'] == '24-hour') {
            $dateElement['#date_time_element'] = 'timepicker';
            $dateElement['#date_time_placeholder'] = 'hh:mm';
            $dateElement['#date_time_format'] = 'H:i';
          }
          if (!empty($dateElement['#admin_title'])) {
            $dateElement['#admin_title'] = str_replace(' - date', '', $dateElement['#admin_title']);
          }
          if (!empty($dateElement['#title'])) {
            $dateElement['#title'] = str_replace(' - date', '', $dateElement['#title']);
          }
          unset($dateElement['#webform_plugin_id']);
          unset($settings[$key]);
          $webform->setElementProperties($dateKey, $dateElement);
          $webform->deleteElement($key);
        }
      }
    }
    $handler->setConfiguration($config);
    $webform->save();
  }
}

/**
 * Add Billing fields to the webforms
 */
function webform_civicrm_update_8003() {
  \Drupal::service('civicrm')->initialize();
  $utils = \Drupal::service('webform_civicrm.utils');
  $fields = \Drupal::service('webform_civicrm.fields');
  $fieldOptions = \Drupal::service('webform_civicrm.field_options');
  $adminForm = \Drupal::service('webform_civicrm.admin_form');
  $billingFields = ['first_name', 'middle_name', 'last_name', 'street_address', 'postal_code', 'city', 'country_id', 'state_province_id'];

  $ppFormKey = 'civicrm_1_contribution_1_contribution_payment_processor_id';
  $webforms = Webform::loadMultiple();
  foreach ($webforms as $webform) {
    $handler = $webform->getHandlers('webform_civicrm');
    $config = $handler->getConfiguration();
    $settings = &$config['webform_civicrm']['settings'] ?? [];
    $data = $settings['data'] ?? [];
    $element = $webform->getElement($ppFormKey);
    $options = [];
    if (!empty($element)) {
      $options = $element['#options'] ?? [];
      if (!empty($element['#civicrm_live_options']) && empty($options)) {
        $options = $fieldOptions->get(['form_key' => $ppFormKey], 'create', $data);
      }
    }
    if (empty($options) && is_numeric($data['contribution'][1]['contribution'][1]['payment_processor_id'])) {
      $options[$data['contribution'][1]['contribution'][1]['payment_processor_id']] = '';
    }
    if (empty($options)) {
      continue;
    }
    //If any of the payment processor allow billing fields, enable billing on the form.
    $addBilling = FALSE;
    foreach ($options as $ppID => $ppName) {
      $processor = civicrm_api3('PaymentProcessor', 'get', [
        'id' => $ppID,
        'billing_mode' => ['IN' => [1, 3]],
      ]);
      if (!empty($processor['count'])) {
        $addBilling = TRUE;
        break;
      }
    }
    if (!$addBilling || isset($settings['billing_1_number_of_billing'])) {
      continue;
    }
    $enabled = $utils->wf_crm_enabled_fields($webform, NULL, TRUE);
    $settings['billing_1_number_of_billing'] = 1;
    $settings['data']['billing']['number_number_of_billing'] = 1;
    //Fill required keys in settings.
    foreach ($billingFields as $fld) {
      $key = "civicrm_1_contribution_1_contribution_billing_address_{$fld}";
      $settings[$key] = 'create_civicrm_webform_element';
    }
    //Insert components in the webform.
    foreach ($billingFields as $fld) {
      $field = $fields->get()["contribution_billing_address_{$fld}"] ?? '';
      $field['form_key'] = "civicrm_1_contribution_1_contribution_billing_address_{$fld}";
      $adminForm::insertComponent($field, $enabled, $settings, TRUE);
    }
    $stub_form = [];
    $stub_form_state = new FormState();
    $adminForm->initialize($stub_form, $stub_form_state, $webform);
    $adminForm->addEnabledElements($enabled);

    $handler->setConfiguration($config);
    $webform->save();
  }
}

/**
 * Change text state fields to civicrm options.
 */
function webform_civicrm_update_8004() {
  $stateFormKey = 'address_state_province_id';
  $countyFormKey = 'address_county_id';
  $webforms = Webform::loadMultiple();
  foreach ($webforms as $webform) {
    $handler = $webform->getHandlers('webform_civicrm');
    $config = $handler->getConfiguration();
    if (empty($config['webform_civicrm'])) {
      continue;
    }
    $settings = &$config['webform_civicrm']['settings'] ?? [];
    foreach ($settings as $key => $val) {
      if (strpos($key, $stateFormKey) !== false || strpos($key, $countyFormKey) !== false) {
        $element = $webform->getElement($key);
        if (!empty($element['#type']) && $element['#type'] == 'textfield') {
          $element = array_merge($element, [
            '#type' => 'civicrm_options',
            '#webform_plugin_id' => 'civicrm_options',
            '#extra' => ['aslist' => 1],
            '#civicrm_live_options' => 0,
            '#empty_option' => '- None -',
            '#options' => [],
          ]);
          $webform->setElementProperties($element['#form_key'], $element);
        }
      }
    }
    $webform->save();
  }
}

/**
 * Set Contact 1 as the assigned for Contributions in all webforms
 * (It keeps default behavior <= 6.2.0)
 */
function webform_civicrm_update_8005() {
  \Drupal::service('civicrm')->initialize();
  $webforms = Webform::loadMultiple();
  foreach ($webforms as $webform) {
    $handler = $webform->getHandlers('webform_civicrm');
    $config = $handler->getConfiguration();
    if (empty($config['webform_civicrm'])) {
      continue;
    }
    $settings = &$config['webform_civicrm']['settings'];
    // If Contribution enabled, set Contact 1 assigned as default behavior <= 6.2.0
    if ($settings['civicrm_1_contribution_1_contribution_enable_contribution'] == "1") {
      $settings['civicrm_1_contribution_1_contribution_contact_id'] = 1;
      $settings['data']['contribution'][1]['contribution'][1]['contact_id'] = 1;
      $handler->setConfiguration($config);
      $webform->save();
    }
  }
}

/**
 * Fix contact subtype case in existing webforms.
 */
function webform_civicrm_update_8006() {
  \Drupal::service('civicrm')->initialize();
  $utils = \Drupal::service('webform_civicrm.utils');
  $subTypes = $utils->wf_crm_apivalues('Contact', 'getoptions', [
    'field' => "contact_sub_type",
  ]);
  if (empty($subTypes)) {
    return;
  }
  // change keys to lowercase
  $subTypes = array_change_key_case($subTypes, CASE_LOWER);

  $webforms = Webform::loadMultiple();
  foreach ($webforms as $webform) {
    $handler = $webform->getHandlers('webform_civicrm');
    $config = $handler->getConfiguration();
    if (empty($config['webform_civicrm'])) {
      continue;
    }
    $settings = &$config['webform_civicrm']['settings'];

    $settings_updated = FALSE;
    foreach ($settings as $key => &$value) {
      if (preg_match('/contact_contact_sub_type$/', $key)) {
        foreach ($value as $k => $v) {
          if (strtolower($k) == $k && !empty($subTypes[$k])) {
            $value[$subTypes[$k]] = $subTypes[$k];
            unset($value[$k]);
            $settings_updated = TRUE;
          }
        }
      }
    }
    // Update data key in settings to have the correct case for subtype.
    $data = &$settings['data'];
    foreach ($data['contact'] as $key => &$contact) {
      if (!empty($contact['contact'][1]['contact_sub_type'])) {
        foreach ($contact['contact'][1]['contact_sub_type'] as $k => $v) {
          if (strtolower($k) == $k && !empty($subTypes[$k])) {
            $contact['contact'][1]['contact_sub_type'][$subTypes[$k]] = $subTypes[$k];
            unset($contact['contact'][1]['contact_sub_type'][$k]);
            $settings_updated = TRUE;
          }
        }
      }
    }

    if ($settings_updated) {
      $handler->setConfiguration($config);
      $webform->save();
    }
  }
}

/**
 * Fix old soft credit data.
 */
function webform_civicrm_update_8007() {
  \Drupal::service('civicrm')->initialize();
  $webforms = Webform::loadMultiple();
  foreach ($webforms as $webform) {
    $handler = $webform->getHandlers('webform_civicrm');
    $config = $handler->getConfiguration();
    if (empty($config['webform_civicrm'])) {
      continue;
    }
    $data = &$config['webform_civicrm']['settings']['data'];
    if (empty($data['contribution'][1]['contribution'][1])) {
      continue;
    }
    $contribution = $data['contribution'][1]['contribution'][1];
    if (!empty($contribution['honor_contact_id']) && !empty($contribution['honor_type_id'])) {
      $data['contribution'][1]['contribution'][1]['soft'][$contribution['honor_contact_id']] = $contribution['honor_contact_id'];
      $data['contribution'][1]['contribution'][1]['soft_credit_type_id'] = $contribution['honor_type_id'];
      $handler->setConfiguration($config);
      $webform->save();
    }
  }
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc