Как отобразить элементы из диапазона дат, выбранного с помощью элемента select в ExpressionEngine - PullRequest
0 голосов
/ 13 декабря 2011

В ExpressionEngine у ​​меня есть шаблон новостей, который отображает новости. Я пытаюсь реализовать элемент select, который позволяет пользователю выбирать определенный год, а затем видеть только новостные элементы, введенные в течение этого года.

Вот мой код:

<select name="select_year">
            <option value="">Select year</option>
            <option value="2011">2011</option>
            <option value="2010">2010</option>
            <option value="2009">2009</option>
        </select>   

                    {exp:channel:entries
                channel="news-items"
                disable="categories|category_fields|trackbacks"
                dynamic="off"
                require_entry="yes"
                sort="desc"
                search:news-item-featured="featured"
                limit="1"}

                <div align="left">
                  <h2 align="center" style="margin-top: 0pt; margin-bottom: 0pt;">{title}</h2>
                </div>

                {if news-item-main-image}
                    {exp:imgsizer:size src="{news-item-main-image}" width="352"}
                        <p style="margin-top: 0pt;"><img align="middle" width="352" src="{sized}"></p>
                    {/exp:imgsizer:size}
                {/if}

                {news-item-intro-text}

                <p><a href="{title_permalink='news-item'}">Click here to read the full story. </a></p>

            {/exp:channel:entries}
<br><br>

            <h3 style="margin-top: 0pt;">News History</h3>
            <ul>

            {exp:channel:entries
                channel="news-items"
                disable="categories|category_fields|trackbacks"
                dynamic="off"
                require_entry="yes"
                limit="19"
                paginate="bottom"
                paginate_base="/news"}

                    <li><p></p><h3><a href="{title_permalink='news-item'}">{title}</a></h3>
                    <input type="hidden" value="" name="news_id">{entry_date format="%n/%j/%Y"}&nbsp;-&nbsp;</li>

                {paginate}

                    </ul>
                    <p><br />

                        {pagination_links}

                        {current_page} of {total_pages}
                     </p>

                {/paginate}

            {/exp:channel:entries}

Код отображает все новости на данный момент. Он состоит из избранного новостного элемента в самом верху и гиперссылочного списка всех предыдущих новостных элементов под ним.

Есть ли способ указать переменную для хранения выбранного значения из элемента select в самом верху, чтобы я мог использовать его с новостями ниже? Или, может быть, есть лучший способ?

1 Ответ

2 голосов
/ 13 декабря 2011

Есть несколько способов сделать это (как и большинство задач в EE). Вы можете изучить использование динамических параметров в EE. Динамические параметры EE позволяют вашим пользователям выбирать различные параметры (включая год), но они также отключают кэширование для шаблона и не обновляют URL.

Вы также можете использовать сегменты URL, чтобы контролировать, какой год отображается. Это гораздо чаще, чем использование динамических параметров. Допустим, ваша страница индекса новостей имеет значение http://site.com/news.. Вы можете активировать функцию «архивирования», добавив второй сегмент URL, например: http://site.com/news/archive.

Затем в вашем шаблоне вы можете использовать простые условные выражения для запуска определенного кода для макета архива. Вот как будет выглядеть ваша страница при таком подходе (важные изменения выделены жирным шрифтом):

{exp:channel:entries
    channel="news-items"
    disable="categories|category_fields|trackbacks"
    dynamic="off"
    require_entry="yes"
    sort="desc"
    search:news-item-featured="featured"
    limit="1"
    {if segment_2 == 'archive'}year="{segment_3}"{/if}
}
    <div align="left">
        <h2 align="center" style="margin-top: 0pt; margin-bottom: 0pt;">{title}</h2>
    </div>
    {if news-item-main-image}
        {exp:imgsizer:size src="{news-item-main-image}" width="352"}
            <p style="margin-top: 0pt;"><img align="middle" width="352" src="{sized}"></p>
        {/exp:imgsizer:size}
    {/if}
    {news-item-intro-text}
    <p><a href="{title_permalink='news-item'}">Click here to read the full story.</a></p>
{/exp:channel:entries}

{exp:channel:entries
    channel="news-items"
    disable="categories|category_fields|trackbacks"
    dynamic="off"
    require_entry="yes"
    limit="19"
    paginate="bottom"
    paginate_base="/news"
    **{if segment_2 == 'archive'}year="{segment_3}"{/if}**
}
    {if count == '1'}
        <h3>News History **{if segment_2 == 'archive'} for {segment_3}{/if}**</h3>
        <ul>
    {/if}
        <li>
            <h3><a href="{title_permalink='news-item'}">{title}</a></h3>
            <input type="hidden" value="" name="news_id">{entry_date format="%n/%j/%Y"}&nbsp;-&nbsp;
        </li>
    {if count == total_results}
        </ul>
    {/if}

    {paginate}
        <p>
            {pagination_links}
            {current_page} of {total_pages}
        </p>
    {/paginate}

{/exp:channel:entries} 

Обратите внимание, что я просто добавил несколько условных тегов {if segment_2 == 'archive'}{/if} в ваш код.

Кроме того, вы можете отказаться от выпадающего меню выбора и использовать плагин Low free Yearly Archives для EE. Этот плагин дает вам большую гибкость для отображения годовых / ежемесячных архивных ссылок. Если вы действительно хотите сохранить меню выбора, вы можете добавить в микс JavaScript, чтобы каждая опция перенаправляла пользователя на соответствующий URL-адрес архива.

...