acquia_commercemanager-8.x-1.122/modules/acm_sku/src/CategoryRepository.php
modules/acm_sku/src/CategoryRepository.php
<?php
namespace Drupal\acm_sku;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Logger\LoggerChannelFactory;
/**
* Provides a service for product synchronization to load categories.
*
* @ingroup acm_sku
*/
class CategoryRepository implements CategoryRepositoryInterface {
/**
* Loaded Taxonomy Terms By Commerce ID.
*
* @var \Drupal\taxonomy\TermInterface[]
*/
private $terms = [];
/**
* Taxonomy Term Entity Storage.
*
* @var \Drupal\taxonomy\TermStorageInterface
*/
private $termStorage;
/**
* Taxonomy Vocabulary Entity Storage.
*
* @var \Drupal\taxonomy\VocabularyStorageInterface
*/
private $vocabStorage;
/**
* Taxonomy Vocabulary Entity to Sync.
*
* @var \Drupal\taxonomy\VocabularyInterface
*/
private $vocabulary;
/**
* Drupal Config Factory Instance.
*
* @var \Drupal\Core\Config\ConfigFactoryInterface
*/
private $configFactory;
/**
* Constructor.
*
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* EntityTypeManager object.
* @param \Drupal\Core\Logger\LoggerChannelFactory $logger_factory
* LoggerFactory object.
* @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
* The factory for configuration objects.
*/
public function __construct(EntityTypeManagerInterface $entity_type_manager, LoggerChannelFactory $logger_factory, ConfigFactoryInterface $config_factory) {
$this->termStorage = $entity_type_manager->getStorage('taxonomy_term');
$this->vocabStorage = $entity_type_manager->getStorage('taxonomy_vocabulary');
$this->logger = $logger_factory->get('acm_sku');
$this->configFactory = $config_factory;
$category_vid = $config_factory
->get('acm.connector')
->get('category_vid');
if ($category_vid) {
$this->loadVocabulary($category_vid);
}
}
/**
* {@inheritdoc}
*/
public function loadCategoryTerm($commerce_id) {
if (!$this->vocabulary) {
throw new \RuntimeException('No Taxonomy vocabulary set.');
}
$commerce_id = (int) $commerce_id;
if ($commerce_id < 1) {
$this->logger->error(
'Invalid category id @cid',
['@cid' => $commerce_id]
);
return (NULL);
}
if (isset($this->terms[$commerce_id])) {
return ($this->terms[$commerce_id]);
}
$query = $this->termStorage->getQuery();
$group = $query->andConditionGroup()
->condition('field_commerce_id', $commerce_id)
->condition('vid', $this->vocabulary->id());
$query->condition($group);
$tids = $query->execute();
if (count($tids) == 0) {
return (NULL);
}
elseif (count($tids) > 1) {
$this->logger->error('Multiple terms found for category id @cid (only one will be returned)', ['@cid' => $commerce_id]);
}
$term = $this->termStorage->load(array_shift($tids));
$this->terms[$commerce_id] = $term;
return ($term);
}
/**
* {@inheritdoc}
*/
public function setVocabulary($vocabulary) {
$this->loadVocabulary($vocabulary);
return ($this);
}
/**
* LoadVocabulary.
*
* Load a taxonomy vocabulary from a vid.
*
* @param string $vocabulary
* Vocabulary VID.
*
* @throws \InvalidArgumentException
*/
private function loadVocabulary($vocabulary) {
if (!strlen($vocabulary)) {
throw new \InvalidArgumentException(
'CategoryRepository requires a taxonomy vocabulary machine name.'
);
}
$vocab = $this->vocabStorage->load($vocabulary);
if (!$vocab || !$vocab->id()) {
throw new \InvalidArgumentException(sprintf(
'CategoryRepository unable to locate vocabulary %s.',
$vocabulary
));
}
$this->vocabulary = $vocab;
}
}
