cmlapi-8.x-1.2/src/Service/ParserCatalog.php

src/Service/ParserCatalog.php
<?php

namespace Drupal\cmlapi\Service;

/**
 * Class Parser Catalog.
 */
class ParserCatalog extends ParserBase {

  /**
   * Parse.
   */
  public function parseFlatCatalog($cid = FALSE, $cache_on = TRUE) {
    $rows = [];
    $expire = \Drupal::time()->getRequestTime() + 60 * 60 * 24 * 1;
    $uris = $this->cmlService->getFilesPath($cid, 'import');
    if ($uris) {
      foreach ($uris as $uri) {
        $row = $this->getFromCache($uri, $cache_on);
        if (empty($rows)) {
          $rows = $row;
        }
        else {
          $rows = array_merge($rows, $row);
        }
      }
    }
    return $rows;
  }

  /**
   * Get Data.
   */
  private function getFromCache($uri, $cache_on) {
    $expire = \Drupal::time()->getRequestTime() + 60 * 60 * 24 * 1;
    $row = [];
    $row = &drupal_static("ParserCatalog::getRows():$uri");
    if (!isset($row)) {
      $cache_key = 'ParserCatalog:' . $uri;
      if (!$cache_on) {
        $cache_key .= rand();
      }
      if ($cache = \Drupal::cache()->get($cache_key)) {
        $row = $cache->data;
      }
      else {
        if ($uri) {
          $data = $this->getData($uri);
          if (!empty($data)) {
            $row = $data;
          }
        }
        \Drupal::cache()->set($cache_key, $row, $expire);
      }
    }
    return $row;
  }

  /**
   * Get Data.
   */
  private function getData($uri) {
    $this->xmlParserService->parseXmlFileHeader($uri);
    if ($xml = $this->xmlParserService->xmlString ?? "") {
      $data = $this->parseGroup($xml, TRUE);
    }
    return $data;
  }

  /**
   * Parse.
   */
  public function parse($cid = FALSE) : array {
    $data = [];
    $uris = $this->cmlService->getFilesPath($cid, 'import');
    if ($uris) {
      foreach ($uris as $uri) {
        $xml = $this->xmlParserService->parseXmlFileHeader($uri);
        if ($xml) {
          $this->xmlParserService->parseXmlString($xml);
          $data = [
            'catalog' => $this->parseGroup(),
            'group' => $this->parseGroup(FALSE),
            'svoistvo' => $this->parseSvoistvo($xml),
            'category' => $this->parseCategory($xml),
          ];
        }
      }
    }
    return $data;
  }

  /**
   * Категории это типы товаров.
   */
  private function parseCategory() : array {
    $result = [];
    $data = $this->xmlParserService->get('import', 'category');
    foreach ($data as $cat) {
      $id = $cat['Ид'];
      if (!empty($cat['Свойства']['Ид'])) {
        if (is_string($cat['Свойства']['Ид'])) {
          // Если только один Ид.
          $cat['Свойства']['Ид'] = [$cat['Свойства']['Ид']];
        }
        $props = [];
        foreach ($cat['Свойства']['Ид'] as $pid) {
          $props[$pid] = [];
        }
        $cat['Свойства'] = $props;
      }
      else {
        $cat['Свойства'] = [];
      }
      $result[$id] = $cat;
    }
    return $result;
  }

  /**
   * Фичи - поля типа товара (категории) которые не справочники.
   */
  private function parseSvoistvo() : array {
    $data = $this->xmlParserService->get('import', 'svoistvo');
    $result = [];
    foreach ($data as $svoistvo) {
      $id = $svoistvo['Ид'];
      $result[$id] = $svoistvo;
      switch ($svoistvo['ТипЗначений'] ?? "") {
        case 'Справочник':
          $result[$id]['values'] = $this->itemsList($svoistvo);
          break;

        case 'Строка':
          break;

        default:
          break;
      }
    }
    return $result;
  }

  /**
   * Фичи - поля типа товара (категории) которые не справочники.
   */
  private function itemsList(array $svoistvo) : array {
    $items = [];
    $dictionary = \Drupal::service('cmlapi.xml_parser')
      ->arrayNormalize($svoistvo['ВариантыЗначений']['Справочник']);
    foreach ($dictionary as $k => $item) {
      $k = $item['ИдЗначения'];
      $items[$k] = $item['Значение'];
    }
    return $items;
  }

  /**
   * Группы - структура таксономии каталог.
   */
  private function parseGroup(bool $flatTree = TRUE) {
    $tree = $this->xmlParserService->get('import', 'gruppa');
    if ($flatTree && is_array($tree)) {
      return $this->flatTree($tree);
    }
    return $tree;
  }

  /**
   * Catalog flatTree (не дерево а плоский список).
   */
  private function flatTree(array $data, $parentId = NULL, $parent = TRUE) {
    $result = [];
    $i = 0;
    if (!empty($data)) {
      $data = $this->xmlParserService->arrayNormalize($data);
      foreach ($data as $key => $val) {
        $i++;
        $id = $val['Ид'];
        $result[$id] = [
          'id' => $val['Ид'],
          'name' => $val['Наименование'],
          'term_weight' => $i,
          'delete' => $val['ПометкаУдаления'] ?? FALSE,
        ];
        if ($parentId) {
          $result[$id]['parent'] = $parentId && !$parent ? $parentId : FALSE;
        }
        if (!empty($val['Группы']['Группа'])) {
          $result = array_merge($result, $this->flatTree($val['Группы']['Группа'], $id, FALSE));
        }
      }
    }
    return $result;
  }

}

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

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