Пример #1
0
 /**
  * Sets the attribute
  *
  * @param AbstractAttribute $attribute
  *
  * @throws ColumnLabelException
  */
 public function setAttribute(AbstractAttribute $attribute = null)
 {
     $this->attribute = $attribute;
     if (null === $attribute) {
         $this->locale = null;
         $this->scope = null;
         $this->suffixes = $this->rawSuffixes;
         $this->propertyPath = lcfirst(Inflector::classify($this->name));
     } else {
         $this->propertyPath = $attribute->getBackendType();
         $suffixes = $this->rawSuffixes;
         if ($attribute->isLocalizable()) {
             if (count($suffixes)) {
                 $this->locale = array_shift($suffixes);
             } else {
                 throw new ColumnLabelException('The column "%column%" must contain a locale code', array('%column%' => $this->label));
             }
         }
         if ($attribute->isScopable()) {
             if (count($suffixes)) {
                 $this->scope = array_shift($suffixes);
             } else {
                 throw new ColumnLabelException('The column "%column%" must contain a scope code', array('%column%' => $this->label));
             }
         }
         $this->suffixes = $suffixes;
     }
 }
 /**
  * {@inheritdoc}
  */
 public function addAttributeFilter(AbstractAttribute $attribute, $operator, $value)
 {
     $backendType = $attribute->getBackendType();
     $joinAlias = 'filter' . $attribute->getCode() . $this->aliasCounter++;
     // join to value
     $condition = $this->prepareAttributeJoinCondition($attribute, $joinAlias);
     if ('EMPTY' === $operator) {
         $this->qb->leftJoin($this->qb->getRootAlias() . '.values', $joinAlias, 'WITH', $condition);
         // join to price
         $joinAliasPrice = 'filterP' . $attribute->getCode() . $this->aliasCounter;
         $priceData = $joinAlias . '.' . $backendType;
         $this->qb->leftJoin($priceData, $joinAliasPrice);
         // add conditions
         $condition = $this->preparePriceCondition($joinAliasPrice, $operator, $value);
         $exprNull = $this->qb->expr()->isNull($joinAliasPrice . '.id');
         $exprOr = $this->qb->expr()->orX($condition, $exprNull);
         $this->qb->andWhere($exprOr);
     } else {
         $this->qb->innerJoin($this->qb->getRootAlias() . '.values', $joinAlias, 'WITH', $condition);
         $joinAliasPrice = 'filterP' . $attribute->getCode() . $this->aliasCounter;
         $condition = $this->preparePriceCondition($joinAliasPrice, $operator, $value);
         $this->qb->innerJoin($joinAlias . '.' . $backendType, $joinAliasPrice, 'WITH', $condition);
     }
     return $this;
 }
 /**
  * {@inheritdoc}
  */
 public function guessConstraints(AbstractAttribute $attribute)
 {
     $constraints = array();
     if ($attribute->isUnique()) {
         $constraints[] = new UniqueValue();
     }
     return $constraints;
 }
 /**
  * {@inheritdoc}
  */
 public function guessConstraints(AbstractAttribute $attribute)
 {
     $constraints = array();
     if ('regexp' === $attribute->getValidationRule() && ($pattern = $attribute->getValidationRegexp())) {
         $constraints[] = new Assert\Regex(array('pattern' => $pattern));
     }
     return $constraints;
 }
 function let(SerializerInterface $serializer, AbstractAttribute $simpleAttribute)
 {
     $serializer->implement('Symfony\\Component\\Serializer\\Normalizer\\NormalizerInterface');
     $this->setSerializer($serializer);
     $simpleAttribute->isLocalizable()->willReturn(false);
     $simpleAttribute->isScopable()->willReturn(false);
     $simpleAttribute->getCode()->willReturn('simple');
 }
 /**
  * {@inheritdoc}
  */
 public function guessConstraints(AbstractAttribute $attribute)
 {
     $constraints = array();
     if ($attribute->isRequired()) {
         $constraints[] = new Assert\NotBlank();
     }
     return $constraints;
 }
 function it_normalizes_family($normalizer, Family $family, AbstractAttribute $sku)
 {
     $sku->getCode()->willReturn('sku');
     $family->getCode()->willReturn('mongo');
     $family->getAttributeAsLabel()->willReturn($sku);
     $normalizer->normalize($family, 'mongodb_json', [])->willReturn(['label' => 'translations']);
     $this->normalize($family, 'mongodb_json', [])->shouldReturn(['code' => 'mongo', 'label' => 'translations', 'attributeAsLabel' => 'sku']);
 }
 /**
  * Customize the attribute form
  *
  * @param Form              $form
  * @param AbstractAttribute $attribute
  */
 protected function customizeForm(Form $form, AbstractAttribute $attribute)
 {
     $attTypeClass = $this->attTypeFactory->get($attribute->getAttributeType());
     $fields = $attTypeClass->buildAttributeFormTypes($this->factory, $attribute);
     foreach ($fields as $field) {
         $form->add($field);
     }
 }
 /**
  * {@inheritdoc}
  */
 public function guessConstraints(AbstractAttribute $attribute)
 {
     $constraints = array();
     if ('email' === $attribute->getValidationRule()) {
         $constraints[] = new Assert\Email();
     }
     return $constraints;
 }
 /**
  * {@inheritdoc}
  */
 public function guessConstraints(AbstractAttribute $attribute)
 {
     $constraints = array();
     if ($maxCharacters = $attribute->getMaxCharacters()) {
         $constraints[] = new Assert\Length(array('max' => $maxCharacters));
     }
     return $constraints;
 }
 function it_adds_a_order_by_on_an_attribute_value_in_the_query(Builder $queryBuilder, AbstractAttribute $sku)
 {
     $sku->getCode()->willReturn('sku');
     $sku->isLocalizable()->willReturn(false);
     $sku->isScopable()->willReturn(false);
     $queryBuilder->sort('normalizedData.sku', 'desc')->willReturn($queryBuilder);
     $this->addAttributeSorter($sku, 'desc');
 }
 /**
  * {@inheritdoc}
  */
 public function guessConstraints(AbstractAttribute $attribute)
 {
     $constraints = array();
     if (!$attribute->isDecimalsAllowed()) {
         $constraints[] = new NotDecimal();
     }
     return $constraints;
 }
 function it_adds_a_less_than_or_equals_filter_in_the_query(Builder $queryBuilder, AbstractAttribute $price)
 {
     $price->getCode()->willReturn('price');
     $price->isLocalizable()->willReturn(true);
     $price->isScopable()->willReturn(true);
     $queryBuilder->field('normalizedData.price-en_US-mobile.EUR.data')->willReturn($queryBuilder);
     $queryBuilder->lte(22.5)->willReturn($queryBuilder);
     $this->addAttributeFilter($price, '<=', '22.5 EUR');
 }
 /**
  * Don't allow creating an identifier attribute if one already exists
  *
  * @param AbstractAttribute $attribute
  * @param Constraint        $constraint
  */
 public function validate($attribute, Constraint $constraint)
 {
     if ($attribute->getAttributeType() === 'pim_catalog_identifier') {
         $identifier = $this->manager->getIdentifierAttribute();
         if ($identifier && $identifier->getId() !== $attribute->getId()) {
             $this->context->addViolationAt('attributeType', $constraint->message);
         }
     }
 }
 function it_adds_a_in_filter_on_an_attribute_value_in_the_query($qb, AbstractAttribute $color)
 {
     $color->getCode()->willReturn('color');
     $color->isLocalizable()->willReturn(true);
     $color->isScopable()->willReturn(false);
     $qb->field('normalizedData.color-en_US.id')->willReturn($qb);
     $qb->in([1, 2])->willReturn($qb);
     $this->addAttributeFilter($color, 'IN', [1, 2]);
 }
 function it_adds_a_like_filter_on_an_attribute_value_in_the_query(Builder $queryBuilder, AbstractAttribute $sku)
 {
     $sku->getCode()->willReturn('sku');
     $sku->isLocalizable()->willReturn(false);
     $sku->isScopable()->willReturn(false);
     $queryBuilder->field('normalizedData.sku')->willReturn($queryBuilder);
     $queryBuilder->equals('my-sku')->willReturn($queryBuilder);
     $this->addAttributeFilter($sku, 'LIKE', 'my-sku');
 }
 function it_removes_attribute_indexes_when_a_localizable_and_scopable_attribute_is_removed($collection, AbstractAttribute $title)
 {
     $title->getCode()->willReturn('title');
     $collection->getIndexInfo()->willReturn([["key" => ["_id" => 1]], ["key" => ["normalizedData.title-ecommerce-en_US" => 1]], ["key" => ["normalizedData.title-ecommerce-de_DE" => 1]], ["key" => ["normalizedData.title-mobile-de_DE" => 1]], ["key" => ["normalizedData.manufacturer_title" => 1]], ["key" => ["normalizedData.title_left-en_US" => 1]], ["key" => ["normalizedData.title_left-de_DE" => 1]]]);
     $collection->deleteIndex('normalizedData.title-ecommerce-en_US')->shouldBeCalled();
     $collection->deleteIndex('normalizedData.title-ecommerce-de_DE')->shouldBeCalled();
     $collection->deleteIndex('normalizedData.title-mobile-de_DE')->shouldBeCalled();
     $this->purgeIndexesFromAttribute($title);
 }
 function it_adds_a_less_than_or_equals_filter_in_the_query(Builder $queryBuilder, AbstractAttribute $metric)
 {
     $metric->getCode()->willReturn('weight');
     $metric->isLocalizable()->willReturn(true);
     $metric->isScopable()->willReturn(true);
     $queryBuilder->field('normalizedData.weight-en_US-mobile.baseData')->willReturn($queryBuilder);
     $queryBuilder->lte(22.5)->willReturn($queryBuilder);
     $this->addAttributeFilter($metric, '<=', '22.5');
 }
 /**
  * Get all channel codes
  * @param AbstractAttribute $attribute
  *
  * @return array
  */
 public function getChannelCodes(AbstractAttribute $attribute = null)
 {
     $channelCodes = [];
     if (null === $attribute || $attribute->isScopable()) {
         foreach ($this->getChannels() as $channel) {
             $channelCodes[] = $channel->getCode();
         }
     }
     return $channelCodes;
 }
 function it_provides_available_axis_as_a_sorted_choice($registry, AttributeRepository $attRepository, AbstractAttribute $attribute1, AbstractAttribute $attribute2)
 {
     $attribute1->getId()->willReturn(1);
     $attribute1->getLabel()->willReturn('Foo');
     $attribute2->getId()->willReturn(2);
     $attribute2->getLabel()->willReturn('Bar');
     $registry->getRepository(self::ATTRIBUTE_CLASS)->willReturn($attRepository);
     $attRepository->findAllAxis()->willReturn([$attribute1, $attribute2]);
     $this->getAvailableAxisChoices()->shouldReturn([2 => 'Bar', 1 => 'Foo']);
 }
 function it_does_not_validate_attribute_with_non_string_options(AbstractAttribute $attribute, ExecutionContext $context, AttributeOption $option1, AttributeOption $option2, AttributeOption $option3, AttributeOption $option4)
 {
     $option1->getCode()->willReturn('ab');
     $option2->getCode()->willReturn(0);
     $option3->getCode()->willReturn('ef');
     $option4->getCode()->willReturn('gh');
     $attribute->getOptions()->willReturn([$option1, $option2, $option3, $option4]);
     $context->addViolation('Code must be a string. Type "integer" found.')->shouldBeCalled();
     $this->areOptionsValid($attribute, $context);
 }
 function it_generates_a_query_to_update_product_scopable_attributes($namingUtility, AbstractAttribute $label, Channel $mobile)
 {
     $namingUtility->getScopableAttributes(false)->willReturn([$label]);
     $label->getCode()->willReturn('label');
     $namingUtility->getLocaleCodes()->willReturn(['fr_FR', 'en_US']);
     $namingUtility->appendSuffixes(['normalizedData.label'], ['fr_FR', 'en_US'])->willReturn(['normalizedData.label-fr_FR', 'normalizedData.label-en_US']);
     $namingUtility->appendSuffixes(['normalizedData.label-fr_FR', 'normalizedData.label-en_US'], ['mobile'])->willReturn(['normalizedData.label-fr_FR-mobile', 'normalizedData.label-en_US-mobile']);
     $mobile->getCode()->willReturn('mobile');
     $this->generateQuery($mobile, '', '', '')->shouldReturn([[['normalizedData.label-fr_FR-mobile' => ['$exists' => true]], ['$unset' => ['normalizedData.label-fr_FR-mobile' => '']], ['multiple' => true]], [['normalizedData.label-en_US-mobile' => ['$exists' => true]], ['$unset' => ['normalizedData.label-en_US-mobile' => '']], ['multiple' => true]]]);
 }
