acquia_vwo-1.0.x-dev/src/Service/User/UserControl.php

src/Service/User/UserControl.php
<?php

namespace Drupal\acquia_vwo\Service\User;

use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Render\Markup;
use Drupal\Core\Session\AccountProxyInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\user\UserData;
use Drupal\user\UserDataInterface;

// cspell:ignore cfasync nocontrol optout
/**
 * User Control class.
 */
class UserControl {

  use StringTranslationTrait;

  /**
   * The current user.
   *
   * @var \Drupal\Core\Session\AccountProxyInterface
   */
  protected $account;

  /**
   * Data of the user.
   *
   * @var \Drupal\user\UserDataInterface
   */
  protected UserDataInterface $userData;

  /**
   * Acquia VWO config.
   *
   * @var \Drupal\Core\Config\ImmutableConfig
   */
  private $config;

  /**
   * Constructor for Acquia VWO class.
   *
   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
   *   The config factory service.
   * @param \Drupal\Core\Session\AccountProxyInterface $account
   *   The current user.
   * @param \Drupal\user\UserData $userData
   *   Data of the user.
   */
  public function __construct(
    ConfigFactoryInterface $config_factory,
    AccountProxyInterface $account,
    UserData $userData,
  ) {
    $this->config = $config_factory->get('acquia_vwo.settings');
    $this->account = $account;
    $this->userData = $userData;
  }

  /**
   * User form alter.
   *
   *  Adds an extra field to the user profile to allow users to choose
   *  how to load VWO scripts.
   *
   * @param array $form
   *   The user form.
   */
  public function userFormAlter(&$form) {
    // Check if VWO account ID is configured.
    if (!is_numeric($this->config->get('id'))) {
      return;
    }

    // Check if user control is enabled.
    $user_control = $this->config->get('visibility.user_control');
    if ($user_control == 'nocontrol') {
      return;
    }
    $enabled = ($user_control === 'optin') ? 0 : 1;

    // User settings stored in user.data.
    $user_opt = $this->userData->get('acquia_vwo', $this->account->id(), 'user_opt');
    if (isset($user_opt)) {
      $enabled = $user_opt;
    }

    $form['vwo_user'] = [
      '#type' => 'details',
      '#open' => TRUE,
      '#title' => $this->t('VWO'),
    ];

    $form['vwo_user']['user_opt'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Include VWO A/B testing'),
      '#description' => $this->t('This website may run A/B testing at times. If this box is checked, the javascript required for it to work will be included.'),
      '#default_value' => $enabled,
    ];

    $form['actions']['submit']['#submit'][] = 'acquia_vwo_form_user_form_alter_submit';
  }

  /**
   * Saves user data.
   *
   * @param string $name
   *   The name of the data key.
   * @param string $user_opt
   *   The user_opt is '0' for disabled and '1' for enabled.
   */
  public function saveUserData($name, $user_opt) {
    $this->userData->set('acquia_vwo', $this->account->id(), $name, $user_opt);
  }

  /**
   * User opt script.
   *
   * Add drupal settings to the page, to let the user_opt library set the value
   * in the browser's local storage. The value from local storage is used by
   * the VWO scripts to let the user decide if they want to opt in/out.
   *
   * @param array $page
   *   The page array.
   */
  public function addUserOptScript(&$page) {
    $user_control = $this->config->get('visibility.user_control');
    $user_opt = NULL;

    // Check if user is authenticated.
    $uid = $this->account->id();
    if ($uid > 0) {
      $user_opt = $this->userData->get('acquia_vwo', $this->account->id(), 'user_opt');
    }

    // Check user preferences to control script visibility using data
    // from the local storage.
    // The user data is added to the local storage when the page loads.
    $script = "const acquiaVwoUserOptOut = function () {
      if ('$user_control' == 'optout') {
        return (localStorage.getItem('acquia_vwo_user_opt') !== null &&
                localStorage.getItem('acquia_vwo_user_opt') == '0');
      }
      if ('$user_control' == 'optin') {
        return (localStorage.getItem('acquia_vwo_user_opt') === null ||
                localStorage.getItem('acquia_vwo_user_opt') == '0');
      }
      return false;
    }" . PHP_EOL;

    // Create the header script.
    $header = [
      [
        '#tag' => 'script',
        '#attributes' => [
          'data-cfasync' => 'false',
          'type' => 'text/javascript',
        ],
        '#value' => Markup::create($script),
      ],
      'acquia_vwo_user_control',
    ];

    $page['#attached']['drupalSettings']['user']['vwo_user_opt'] = $user_opt;
    $page['#attached']['library'][] = 'acquia_vwo/user_opt';
    $page['#attached']['html_head'][] = $header;
  }

}

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

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