/** * 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]]]); }
/** * 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']); }
/** * {@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; }