Пример #23
0
 /**
  * Prepare join to attribute condition with current locale and scope criterias
  *
  * @param AbstractAttribute $attribute the attribute
  * @param string            $joinAlias the value join alias
  *
  * @return string
  */
 public function prepareCondition(AbstractAttribute $attribute, $joinAlias)
 {
     $condition = $joinAlias . '.attribute = ' . $attribute->getId();
     if ($attribute->isLocalizable()) {
         $condition .= ' AND ' . $joinAlias . '.locale = ' . $this->qb->expr()->literal($this->context->getLocaleCode());
     }
     if ($attribute->isScopable()) {
         $condition .= ' AND ' . $joinAlias . '.scope = ' . $this->qb->expr()->literal($this->context->getScopeCode());
     }
     return $condition;
 }
 /**
  * Clean options.
  *
  * @param array             $options
  * @param AbstractAttribute $attribute
  *
  * @throws InvalidItemException If clean doesn't goes well
  */
 protected function cleanOptions(array $options, AbstractAttribute $attribute = null)
 {
     foreach ($options as $optionLabel => $optionValue) {
         if ($attribute !== null && !in_array($attribute->getCode(), $this->getIgnoredAttributes()) && $this->getOption($optionLabel, $attribute) === null) {
             try {
                 $this->handleOptionNotInPimAnymore($optionValue, $attribute->getCode());
             } catch (RestCallException $e) {
                 throw new InvalidItemException($e->getMessage(), [$optionLabel]);
             }
         }
     }
 }
 function it_adds_a_not_between_filter_on_an_attribute_value_in_the_query($queryBuilder, AbstractAttribute $date)
 {
     $date->getCode()->willReturn('release_date');
     $date->isLocalizable()->willReturn(true);
     $date->isScopable()->willReturn(true);
     $queryBuilder->expr()->willReturn($queryBuilder);
     $queryBuilder->addAnd($queryBuilder)->willReturn($queryBuilder);
     $queryBuilder->addOr($queryBuilder)->willReturn($queryBuilder);
     $queryBuilder->addOr($queryBuilder)->willReturn($queryBuilder);
     $queryBuilder->lte(strtotime('2014-03-15'))->willReturn($queryBuilder);
     $queryBuilder->gte(strtotime('2014-03-20 23:59:59'))->willReturn($queryBuilder);
     $this->addAttributeFilter($date, ['from' => '<', 'to' => '>'], ['from' => '2014-03-15', 'to' => '2014-03-20']);
 }
 /**
  * {@inheritdoc}
  */
 public function addAttributeSorter(AbstractAttribute $attribute, $direction)
 {
     $aliasPrefix = 'sorter';
     $joinAlias = $aliasPrefix . 'V' . $attribute->getCode() . $this->aliasCounter++;
     $backendType = $attribute->getBackendType();
     // join to value
     $condition = $this->prepareAttributeJoinCondition($attribute, $joinAlias);
     $this->qb->leftJoin($this->qb->getRootAlias() . '.values', $joinAlias, 'WITH', $condition);
     $joinAliasMetric = $aliasPrefix . 'M' . $attribute->getCode() . $this->aliasCounter;
     $this->qb->leftJoin($joinAlias . '.' . $backendType, $joinAliasMetric);
     $this->qb->addOrderBy($joinAliasMetric . '.baseData', $direction);
     return $this;
 }
 function it_normalizes_a_product_value_into_mongodb_document($mongoFactory, $serializer, AbstractProductValue $value, AbstractAttribute $attribute, \MongoDBRef $mongoDBRef, \MongoId $mongoId)
 {
     $context = ['_id' => $mongoId, 'collection_name' => 'product'];
     $mongoFactory->createMongoId()->willReturn($mongoId);
     $mongoFactory->createMongoDBRef('product', $mongoId)->willReturn($mongoDBRef);
     $attribute->getId()->willReturn(123);
     $attribute->getBackendType()->willReturn('text');
     $value->getAttribute()->willReturn($attribute);
     $value->getData()->willReturn('my description');
     $value->getLocale()->willReturn(null);
     $value->getScope()->willReturn(null);
     $this->normalize($value, 'mongodb_document', $context)->shouldReturn(['_id' => $mongoId, 'attribute' => 123, 'entity' => $mongoDBRef, 'text' => 'my description']);
 }
