/**
  * Prepare product values
  *
  * @param ProductInterface $product
  * @param array            $actions
  *
  * @return array
  */
 protected function prepareProductValues(ProductInterface $product, array $actions)
 {
     $normalizedValues = json_decode($actions['normalized_values'], true);
     $filteredValues = [];
     foreach ($normalizedValues as $attributeCode => $values) {
         $attribute = $this->attributeRepository->findOneByIdentifier($attributeCode);
         if ($product->isAttributeEditable($attribute)) {
             $filteredValues[$attributeCode] = $values;
         }
     }
     return $filteredValues;
 }
 /**
  * Prepare product values
  *
  * @param ProductInterface $product
  * @param array            $actions
  *
  * @return array
  */
 protected function prepareProductValues(ProductInterface $product, array $actions)
 {
     $normalizedValues = json_decode($actions['normalized_values'], true);
     $attributeLocale = $actions['attribute_locale'];
     $filteredValues = [];
     foreach ($normalizedValues as $attributeCode => $values) {
         $attribute = $this->attributeRepository->findOneByIdentifier($attributeCode);
         if ($product->isAttributeEditable($attribute)) {
             $values = array_filter($values, function ($value) use($attributeLocale) {
                 return $attributeLocale === $value['locale'] || null === $value['locale'];
             });
             $localizer = $this->localizerRegistry->getLocalizer($attribute->getAttributeType());
             if (null !== $localizer) {
                 $locale = $actions['ui_locale'];
                 $values = array_map(function ($value) use($localizer, $locale) {
                     $value['data'] = $localizer->delocalize($value['data'], ['locale' => $locale]);
                     return $value;
                 }, $values);
             }
             $filteredValues[$attributeCode] = $values;
         }
     }
     return $filteredValues;
 }
 /**
  * Set data from $actions to the given $product
  *
  * Actions should looks like that
  *
  * $actions =
  * [
  *     [
  *          'field'   => 'group',
  *          'value'   => 'summer_clothes',
  *          'options' => null
  *      ],
  *      [
  *          'field'   => 'category',
  *          'value'   => 'catalog_2013,catalog_2014',
  *          'options' => null
  *      ],
  * ]
  *
  * @param ProductInterface $product
  * @param array            $configuration
  *
  * @throws \LogicException
  *
  * @return ProductInterface $product
  */
 protected function updateProduct(ProductInterface $product, array $configuration)
 {
     $modifiedAttributesNb = 0;
     foreach ($configuration['actions'] as $action) {
         $attribute = $this->attributeRepository->findOneBy(['code' => $action['field']]);
         if (null === $attribute) {
             throw new \LogicException(sprintf('Attribute with code %s does not exist'), $action['field']);
         }
         if ($product->isAttributeEditable($attribute)) {
             $localizer = $this->localizerRegistry->getLocalizer($attribute->getAttributeType());
             if (null !== $localizer) {
                 $action['value'] = $localizer->delocalize($action['value'], ['locale' => $configuration['locale']]);
             }
             $this->propertySetter->setData($product, $action['field'], $action['value'], $action['options']);
             $modifiedAttributesNb++;
         }
     }
     if (0 === $modifiedAttributesNb) {
         $this->stepExecution->incrementSummaryInfo('skipped_products');
         $this->stepExecution->addWarning($this->getName(), 'pim_enrich.mass_edit_action.edit-common-attributes.message.no_valid_attribute', [], $product);
         return null;
     }
     return $product;
 }