条件循环通过Shopware 6中的实体和数值。

huangapple go评论106阅读模式
英文:

Condition loop by entities & values in Shopware 6

问题

我尝试通过Shopware 6中的实体和值来设置条件循环。我使用它来过滤选项。我理解我条件错误了,但我不知道如何正确使用实体和值来实现它。

  1. public function onListingCriteria(ProductListingCriteriaEvent $event): void
  2. {
  3. $event->getCriteria()->addAssociation('properties');
  4. $event->getCriteria()->addAssociation('properties.group');
  5. $criteria = $event->getCriteria();
  6. $filters = $criteria->getExtension('filters');
  7. if (!$filters instanceof FilterCollection) {
  8. return;
  9. }
  10. $propertyFilter = $filters->get('properties');
  11. if (!$propertyFilter instanceof Filter || !is_array($propertyFilter->getValues())) {
  12. return;
  13. }
  14. $currentPropertyOptions = $propertyFilter->getValues();
  15. $event->getContext()->addExtension('currentPropertyOptionsCriteria', new ArrayEntity($currentPropertyOptions));
  16. $criteria1 = new Criteria();
  17. $criteria1->addAssociation('myTags');
  18. $tags = new TagCollection();
  19. $options = $this->optionRepository->search($criteria1, $event->getContext())->getEntities();
  20. /** @var PropertyGroupOptionEntity $option */
  21. foreach ($options as $option) {
  22. $extension = $option->getExtension('myTags');
  23. if (!$extension instanceof TagCollection) {
  24. continue;
  25. }
  26. // 为了仅获取currentPropertyOptions的标签,我尝试设置条件:
  27. if (!in_array($option->getId(), $currentPropertyOptions)) {
  28. continue;
  29. }
  30. $tags->merge($extension);
  31. }
  32. $event->getContext()->addExtension('myTags1', $tags);
  33. // currentPropertyOptions的标签值应以数组形式提供
  34. // $tags = ['Tag1value', 'Tag2value', 'Tag3value', 'Tag4value'];
  35. if (in_array('3f777000a2734deead391133cee3a6a9', $currentPropertyOptions)) {
  36. //Scenario1
  37. $multiFilter = new MultiFilter(MultiFilter::CONNECTION_OR);
  38. foreach ($tags as $tag) {
  39. $multiFilter->addQuery(new PrefixFilter('product.properties.name', $tag));
  40. }
  41. $criteria->addFilter($multiFilter);
  42. }
  43. ...
  44. }

然后,如果结果为空,可能是因为某些条件未满足。希望这有助于您解决问题。

英文:

I try to condition loop by entities & values in Shopware 6. I use it to filter options. I understand, that I do condition wrong, but I can't get how to do it right with Entities and Values.

  1. public function onListingCriteria(ProductListingCriteriaEvent $event): void
  2. {
  3. $event->getCriteria()->addAssociation('properties');
  4. $event->getCriteria()->addAssociation('properties.group');
  5. $criteria = $event->getCriteria();
  6. $filters = $criteria->getExtension('filters');
  7. if (!$filters instanceof FilterCollection) {
  8. return;
  9. }
  10. $propertyFilter = $filters->get('properties');
  11. if (!$propertyFilter instanceof Filter || !\is_array($propertyFilter->getValues())) {
  12. return;
  13. }
  14. $currentPropertyOptions = $propertyFilter->getValues();
  15. $event->getContext()->addExtension('currentPropertyOptionsCriteria', new ArrayEntity($currentPropertyOptions));
  16. $criteria1 = new Criteria();
  17. $criteria1->addAssociation('myTags');
  18. $tags = new TagCollection();
  19. $options = $this->optionRepository->search($criteria1, $event->getContext())->getEntities();
  20. /** @var PropertyGroupOptionEntity $option */
  21. foreach ($options as $option) {
  22. $extension = $option->getExtension('myTags');
  23. if (!$extension instanceof TagCollection) {
  24. continue;
  25. }
  26. // To get Tags only for currentPropertyOptions I try to set a condition:
  27. if (!in_array($options, $currentPropertyOptions)) {
  28. continue;
  29. }
  30. $tags->merge($extension);
  31. }
  32. $event->getContext()->addExtension('myTags1', $tags);
  33. // Tags values of a currentPropertyOptions should be delivered in an array
  34. // $tags = ['Tag1value', 'Tag2value', 'Tag3value', 'Tag4value'];
  35. if (in_array('3f777000a2734deead391133cee3a6a9', $currentPropertyOptions)) {
  36. //Scenario1
  37. $multiFilter = new MultiFilter(MultiFilter::CONNECTION_OR);
  38. foreach ($tags as $tag) {
  39. $multiFilter->addQuery(new PrefixFilter('product.properties.name', $tag));
  40. }
  41. $criteria->addFilter($multiFilter);
  42. }
  43. ...

I have an empty result then:

  1. Shopware\Core\System\Tag\TagCollection {#8107
  2. #elements: []
  3. #extensions: []
  4. }

Do someone know, how this should be done?

答案1

得分: 1

这不会按预期工作:

  1. !in_array($options, $currentPropertyOptions)

我假设 $currentPropertyOptions 是一个包含 ID 的数组。你不会在实体集合中以这种方式找到它们。

你可以将这些 ID 设置为筛选条件:

  1. $criteria1 = new Criteria();
  2. $criteria1->addAssociation('myTags');
  3. $criteria1->setIds($currentPropertyOptions);
英文:

This won't work as expected:

  1. !in_array($options, $currentPropertyOptions)

I assume $currentPropertyOptions is an array of ids. You won't find these in an entity collection like that.

You can set the ids as filter on the criteria:

  1. $criteria1 = new Criteria();
  2. $criteria1->addAssociation('myTags');
  3. $criteria1->setIds($currentPropertyOptions);

huangapple
  • 本文由 发表于 2023年7月27日 19:03:02
  • 转载请务必保留本文链接:https://go.coder-hub.com/76779098.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定