4

我希望有一种方法可以将 Stash Context 与类别一起使用,例如,如下所示:

{exp:channel:entries channel="channel-name" dynamic="no" disable="member_data|pagination"}
    {exp:stash:append_list name='list' parse_tags="yes" save="yes" scope="site" context='{categories}{category_name}{/categories}'}
        {stash:this_title}{title}{/stash:this_title}
        {categories}
            {stash:this_category_name}
                {category_name}
            {/stash:this_category_name}
        {/categories}
    {/exp:stash:append_list}
{/exp:channel:entries}


{exp:stash:get_list name="list" parse_tags="yes" parse_conditionals="yes" context="{this_category_name}"}                   
    <div>
        all my stash variables and html etc.
    </div>
{/exp:stash:get_list}

我知道我可以执行以下操作,这意味着每次添加类别时都必须有人编辑模板。

{exp:stash:get_list name="list" parse_tags="yes" parse_conditionals="yes" context="category1"}                  
    <div>
        all my stash variables and html etc.
    </div>
{/exp:stash:get_list}


{exp:stash:get_list name="list" parse_tags="yes" parse_conditionals="yes" context="category2"}                  
    <div>
        all my stash variables and html etc.
    </div>
{/exp:stash:get_list}

话虽如此,我的问题是:无论如何动态使用 Stash 上下文和 ExpressionEngine 类别?

4

3 回答 3

7

您遇到的问题归结为 exp:channel:entries 循环运行多次迭代,然后使用 Stash 设置关联的值数组。一旦 channel:entries 竞争,你就有一个 {this_category_name} 变量数组,所以它实际上从来没有像常规变量那样设置。

所以你真的有几个选择:

  1. 使用 URI 段,因为这些是早期解析的。
  2. 使用 exp:stash:set 标记设置片段类型变量,该变量可以稍后在页面上解析。
  3. 硬编码值

这是我的代码,我已经对其进行了测试,并且可以确认 100% 可以正常工作。1 警告,如果您的条目有多个类别,这将中断。我相信这将使用迭代中的第一个类别集。

注意,一定要使用 process="end" 参数来操作解析顺序,否则你会得到一个空白屏幕。

{exp:channel:entries channel="your-channel" dynamic="no" disable="member_data|pagination"}
    {exp:stash:append_list name='list' parse_tags="yes" save="yes" scope="site" context='{categories}{category_name}{/categories}'}
        {stash:this_title}{title}{/stash:this_title}
        {categories}
            {stash:this_category_name}
                {category_name}
            {/stash:this_category_name}

            {exp:stash:set name="test_var" type="snippet"}{category_name}{/exp:stash:set}
        {/categories}
    {/exp:stash:append_list}
{/exp:channel:entries}

{exp:stash:parse process="end"}

    {exp:stash:get_list name="list" parse_tags="yes" parse_conditionals="yes" context="{test_var}" process="end"}
        <div>
            all my stash variables and html etc.
        </div>
    {/exp:stash:get_list}

{/exp:stash:parse}

我要补充一点,可能有更好的方法来解决您的问题。您尝试做的事情的逻辑并没有真正加起来。我只是试图回答你关于 Stash 的问题,以及它是否可以做到,而不是最好的方式。

于 2012-10-23T23:10:16.873 回答
4

为什么需要使用上下文?我想我不清楚您如何尝试使用 get_list 来输出数据。这样的事情会实现你需要做的吗?

于 2012-10-23T22:55:58.037 回答
1

也许您需要将整个 append_list 标签包装在 {categories}{/categories} 中,而不是将其作为 stash 标签的参数运行?

也就是说,它也可能是解析顺序问题,因此您可能也需要 exp:stash:parse 在那里的某个地方。

于 2012-10-23T22:46:34.960 回答