/** * Returns an array containing all completeness info and missing attributes for a product * * @param ProductInterface $product * @param array $channels * @param array $locales * @param string $localeCode * * @return array */ public function getProductCompleteness(ProductInterface $product, array $channels, array $locales, $localeCode) { $family = $product->getFamily(); $getCodes = function ($entities) { return array_map(function ($entity) { return $entity->getCode(); }, $entities); }; $channelTemplate = array_fill_keys($getCodes($channels), array('completeness' => null, 'missing' => array())); $localeCodes = $getCodes($locales); $completenesses = array_fill_keys($localeCodes, $channelTemplate); if (!$family) { return $completenesses; } $allCompletenesses = $product->getCompletenesses(); foreach ($allCompletenesses as $completeness) { $locale = $completeness->getLocale(); $channel = $completeness->getChannel(); $completenesses[$locale->getCode()][$channel->getCode()]['completeness'] = $completeness; } $requirements = $this->familyRepository->getFullRequirementsQB($family, $localeCode)->getQuery()->getResult(); $productValues = $product->getValues(); foreach ($requirements as $requirement) { if ($requirement->isRequired()) { $this->addRequirementToCompleteness($completenesses, $requirement, $productValues, $localeCodes); } } return $completenesses; }
/** * {@inheritdoc} */ public function findCommonAttributeIds(array $productIds) { $results = $this->findValuesCommonAttributeIds($productIds); $familyIds = $this->findFamiliesFromProductIds($productIds); if (!empty($familyIds)) { $families = $this->familyRepository->findAttributeIdsFromFamilies($familyIds); } $attIds = null; foreach ($results as $result) { $familyAttr = isset($result['_id']['family']) ? $families[$result['_id']['family']] : array(); $prodAttIds = array_unique(array_merge($result['attribute'], $familyAttr)); if (null === $attIds) { $attIds = $prodAttIds; } else { $attIds = array_intersect($attIds, $prodAttIds); } } return $attIds; }
/** * Generate family requirements information to be used to * calculate completenesses. * * @param ProductInterface $product * @param Channel $channel * * @return array */ protected function getFamilyRequirements(ProductInterface $product = null, Channel $channel = null) { $selectFamily = null; if (null !== $product) { $selectFamily = $product->getFamily(); } $families = $this->familyRepository->getFullFamilies($selectFamily, $channel); $familyRequirements = array(); foreach ($families as $family) { $reqsByChannels = array(); $channels = array(); foreach ($family->getAttributeRequirements() as $attributeReq) { $channel = $attributeReq->getChannel(); $channels[$channel->getCode()] = $channel; if (!isset($reqsByChannels[$channel->getCode()])) { $reqsByChannels[$channel->getCode()] = array(); } $reqsByChannels[$channel->getCode()][] = $attributeReq; } $familyRequirements[$family->getId()] = $this->getFieldsNames($channels, $reqsByChannels); } return $familyRequirements; }
/** * Get choices * * @return array */ public function getChoices() { return $this->repository->getChoices(['localeCode' => $this->userContext->getCurrentLocaleCode()]); }