acquia_commercemanager-8.x-1.122/modules/acm/src/Form/ConnectorSettingsForm.php

modules/acm/src/Form/ConnectorSettingsForm.php
<?php

namespace Drupal\acm\Form;

use Drupal\Core\Entity\EntityFieldManagerInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Class ConnectorSettingsForm.
 *
 * @package Drupal\acm\Form
 *
 * @ingroup acm
 */
class ConnectorSettingsForm extends ConfigFormBase {

  /**
   * The entity type manager instance.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * The entity field manager instance.
   *
   * @var \Drupal\Core\Entity\EntityFieldManagerInterface
   */
  protected $entityFieldManager;

  /**
   * The current user.
   *
   * @var \Drupal\Core\Session\AccountInterface
   */
  protected $currentUser;

  /**
   * Constructor.
   *
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   *   The entity type manager.
   * @param \Drupal\Core\Entity\EntityFieldManagerInterface $entity_field_manager
   *   The entity field manager.
   * @param \Drupal\Core\Session\AccountInterface $current_user
   *   The current user.
   */
  public function __construct(EntityTypeManagerInterface $entity_type_manager, EntityFieldManagerInterface $entity_field_manager, AccountInterface $current_user) {
    $this->entityTypeManager = $entity_type_manager;
    $this->entityFieldManager = $entity_field_manager;
    $this->currentUser = $current_user;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('entity_type.manager'),
      $container->get('entity_field.manager'),
      $container->get('current_user')
    );
  }

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'acm_connector_settings';
  }

  /**
   * {@inheritdoc}
   */
  public function getEditableConfigNames() {
    return ['acm.connector'];
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $product_node_type = $form_state->getValue('product_node_type');
    $sku_field_name = $this->getSkuFieldName($product_node_type);

    $category_vid = $form_state->getValue('category_vid');
    $category_field_name = $this->getCategoryFieldName($product_node_type, $category_vid);

    // TODO Validate Connector URL endpoints with watchdog request.
    $this->config('acm.connector')
      ->set('url', $form_state->getValue('url'))
      ->set('api_version', $form_state->getValue('api_version'))
      ->set('hmac_id', $form_state->getValue('hmac_id'))
      ->set('hmac_secret', $form_state->getValue('hmac_secret'))
      ->set('timeout', (int) $form_state->getValue('timeout'))
      ->set('verify_ssl', (bool) $form_state->getValue('verify_ssl'))
      ->set('product_page_size', (int) $form_state->getValue('product_page_size'))
      ->set('filter_root_category', (bool) $form_state->getValue('filter_root_category'))
      ->set('product_node_type', $product_node_type)
      ->set('text_format', $form_state->getValue('text_format'))
      ->set('sku_field_name', $sku_field_name)
      ->set('product_title_use_sku', (bool) $form_state->getValue('product_title_use_sku'))
      ->set('product_publish', (bool) $form_state->getValue('product_publish'))
      ->set('category_vid', $category_vid)
      ->set('category_field_name', $category_field_name)
      ->set('delete_disabled_skus', (bool) $form_state->getValue('delete_disabled_skus'))
      ->set('test_mode', (bool) $form_state->getValue('test_mode'))
      ->save();

    return parent::submitForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $config = $this->config('acm.connector');

    $form['basic'] = [
      '#type' => 'fieldset',
      '#title' => $this->t('Basic information'),
    ];

    $form['basic']['url'] = [
      '#type' => 'url',
      '#title' => $this->t('Connector URL'),
      '#required' => TRUE,
      '#default_value' => $config->get('url'),
    ];

    $form['basic']['api_version'] = [
      '#type' => 'select',
      '#title' => $this->t('API version'),
      '#required' => TRUE,
      '#default_value' => $config->get('api_version'),
      '#options' => [
        'v2' => 'V2',
        'v1' => 'V1',
      ],
    ];

    $form['security'] = [
      '#type' => 'fieldset',
      '#title' => $this->t('Security configuration'),
    ];

    $form['security']['hmac_id'] = [
      '#type' => 'password',
      '#title' => $this->t('HMAC Key ID'),
      '#required' => TRUE,
    ];

    $form['security']['hmac_secret'] = [
      '#type' => 'password',
      '#title' => $this->t('HMAC Key Secret'),
      '#required' => TRUE,
    ];

    $form['content'] = [
      '#type' => 'fieldset',
      '#title' => $this->t('Content configuration'),
    ];

    $node_types = $this->entityTypeManager
      ->getStorage('node_type')
      ->loadMultiple();

    $node_type_options = [];
    foreach ($node_types as $node_type) {
      $node_type_options[$node_type->id()] = $node_type->label();
    }

    $form['content']['product_node_type'] = [
      '#type' => 'select',
      '#title' => $this->t('Product Node Type'),
      '#description' => $this->t('Select the node type being used to display products.'),
      '#options' => $node_type_options,
      '#empty_option' => $this->t('- Select -'),
      '#required' => TRUE,
      '#default_value' => $config->get('product_node_type'),
    ];

    $form['content']['product_title_use_sku'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Enable this to use the sku as the product title.'),
      '#default_value' => $config->get('product_title_use_sku'),
    ];

    $form['content']['product_publish'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Enable this to publish new product nodes after synchronization.'),
      '#default_value' => $config->get('product_publish'),
    ];
    $form['content']['delete_disabled_skus'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Enable this to delete disabled SKUs and product nodes.'),
      '#default_value' => $config->get('delete_disabled_skus'),
    ];

    $category_vocabs = $this->entityTypeManager
      ->getStorage('taxonomy_vocabulary')
      ->loadMultiple();

    $category_vid_options = [];
    foreach ($category_vocabs as $category_vocab) {
      $category_vid_options[$category_vocab->id()] = $category_vocab->label();
    }

    $form['content']['category_vid'] = [
      '#type' => 'select',
      '#title' => $this->t('Category Vocabulary'),
      '#description' => $this->t('Select the taxonomy vocabulary to sync categories to.'),
      '#options' => $category_vid_options,
      '#empty_option' => $this->t('- Select -'),
      '#default_value' => $config->get('category_vid'),
    ];

    $form['content']['text_format'] = [
      '#type' => 'select',
      '#title' => $this->t('Text Format'),
      '#description' => $this->t('The text format to use when importing product content.'),
      '#default_value' => $config->get('text_format'),
      '#options' => $this->getFilterFormats(),
    ];

    $form['content']['filter_root_category'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Filter root level category'),
      '#default_value' => $config->get('filter_root_category'),
    ];

    $form['advanced'] = [
      '#type' => 'details',
      '#title' => $this->t('Advanced configuration'),
      '#open' => FALSE,
    ];

    $form['advanced']['timeout'] = [
      '#type' => 'number',
      '#title' => $this->t('Connector Connection Timeout'),
      '#required' => TRUE,
      '#default_value' => $config->get('timeout'),
    ];

    $form['advanced']['verify_ssl'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Connector Verify SSL'),
      '#default_value' => $config->get('verify_ssl'),
    ];

    $form['advanced']['page_size'] = [
      '#type' => 'number',
      '#title' => $this->t('Connector Product Synchronization Page Size'),
      '#default_value' => $config->get('product_page_size'),
    ];

    $form['advanced']['debug'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Debug Level Logging Of API Connections'),
      '#default_value' => $config->get('debug'),
    ];

    $form['advanced']['test_mode'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Enable test mode to return mock data'),
      '#default_value' => $config->get('test_mode'),
    ];

    return parent::buildForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
    $product_node_type = $form_state->getValue('product_node_type');
    $sku_field_name = $this->getSkuFieldName($product_node_type);

    // Make sure product node type has a SKU entity reference.
    if (!$sku_field_name) {
      $form_state->setErrorByName('product_node_type', $this->t('Node type does not contain a SKU reference field.'));
    }

    // If syncing categories, make sure the product node type has an entity
    // reference to the defined categories vocab.
    if ($category_vid = $form_state->getValue('category_vid')) {
      $category_field_name = $this->getCategoryFieldName($product_node_type, $category_vid);
      if (!$category_field_name) {
        $form_state->setErrorByName('category_vid', $this->t('Node type does not contain an entity reference to the defined Category vocabulary.'));
      }
    }
  }

  /**
   * Gets the SKU field on a given node type.
   *
   * @param string $node_type
   *   The node type to scan.
   *
   * @return string
   *   The SKU field name.
   */
  protected function getSkuFieldName($node_type) {
    $fields = $this->entityFieldManager
      ->getFieldDefinitions('node', $node_type);

    // Determine which field is used for sku references based on the configured
    // product node type.
    $sku_field_name = FALSE;
    foreach ($fields as $field_name => $field_instance) {
      $field_type = $field_instance->getType();
      if ($field_type == 'sku') {
        $sku_field_name = $field_name;
        break;
      }
    }

    return $sku_field_name;
  }

  /**
   * Gets the field used to store the category on a given node type.
   *
   * @param string $node_type
   *   The node type to scan.
   * @param string $vid
   *   The vocabulary id to check for.
   *
   * @return string
   *   The Categories field name.
   */
  protected function getCategoryFieldName($node_type, $vid) {
    $fields = $this->entityFieldManager
      ->getFieldDefinitions('node', $node_type);

    // Determine which field is used for categories based on the configured
    // product node type.
    $category_field_name = FALSE;
    foreach ($fields as $field_name => $field_instance) {
      $field_type = $field_instance->getType();
      if ($field_type != 'entity_reference') {
        continue;
      }

      $settings = $field_instance->getSettings();
      if ($settings['target_type'] != 'taxonomy_term') {
        continue;
      }

      if (in_array($vid, $settings['handler_settings']['target_bundles'])) {
        $category_field_name = $field_name;
        break;
      }
    }

    return $category_field_name;
  }

  /**
   * Get all filter formats available to the user.
   *
   * @return array
   *   An array of available html filters.
   */
  public function getFilterFormats() {
    $options = [];
    $formats = filter_formats($this->currentUser);
    foreach ($formats as $format) {
      $options[$format->id()] = $format->label();
    }
    return $options;
  }

}

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

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