【发布时间】:2022-11-16 07:09:06
【问题描述】:
我正在尝试在 Shopware 6 的列表页面上获取子类别。但是我似乎无法找到使用模板变量获取子类别数组的功能。
我的目标是遍历子项并在 CMS 元素中创建某种快速链接。
在 shopware 中是否有一个标准的功能构建来通过 TWIG 中的 id 或 name 获取孩子?
我试图找到任何相关的东西
page.header.navigation.active
但是子数据不可用。
谢谢!
【问题讨论】:
我正在尝试在 Shopware 6 的列表页面上获取子类别。但是我似乎无法找到使用模板变量获取子类别数组的功能。
我的目标是遍历子项并在 CMS 元素中创建某种快速链接。
在 shopware 中是否有一个标准的功能构建来通过 TWIG 中的 id 或 name 获取孩子?
我试图找到任何相关的东西
page.header.navigation.active
但是子数据不可用。
谢谢!
【问题讨论】:
我不认为有一个内置函数来获取这个,但是如果你在一个新的 CMS-Element 中做它,你可以通过为你的新元素添加一个新的 DataResolver 并将子类别传递给你来利用它CMS 元素。
// myPlugin/src/DataResolver/SubcategoryListCmsElementResolver.php
<?php
namespace MyPluginDataResolver;
use ShopwareCoreContentCategoryCategoryDefinition;
use ShopwareCoreContentCategoryCategoryEntity;
use ShopwareCoreContentCmsAggregateCmsSlotCmsSlotEntity;
use ShopwareCoreContentCmsDataResolverCriteriaCollection;
use ShopwareCoreContentCmsDataResolverElementAbstractCmsElementResolver;
use ShopwareCoreContentCmsDataResolverElementElementDataCollection;
use ShopwareCoreContentCmsDataResolverResolverContextResolverContext;
use ShopwareCoreFrameworkDataAbstractionLayerSearchCriteria;
use ShopwareCoreFrameworkDataAbstractionLayerSearchFilterEqualsFilter;
class SubcategoryListCmsElementResolver extends AbstractCmsElementResolver
{
public function getType(): string
{
return 'my-subcategory-list';
}
public function collect(CmsSlotEntity $slot, ResolverContext $resolverContext): ?CriteriaCollection
{
/** @var CategoryEntity $categoryEntity */
$categoryEntity = $resolverContext->getEntity();
$criteria = new Criteria([$categoryEntity->getId()]);
$criteria->addAssociation('children');
$criteriaCollection = new CriteriaCollection();
$criteriaCollection->add('category_' . $slot->getUniqueIdentifier(), CategoryDefinition::class, $criteria);
return $criteriaCollection;
}
public function enrich(CmsSlotEntity $slot, ResolverContext $resolverContext, ElementDataCollection $result): void
{
/** @var CategoryEntity $categoryEntity */
$categoryEntity = $result->get('category_' . $slot->getUniqueIdentifier())?->getEntities()->first();
$slot->setData($categoryEntity->getChildren()?->sortByPosition()->filter(static function ($child) {
/** @var CategoryEntity $child */
return $child->getActive();
}));
}
}
服务.xml
<service id="MyPluginDataResolverSubcategoryListCmsElementResolver">
<tag name="shopware.cms.data_resolver"/>
</service>
然后您提供一个新模板,例如
{% block element_my_subcategory_list %}
{% set subcategories = element.data.elements %}
{% set activeCategory = page.header.navigation.active %}
<ul>
{% for category in subcategories %}
<li>do something with your category</li>
{% endfor %}
</ul>
{% endblock %}
您可以在文档中阅读有关数据解析器的更多信息:https://developer.shopware.com/docs/guides/plugins/plugins/content/cms/add-data-to-cms-elements#create-a-data-resolver
【讨论】:
不确定我是否正确理解您的问题,但让我们解释一下。如果你需要在数组中获取数组,你可以在一个新的循环中创建一个循环,就像这样:
{% for item in category.item %}
{% for subcategory in category.subcategory %}
{{ subcategory.title}}
{% endfor %}
{% endfor %}
【讨论】: