/** * {@inheritdoc} */ public function process($family) { $actions = $this->getConfiguredActions(); foreach ($actions as $action) { $attribute = $this->attributeRepository->findOneByIdentifier($action['attribute_code']); $channel = $this->channelRepository->findOneByIdentifier($action['channel_code']); $isRequired = $action['is_required']; $family->addAttribute($attribute); $family->addAttributeRequirement($this->factory->createAttributeRequirement($attribute, $channel, $isRequired)); } return $family; }
/** * {@inheritdoc} */ public function process($family) { $configuration = $this->getJobConfiguration(); if (!array_key_exists('actions', $configuration)) { throw new InvalidArgumentException('Missing configuration for \'actions\'.'); } $actions = $configuration['actions']; foreach ($actions as $action) { $attribute = $this->attributeRepository->findOneByIdentifier($action['attribute_code']); $channel = $this->channelRepository->findOneByIdentifier($action['channel_code']); $isRequired = $action['is_required']; $family->addAttribute($attribute); $family->addAttributeRequirement($this->factory->createAttributeRequirement($attribute, $channel, $isRequired)); } return $family; }
/** * @param string $code * * @return ChannelInterface */ protected function getChannel($code) { if (!array_key_exists($code, $this->channels)) { $this->channels[$code] = $this->channelRepository->findOneByIdentifier($code); } return $this->channels[$code]; }
/** * @param string $code * * @throws ObjectNotFoundException * * @return ChannelInterface */ protected function getChannelByCode($code) { $channel = $this->channelRepository->findOneByIdentifier($code); if (null === $channel) { throw new ObjectNotFoundException(sprintf('Channel with "%s" code does not exist', $code)); } return $channel; }
/** * Check the consistency of the field with channel associated * * @param AttributeInterface $attribute * @param string $fieldName * @param array $attributeInfo * * @throws \InvalidArgumentException */ protected function checkFieldNameLocaleByChannel(AttributeInterface $attribute, $fieldName, array $attributeInfo) { if ($attribute->isScopable() && $attribute->isLocalizable() && isset($attributeInfo['scope_code']) && isset($attributeInfo['locale_code'])) { $channel = $this->channelRepository->findOneByIdentifier($attributeInfo['scope_code']); $locale = $this->localeRepository->findOneByIdentifier($attributeInfo['locale_code']); if ($channel !== null && $locale !== null && !$channel->hasLocale($locale)) { throw new \InvalidArgumentException(sprintf('The locale "%s" of the field "%s" is not available in scope "%s"', $attributeInfo['locale_code'], $fieldName, $attributeInfo['scope_code'])); } } }
/** * {@inheritdoc} */ public function validate($value, Constraint $constraint) { if (null === $value['scope'] || null === $value['locales']) { return; } $filterStructureScope = $value['scope']; $filterStructureLocales = $value['locales']; $scope = $this->channelRepository->findOneByIdentifier($filterStructureScope); $localesCodes = []; if (null !== $scope) { $localesCodes = $scope->getLocaleCodes(); } $errorCount = 0; foreach ($filterStructureLocales as $localeCode) { if (!in_array($localeCode, $localesCodes)) { $this->context->buildViolation($constraint->message)->setParameter('%localeCode%', $localeCode)->atPath(sprintf('[locales][%d]', $errorCount))->addViolation(); $errorCount++; } } }
/** * @param FamilyInterface $family * @param AttributeInterface $attribute * @param string $channelCode * * @return AttributeRequirementInterface */ protected function createAttributeRequirement(FamilyInterface $family, AttributeInterface $attribute, $channelCode) { $channel = $this->channelRepository->findOneByIdentifier($channelCode); if (null === $channel) { throw new \InvalidArgumentException(sprintf('Channel with "%s" code does not exist', $channelCode)); } $requirement = $this->requirementRepo->findOneBy(['attribute' => $attribute->getId(), 'channel' => $channel->getId(), 'family' => $family->getId()]); if (null === $requirement) { $requirement = $this->attrRequiFactory->createAttributeRequirement($attribute, $channel, true); } return $requirement; }
/** * Returns the configured channel from the parameters. * If no channel is specified, returns null. * * @throws ObjectNotFoundException * * @return ChannelInterface|null */ protected function getConfiguredChannel() { $parameters = $this->stepExecution->getJobParameters(); if (!isset($parameters->get('filters')['structure']['scope'])) { return null; } $channelCode = $parameters->get('filters')['structure']['scope']; $channel = $this->channelRepository->findOneByIdentifier($channelCode); if (null === $channel) { throw new ObjectNotFoundException(sprintf('Channel with "%s" code does not exist', $channelCode)); } return $channel; }
/** * {@inheritdoc} */ public function process($product) { $parameters = $this->stepExecution->getJobParameters(); $structure = $parameters->get('filters')['structure']; $channel = $this->channelRepository->findOneByIdentifier($structure['scope']); $this->productBuilder->addMissingProductValues($product, [$channel], $channel->getLocales()->toArray()); $productStandard = $this->normalizer->normalize($product, 'json', ['channels' => [$channel->getCode()], 'locales' => array_intersect($channel->getLocaleCodes(), $parameters->get('filters')['structure']['locales'])]); if ($this->areAttributesToFilter($parameters)) { $attributesToFilter = $this->getAttributesToFilter($parameters); $productStandard['values'] = $this->filterValues($productStandard['values'], $attributesToFilter); } if ($parameters->has('with_media') && $parameters->get('with_media')) { $directory = $this->stepExecution->getJobExecution()->getExecutionContext()->get(JobInterface::WORKING_DIRECTORY_PARAMETER); $this->fetchMedia($product, $directory); } else { $mediaAttributes = $this->attributeRepository->findMediaAttributeCodes(); $productStandard['values'] = array_filter($productStandard['values'], function ($attributeCode) use($mediaAttributes) { return !in_array($attributeCode, $mediaAttributes); }, ARRAY_FILTER_USE_KEY); } $this->detacher->detach($product); return $productStandard; }
function let(TokenStorageInterface $tokenStorage, LocaleRepositoryInterface $localeRepository, ChannelRepositoryInterface $channelRepository, TokenInterface $token, User $user, LocaleInterface $en, LocaleInterface $fr, LocaleInterface $de, ChannelInterface $ecommerce, ChannelInterface $mobile, CategoryInterface $firstTree, CategoryInterface $secondTree, CategoryRepositoryInterface $productCategoryRepo, RequestStack $requestStack, ChoicesBuilderInterface $choicesBuilder) { $tokenStorage->getToken()->willReturn($token); $token->getUser()->willReturn($user); $en->getCode()->willReturn('en_US'); $fr->getCode()->willReturn('fr_FR'); $de->getCode()->willReturn('de_DE'); $en->isActivated()->willReturn(true); $fr->isActivated()->willReturn(true); $de->isActivated()->willReturn(true); $localeRepository->findOneByIdentifier('en_US')->willReturn($en); $localeRepository->findOneByIdentifier('fr_FR')->willReturn($fr); $localeRepository->findOneByIdentifier('de_DE')->willReturn($de); $localeRepository->getActivatedLocales()->willReturn([$en, $fr, $de]); $channelRepository->findOneByIdentifier([])->willReturn($mobile); $productCategoryRepo->getTrees()->willReturn([$firstTree, $secondTree]); $this->beConstructedWith($tokenStorage, $localeRepository, $channelRepository, $productCategoryRepo, $requestStack, $choicesBuilder, 'en_US'); }
/** * @param AttributeInterface $attribute * @param array $values * * @throws ObjectNotFoundException * * @return array */ protected function getNewValuesData(AttributeInterface $attribute, array $values) { $newValues = []; foreach ($values as $value) { $acceptValue = true; if (null !== $value['locale']) { $isAuthorizedOnLocale = !$this->objectFilter->filterObject($this->getLocale($value['locale']), 'pim.internal_api.locale.edit'); $isEditableOnLocale = $attribute->isLocaleSpecific() ? in_array($value['locale'], $attribute->getLocaleSpecificCodes()) : true; $acceptValue = $isAuthorizedOnLocale && $isEditableOnLocale; } if ($attribute->isScopable() && $acceptValue) { $channel = $this->channelRepository->findOneByIdentifier($value['scope']); if (null === $channel) { $acceptValue = false; } } if ($acceptValue) { $newValues[] = $value; } } return $newValues; }
/** * Get locale codes for a channel * * @param string $channelCode * * @return array */ protected function getLocaleCodes($channelCode) { $channel = $this->channelRepository->findOneByIdentifier($channelCode); return $channel->getLocaleCodes(); }