acquia_commercemanager-8.x-1.122/modules/acm/src/Connector/IngestAPIWrapper.php

modules/acm/src/Connector/IngestAPIWrapper.php
<?php

namespace Drupal\acm\Connector;

use Drupal\acm\I18nHelper;
use Drupal\Core\Logger\LoggerChannelFactory;
use Drupal\Core\Config\ConfigFactoryInterface;

/**
 * IngestAPIWrapper class.
 */
class IngestAPIWrapper {

  use \Drupal\acm\Connector\IngestRequestTrait;

  /**
   * Configured size of page.
   *
   * @var int
   */
  protected $productPageSize;

  /**
   * Instance of I18nHelper service.
   *
   * @var \Drupal\acm\I18nHelper
   */
  protected $i18nHelper;

  /**
   * Debug dir path.
   *
   * @var string
   */
  protected $debugDir;

  /**
   * API version identifier.
   *
   * @var string
   */
  protected $apiVersion;

  /**
   * Constructor.
   *
   * @param ClientFactory $client_factory
   *   Object of ClientFactory.
   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
   *   Object of ConfigFactoryInterface.
   * @param \Drupal\Core\Logger\LoggerChannelFactory $logger_factory
   *   Object of LoggerFactory.
   * @param \Drupal\acm\I18nHelper $i18nHelper
   *   Instance of I18nHelper service.
   */
  public function __construct(ClientFactory $client_factory, ConfigFactoryInterface $config_factory, LoggerChannelFactory $logger_factory, I18nHelper $i18nHelper) {
    $this->clientFactory = $client_factory;
    $this->logger = $logger_factory->get('acm_sku');
    $this->apiVersion = $config_factory->get('acm.connector')->get('api_version');
    $this->debug = $config_factory->get('acm.connector')->get('debug');
    $this->debugDir = $config_factory->get('acm.connector')->get('debug_dir');
    $this->productPageSize = $config_factory->get('acm.connector')->get('product_page_size');
    $this->i18nHelper = $i18nHelper;
  }

  /**
   * Performs full connector sync.
   *
   * @param string $skus
   *   List of SKUs.
   * @param int $product_page_size
   *   Override for product page size.
   * @param string $store_id
   *   Optional store_id if specified you must specify a langcode.
   * @param string $langcode
   *   Optional laguage code. If specified you must specify a $storeId.
   * @param string $categoryId
   *   Optional. The category ID to sync from. If specified, skus are ignored
   *   and all skus of that category are synchronised.
   */
  public function productFullSync($skus = '', $product_page_size = 0, $store_id = "", $langcode = "", $categoryId = "") {
    if (empty($product_page_size)) {
      $product_page_size = (int) $this->productPageSize;
    }
    else {
      $product_page_size = (int) $product_page_size;
    }

    if (!($store_id && $langcode)) {
      $languageMap = $this->i18nHelper->getStoreLanguageMapping();
    }
    else {
      $languageMap = [$langcode => $store_id];
    }

    foreach ($languageMap as $langcode => $store_id) {
      if (empty($store_id)) {
        continue;
      }

      // At 20180228 store_id *is* acm_uuid is enforced
      // $store_id is sent in the query string
      // $acm_uuid is sent in the X-ACM-UUID header
      // It must only be this way:
      $acm_uuid = $store_id;

      if ($this->debug && !empty($this->debugDir)) {
        // Export product data into file.
        $filename = $this->debugDir . '/products_' . $langcode . '.data';
        $fp = fopen($filename, 'w');
        fclose($fp);
      }

      $endpoint = $this->apiVersion . '/ingest/product/sync';

      // $store_id is sent in the query string.
      $doReq = function ($client, $opt) use ($endpoint, $store_id, $skus, $product_page_size, $categoryId) {
        if ($product_page_size > 0) {
          $opt['query']['page_size'] = $product_page_size;
        }

        if (!empty($categoryId)) {
          $opt['query']['category_id'] = (string) $categoryId;

          // Function tryIngestRequest always sets the skus.
          // But in this case (category sync) we force no skus
          // always send all the skus in the category.
          unset($opt['query']['skus']);
        }
        elseif (!empty($skus)) {
          $opt['query']['skus'] = $skus;
        }

        $opt['query']['store_id'] = $store_id;

        // To allow hmac sign to be verified properly we need them in asc order.
        // Really?
        ksort($opt['query']);

        return $client->post($endpoint, $opt);
      };

      try {
        // $acm_uuid is set in the header of the client.
        $this->tryIngestRequest($doReq, 'productFullSync', 'products', $skus, $acm_uuid);
      }
      catch (ConnectorException $e) {
        throw new RouteException(__FUNCTION__, $e->getMessage(), $e->getCode());
      }
    }
  }

}

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

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