Искать  
 
   
 
Раздел и записи в одном шаблоне
Отправлено: 28 Март 2013 08:15 A.M.   [ Игнорировать ]
Студент
Avatar
RankRank
Всего сообщений:  113
Зарегистрирован  2010-07-12

В общем ситуация следующая:
На сайте раздел новостей отображается через шаблон newslist, пагинация раздела имеет ссылки newslist/P15, а сами записи выводятся в другом шаблоне и имеют УРЛ news/1234.
В последнее время меня стала бесить такая структура, да и с точки зрения SEO, мне кажется это не рациональным.
В итоге хочу сделать так чтобы все отображалось через один шаблон news.
У меня получается это сделать вот таким способом, но без pagination, т.е. при условии что список записей будет на одной странице:

{if segment_2 == ''}
    {exp
:channel:entries channel="news" orderby="date" sort="asc" disable="pagination|category_fields|member_data|trackbacks"}            
        
<li><a href="/news/{entry_id}">{title}</a></li>
    
{/exp:channel:entries} 
{if
:else}
    {exp
:channel:entries channel="news" orderby="date" sort="asc" disable="pagination|category_fields|member_data|trackbacks"}        
        {if no_results}{redirect
="404"}{/if}
        
<div id="nav">
            <
a href="/">Главная</a> &raquo; <a href="/news">Новости</a>
        </
div>                                    
        
        <
h1>{title}</h1>
        
        
{news_text}                        
                                
    {
/exp:channel:entries} 
{
/if} 

Если же добавить пагинацию, то она влезет в сегменты и не дает нормально определить ID Записи.

Нужен свежий взгляд со стороны. Как впихнуть все в один шаблон?

Профиль
 
 
Отправлено: 28 Март 2013 01:33 P.M.   [ Игнорировать ]   [ # 1 ]
Member
Avatar
RankRankRank
Всего сообщений:  224
Зарегистрирован  2010-11-20

Обычно, для решения подобных задач построения структуры шаблонов
сайта в группе создается абстрактный шаблон “index”.
Он может быть очень прост по содержанию:

{if segment_2 == ""}
{embed
="news/list"}
{if
:else}
{embed
="news/entry"}
{
/if} 

Подключаемые, в зависимости от условий шаблоны, должны иметь
целостную структуру. Кроме того, если необходимо учитывать
сегмент пагинации, то нужно открыть для этого шаблона PHP, а
в верхнее условие добавить регулярное выражение на PHP для
обнаружения сегмента пагинации.

Профиль
 
 
Отправлено: 28 Март 2013 01:53 P.M.   [ Игнорировать ]   [ # 2 ]
Студент
RankRank
Всего сообщений:  100
Зарегистрирован  2009-05-13

Проверяю сегмент таким условием:

preg_match("/(?:^P\d+\z)/",$seg_var


PHP на входе.

Профиль
 
 
Отправлено: 29 Март 2013 04:48 P.M.   [ Игнорировать ]   [ # 3 ]
Студент
Avatar
RankRank
Всего сообщений:  113
Зарегистрирован  2010-07-12

Спасибо за подсказки. Все работает!
Добавил кстати еще в шаблон отображение категорий, про них забыл в первом посте написать.

Посмотрите всё ли я правильно сделал, и можно ли как то оптимизировать код:

{if segment_2 == ""}
    {embed
="news/list"}
{if
:else}
    <?php 
        
global $IN;
        
$seg_var $IN->fetch_uri_segment("2");
                
        if (
preg_match("/(?:^P\d+\z)/",$seg_var)) {
            ?>
                {embed
="news/list"}
            <?php
        } 
elseif (preg_match("/(?:^C\d+\z)/",$seg_var)) {
            ?>
                {embed
="news/category"}        
            <?php
        } 
else {
            ?>
                {embed
="news/entry"}        
            <?php
        }
    ?>
{
/if} 
Профиль
 
 
Отправлено: 29 Март 2013 09:26 P.M.   [ Игнорировать ]   [ # 4 ]
Member
Avatar
RankRankRank
Всего сообщений:  224
Зарегистрирован  2010-11-20

Можно даже вот так:

{if segment_2 == "" OR <?php echo preg_match("#^P(\d+)$#","{segment_2}"?>}
  {embed
="news/list"}
{if
:elseif <?php echo preg_match("#^C(\d+)$#","{segment_2}"?>}
  {embed
="news/category"}
{if
:else}
  {embed
="news/entry"}
{
/if} 
Профиль
 
 
Отправлено: 02 Апрель 2013 09:02 A.M.   [ Игнорировать ]   [ # 5 ]
Студент
Avatar
RankRank
Всего сообщений:  113
Зарегистрирован  2010-07-12

Спасибо Afgan! Замечательно работает. И гораздо компактнее.

Профиль
 
 
Отправлено: 20 Апрель 2013 08:53 A.M.   [ Игнорировать ]   [ # 6 ]
Студент
Avatar
RankRank
Всего сообщений:  113
Зарегистрирован  2010-07-12

Помогите еще сделать нормальный 301 редирект с раздела newslist на раздел news.

UPD:
Добавил в .htaccess вот эти строки, вроде работает:

RewriteRule ^newslist(.*)$ /news$1 [L,R=301]
RewriteRule 
^newscat(.*)$ /news$1 [L,R=301] 
Профиль