/**
  * Get the media attributes
  *
  * @return string[]
  */
 public function getMediaAttributes()
 {
     if (null === $this->mediaAttributes) {
         $this->mediaAttributes = $this->attributeRepository->findMediaAttributeCodes();
     }
     return $this->mediaAttributes;
 }
 /**
  * Transforms a relative path to absolute. Data must be provided in the pivot format.
  *
  * $item exemple:
  * [
  *   'side_view' => [
  *     [
  *       'locale' => null,
  *       'scope'  => null,
  *       'data'   => [
  *         'filePath'         => 'cat_003.png',
  *         'originalFilename' => 'cat_003.png'
  *       ]
  *     ]
  *   ]
  * ]
  *
  * @param array  $attributeValues An associative array (attribute_code => values)
  * @param string $filePath        The absolute path
  *
  * @return array
  */
 public function transform(array $attributeValues, $filePath)
 {
     $mediaAttributes = $this->attributeRepository->findMediaAttributeCodes();
     foreach ($attributeValues as $code => $values) {
         if (in_array($code, $mediaAttributes)) {
             foreach ($values as $index => $value) {
                 if (isset($value['data']) && isset($value['data']['filePath'])) {
                     $dataFilePath = $value['data']['filePath'];
                     $attributeValues[$code][$index]['data']['filePath'] = sprintf('%s%s%s', $filePath, DIRECTORY_SEPARATOR, $dataFilePath);
                 }
             }
         }
     }
     return $attributeValues;
 }
 /**
  * {@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(AttributeRepositoryInterface $attributeRepository)
 {
     $attributeRepository->findMediaAttributeCodes()->willReturn(['view', 'manual']);
     $this->beConstructedWith($attributeRepository, ['.', ','], ['Y-m-d', 'd-m-Y']);
 }