【问题标题】:Get subcategories with twig on listing page在列表页面上获取带有树枝的子类别
【发布时间】:2022-11-16 07:09:06
【问题描述】:

我正在尝试在 Shopware 6 的列表页面上获取子类别。但是我似乎无法找到使用模板变量获取子类别数组的功能。

我的目标是遍历子项并在 CMS 元素中创建某种快速链接。

在 shopware 中是否有一个标准的功能构建来通过 TWIG 中的 id 或 name 获取孩子?

我试图找到任何相关的东西

page.header.navigation.active

但是子数据不可用。

谢谢!

【问题讨论】:

    标签: twig shopware6


    【解决方案1】:

    我不认为有一个内置函数来获取这个,但是如果你在一个新的 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

    【讨论】:

      【解决方案2】:

      不确定我是否正确理解您的问题,但让我们解释一下。如果你需要在数组中获取数组,你可以在一个新的循环中创建一个循环,就像这样:

      {% for item in category.item %}
         {% for subcategory in category.subcategory %}
           {{ subcategory.title}}
         {% endfor %}
      {% endfor %}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-13
        • 2020-11-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多