从Stash列表中排除某些条目

时间:2012-10-31 22:02:37

标签: expressionengine

好的,在我的主页上,我想提取3个新闻列表;主要新闻,特色新闻和新闻头条。一次只能在主要新闻标题下显示一个项目,任何其他标记为此类的条目将过滤回特色新闻列表。

我的问题是捕获'one'主要新闻项的entry_id并将其从特色列表中排除。主要新闻项目可能并不总是最新的新闻项目,因此使用offset =“1”排除规则。

所以我把一些Stash集合在一起,根据自定义字段过滤掉新闻(cf_news_article_type)。 cf_news_article_type是用户在添加新闻项时设置的3个单选按钮的列表。字段的值设置如下:

mj : Major Feature
gf : Featured Article
gn : General article

我藏匿了所有类型的13个新闻项目:

{!-- Bring out all the recent news --}
{exp:channel:entries channel="news" orderby="date" sort="desc" dynamic="no" limit="13" parse="inward" disable="categories|category_fields|member_data|pagination|trackbacks"}
{exp:stash:append_list name='recent_articles'}
    {stash:item_count}{count}{/stash:item_count}
    {stash:item_type}{cf_news_article_type}{/stash:item_type}
    {stash:item_title}{title}{/stash:item_title}
{/exp:stash:append_list}
{/exp:channel:entries}

然后在我的模板中,我推出了主要新闻项目:

<article class="major-feature">
{exp:stash:get_list name="recent_articles" match="#mj#" against="item_type" limit="1" parse_tags="yes"}
    {sn_news_story}
{/exp:stash:get_list}
</article>

现在最大的问题是:如何从特色新闻列表中排除该单个主要新闻项目,但是当我获得精选存储列表时,将其他项目标记为“mj”?

<section class="featured-stories">
<h1>Featured stories</h1>
{exp:stash:get_list name="recent_articles" match="#(mj|gf)#" against="item_type" limit="3" parse_tags="yes"}
    {sn_news_story}
{/exp:stash:get_list}
</section>

然后,对于我的头条新闻,我很想排除这两个列表中显示的所有精选和主要新闻项目,但我会在另一篇文章中解决这个问题。

这甚至是做这种事情的正确方法吗? 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

如何分别存储您的精选新闻文章?例如:

{!-- find just the featured article --}
{exp:channel:entries channel="news" orderby="date" sort="desc" dynamic="no" search:cf_news_article_type="mj" limit="1" parse="inward"}
    {exp:stash:append_list name='featured_article'}
        {stash:item_count}{count}{/stash:item_count}
        {stash:item_type}{cf_news_article_type}{/stash:item_type}
        {stash:item_title}{title}{/stash:item_title}
    {/exp:stash:append_list}
    {exp:stash:set_value name="featured_article_id" value="{entry_id}" type="snippet"}
{/exp:channel:entries}

然后当您找到剩下的新闻时,只需忽略您已经存档的精选文章:

{!-- find the rest of the news --}
{exp:channel:entries channel="news" orderby="date" sort="desc" dynamic="no" limit="12" entry_id="not {featured_article_id}" parse="inward"}
    {exp:stash:append_list name='recent_articles'}
        {stash:item_count}{count}{/stash:item_count}
        {stash:item_type}{cf_news_article_type}{/stash:item_type}
        {stash:item_title}{title}{/stash:item_title}
    {/exp:stash:append_list}
{/exp:channel:entries}

(我不确定你是否会遇到{featured_article_id}的解析订单问题,但如果是这样的话应该有办法绕过它)

或者,如果您不介意所有精选新闻文章位于列表顶部,则可以使用orderby="cf_news_article_type|date",然后使用limit=""offset=""来获取列表中的第一篇新闻文章。

更新:您也可以反过来这样做,并在检索列表时检查entry_id:

<article class="major-feature">
    {exp:stash:get_list name="recent_articles" match="#mj#" against="item_type" limit="1" parse_tags="yes"}
        {exp:stash:set_value name="featured_article_id" value="{entry_id}" type="snippet"}
        {sn_news_story}
    {/exp:stash:get_list}
</article> 

<section class="featured-stories">
    <h1>Featured stories</h1>
    {exp:stash:get_list name="recent_articles" match="#(mj|gf)#" against="item_type" limit="3" parse_tags="yes"}
        {if "{entry_id}" != "{featured_article_id}"}
            {sn_news_story}
        {/if}
    {/exp:stash:get_list}
</section>