Пример #28
0
 /**
  * {@inheritdoc}
  */
 public function addAttributeFilter(AbstractAttribute $attribute, $operator, $value)
 {
     $joinAlias = 'filter' . $attribute->getCode() . $this->aliasCounter++;
     $backendField = sprintf('%s.%s', $joinAlias, $attribute->getBackendType());
     if ($operator === 'EMPTY') {
         $this->qb->leftJoin($this->qb->getRootAlias() . '.values', $joinAlias, 'WITH', $this->prepareAttributeJoinCondition($attribute, $joinAlias));
         $this->qb->andWhere($this->prepareCriteriaCondition($backendField, $operator, $value));
     } else {
         $condition = $this->prepareAttributeJoinCondition($attribute, $joinAlias);
         $condition .= ' AND ' . $this->prepareCriteriaCondition($backendField, $operator, $value);
         $this->qb->innerJoin($this->qb->getRootAlias() . '.values', $joinAlias, 'WITH', $condition);
     }
     return $this;
 }
 /**
  * {@inheritdoc}
  */
 public function addAttributeFilter(AbstractAttribute $attribute, $operator, $value)
 {
     $joinAlias = 'filter' . $attribute->getCode() . $this->aliasCounter++;
     $joinAliasOpt = 'filterO' . $attribute->getCode() . $this->aliasCounter;
     $backendField = sprintf('%s.%s', $joinAliasOpt, 'id');
     if (in_array('empty', $value)) {
         $this->qb->leftJoin($this->qb->getRootAlias() . '.values', $joinAlias, 'WITH', $this->prepareAttributeJoinCondition($attribute, $joinAlias));
         $condition = $this->prepareEmptyCondition($backendField, $operator, $value);
         $this->qb->leftJoin($joinAlias . '.' . $attribute->getBackendType(), $joinAliasOpt)->andWhere($condition);
     } else {
         $this->qb->innerJoin($this->qb->getRootAlias() . '.values', $joinAlias, 'WITH', $this->prepareAttributeJoinCondition($attribute, $joinAlias))->innerJoin($joinAlias . '.' . $attribute->getBackendType(), $joinAliasOpt, 'WITH', $this->qb->expr()->in($backendField, $value));
     }
     return $this;
 }
 /**
  * {@inheritdoc}
  */
 public function addAttributeSorter(AbstractAttribute $attribute, $direction)
 {
     $aliasPrefix = 'sorter';
     $joinAlias = $aliasPrefix . 'V' . $attribute->getCode() . $this->aliasCounter++;
     $backendType = $attribute->getBackendType();
     // join to value
     $condition = $this->prepareAttributeJoinCondition($attribute, $joinAlias);
     $this->qb->leftJoin($this->qb->getRootAlias() . '.' . $attribute->getBackendStorage(), $joinAlias, 'WITH', $condition);
     // then to option and option value to sort on
     $joinAliasOpt = $aliasPrefix . 'O' . $attribute->getCode() . $this->aliasCounter;
     $this->qb->leftJoin($joinAlias . '.' . $backendType, $joinAliasOpt);
     $this->qb->addOrderBy($joinAliasOpt . '.code', $direction);
     return $this;
 }