ЧПУ в постраничной навигации для news

Обсуждение CMS Made Simple в России.

Moderators: iturbay, wdwp

Post Reply
von-hamster
Power Poster
Power Poster
Posts: 339
Joined: Thu Nov 01, 2007 3:11 pm

ЧПУ в постраничной навигации для news

Post by von-hamster »

Есть готовое решение!


Добавляю грубый (относительно) фикс. Патч для версии новостей 2.9.3 (возможно подойдет для других) в приложении, на ревизии не смотреть - это мои внутренние.

Урлы будут иметь вид news/p_[номер страницы]

Далее по шагам, для тех, кто не понимает патчи :)
---------------------------------------------
News.module.php, функция SetParameters().

Code: Select all

//После
$this->RegisterRoute('/[nN]ews\/(?P<articleid>[0-9]+)$/');

//Добавляем:
$this->RegisterRoute('/[nN]ews\/p_(?P<pagenumber>[0-9]+)$/', array('action'=>'default', 'returnid' => 51, 'number'=>3, 'summarytemplate'=>'archive', 'detailpage'=>'news', ));

// при этом подставляем свои параметры ('returnid', 'number', 'summarytemplate', 'detailpage'), если нужно
---------------------------------------------
action.default.php, ищем строку: // Assign some pagination variables to smarty
От этой строки и до $smarty->assign('pagenumber',$pagenumber);
Меняем на:

Code: Select all

if( $pagenumber == 1 )
  {
    $smarty->assign('prevpage',$this->Lang('prevpage'));
    $smarty->assign('firstpage',$this->Lang('firstpage'));
  }
 else
  {
    $params['pagenumber']=$pagenumber-1;
	$pretty = 'news' . ($params['pagenumber'] == 1 ? '' : '/p_' . $params['pagenumber']);
    $smarty->assign('prevpage',
		    $this->CreateFrontendLink($id,$returnid,'default',
					      $this->Lang('prevpage'),$params,
						  '', false,true,'',false,$pretty));
    $smarty->assign('prevurl',
		    $this->CreateFrontendLink($id,$returnid,'default','',
					      $params, '', true,
						  true,'',false,$pretty));
    $params['pagenumber']=1;
	$pretty = 'news' . ($params['pagenumber'] == 1 ? '' : '/p_' . $params['pagenumber']);
    $smarty->assign('firstpage',
		    $this->CreateFrontendLink($id,$returnid,'default',
					      $this->Lang('firstpage'),$params,
						  '', false,true,'',false,$pretty));
    $smarty->assign('firsturl',
		    $this->CreateFrontendLink($id,$returnid,'default','',
					      $params, '', true,
						  true,'',false,$pretty));
  }
    
if( $pagenumber >= $pagecount )
  {
    $smarty->assign('nextpage',$this->Lang('nextpage'));
    $smarty->assign('lastpage',$this->Lang('lastpage'));
  }
 else
   {
     $params['pagenumber']=$pagenumber+1;
	 $pretty = 'news/p_' . $params['pagenumber'];
     $smarty->assign('nextpage',
		     $this->CreateFrontendLink($id,$returnid,'default',
					       $this->Lang('nextpage'),
					       $params,
						  '', false,true,'',false,$pretty));
     $smarty->assign('nexturl',
		    $this->CreateFrontendLink($id,$returnid,'default','',
					      $params, '', true,
						  true,'',false,$pretty));
     $params['pagenumber']=$pagecount;
	 $pretty = 'news/p_' . $params['pagenumber'];
     $smarty->assign('lastpage',
		     $this->CreateFrontendLink($id,$returnid,'default',
					       $this->Lang('lastpage'),
					       $params,
						  '', false,true,'',false,$pretty));
     $smarty->assign('lasturl',
		    $this->CreateFrontendLink($id,$returnid,'default','',
					      $params, '', true,
						  true,'',false,$pretty));
   }
Attachments

[The extension txt has been deactivated and can no longer be displayed.]

Last edited by von-hamster on Wed Jul 22, 2009 7:37 am, edited 1 time in total.
gasman
Forum Members
Forum Members
Posts: 22
Joined: Thu Jun 22, 2006 3:02 pm

Re: ЧПУ в постраничной навигации для news

Post by gasman »

Великолепно! Спасибо большое.
Sonya

Re: ЧПУ в постраничной навигации для news

Post by Sonya »

von-hamster wrote: Есть готовое решение!

Добавляю грубый (относительно) фикс.
Спасибо.

Я пыталась продать этот баг в форже http://dev.cmsmadesimple.org/bug/view/3633 Не берут, что-то там в гибкости модуля нарушается. А вот что конкретно? Съедаются параметры или что-то другое? Я в модуле так досконально не разбиралась, может у тебя есть идея, что они там под гибкостью подразумевают?
von-hamster
Power Poster
Power Poster
Posts: 339
Joined: Thu Nov 01, 2007 3:11 pm

Re: ЧПУ в постраничной навигации для news

Post by von-hamster »

Смысл в том, что там многие параметры таскаются в урле... В частности - 'returnid', 'number', 'summarytemplate', 'detailpage' и другие... Если все по умолчанию - ноль проблем... А когда начинаются подстановки тех-же шаблонов (например анонсы для главной и страница с архивом анонсов) - шаблон нужно где-то таскать за собой - они таскают в адресе страницы. Мое решение - частный случай, потому и грубый... Мне нужно было сделать быстро - потому особо не думал, как можно сделать правильно... Возможные баги: не проверял с категориями - скорее не будет работать, если разводящая не в news - тоже не будет работать... Имею ввиду - работать как надо...

Теоретически, чтобы все было нормально - можно сделать статический урл, который включает в себя все необходимые параметры, вот только он будет немногим меньше...

Еще как вариант - можно расширить шаблоны для новостей. Например, добавить все эти параметры в форму шаблона, а в урле передавать страницу и номер шаблона. А оттуда подставлять параметры, в том числе и страницу, на которой сейчас находимся...
ZYV
Language Partners
Language Partners
Posts: 868
Joined: Tue Nov 15, 2005 9:08 pm

Re: ЧПУ в постраничной навигации для news

Post by ZYV »

Ребята, давайте, давайте, ЧПУ у новостей отвратительный, исправите ситуацию --- будет 3 раза ку!  ;D
unsigned double ZYV;
von-hamster
Power Poster
Power Poster
Posts: 339
Joined: Thu Nov 01, 2007 3:11 pm

Re: ЧПУ в постраничной навигации для news

Post by von-hamster »

Опа... А куда делось мое сообщение????
ZYV
Language Partners
Language Partners
Posts: 868
Joined: Tue Nov 15, 2005 9:08 pm

Re: ЧПУ в постраничной навигации для news

Post by ZYV »

Akismet его съел, я вижу. Дропни кому-нибудь из админов, вытащат :( извини сам ничего сделать не могу
unsigned double ZYV;
von-hamster
Power Poster
Power Poster
Posts: 339
Joined: Thu Nov 01, 2007 3:11 pm

Re: ЧПУ в постраничной навигации для news

Post by von-hamster »

Еще появилась идея (пока теоретическая, примерно как реализовать - представляю, но руки врятли дойдут - может кому интересно будет, а может просто бред :) )

Можно использовать наборы настроек. Тоесть задаем набор с уникальным именем(идентификатором), в котором можем указать все настройки (шаблоны, сколько выводить анонсов, категория, альяс для страницы с детальным описанием и т.д.), которые относятся к новостям. Таких наборов можно создать несколько (например, для главной, для продуктов, для праздников и т.д.). А при подключении указываем идентификатор настроек (например, {news set='for_main'}). А при формировании чпу указать тоже только набор (например, /news/set_for_main/page_8/).

Возможные плюсы:
1. сокращение количества параметров, передаваемых в урле.
2. настройка в одном месте
3. Возможность использовать старый вариант
4. Применимо к другим модулям - все параметры можно получить из модуля автоматом

Возможные минусы:
Пока не вижу :)
Sonya

Re: ЧПУ в постраничной навигации для news

Post by Sonya »

В этой теме идет массовое пожирание постов.  ;D Но я все равно попытаюсь.

У меня была идея реализовать это посредством .htaccess и mod_rewrite. Правда работать это в inline не будет, но для поисковых машин inline - это все равно смертоубийство, поэтому я его с удовольствием проигнорирую. Создаем страницу news, пихаем в нее обыкновенный вызов {news} со всеми параметрами, которые нам нужны.

Дальше, всю постраничную навигацию переделываем в вызовы URLов
http://www.moisait.ru/news/page-1
http://www.moisait.ru/news/page-2
http://www.moisait.ru/news/page-n
....

Ловим в .htaccess этот самый page-n, отсекаем не нужное, имеем n = страница, этот параметр сохраняем и передаем в $_GET['pagenumber'] (или что там идет?).

Это только идея, даже не знаю возможно ли ее технически реализовать.
ZYV
Language Partners
Language Partners
Posts: 868
Joined: Tue Nov 15, 2005 9:08 pm

Re: ЧПУ в постраничной навигации для news

Post by ZYV »

RegExp для .htaccess написать такой элементарно. Вопрос в том, как генерировать навигационный ссылки.

Ладно, я в Мск :) Всем удачи!
unsigned double ZYV;
Sonya

Re: ЧПУ в постраничной навигации для news

Post by Sonya »

ZYV wrote: RegExp для .htaccess написать такой элементарно. Вопрос в том, как генерировать навигационный ссылки.

Ладно, я в Мск :) Всем удачи!
Короче меня тоже съело, как я посмотрю. Ссылку генерить элементарно в smarty, там есть и pagenumer и totalpages, из них состряпать навигацию просто. А вот RegExp мне дается только долго и мучительно....
ZYV
Language Partners
Language Partners
Posts: 868
Joined: Tue Nov 15, 2005 9:08 pm

Re: ЧПУ в постраничной навигации для news

Post by ZYV »

Нет, я к тому, что хорошо ли так делать, через Smarty? В CMSMS же есть какой-то свой API для генерации ссылок, а чтобы там было ЧПУ надо какие-то маршрутизаторы регистрировать...

RE, это очень просто, надо просто туториал какой-нибудь прочитать и всё. RE типа такого

RewriteRule ^news/page-([0-9]+)/?$ index.php?page=news&pagenumber=$1 [QSA,L]

Не уверен надо ли ескейпить минут, по-моему не надо.
unsigned double ZYV;
Sonya

Re: ЧПУ в постраничной навигации для news

Post by Sonya »

ZYV wrote: Нет, я к тому, что хорошо ли так делать, через Smarty? В CMSMS же есть какой-то свой API для генерации ссылок, а чтобы там было ЧПУ надо какие-то маршрутизаторы регистрировать...
Ну, так не хотят братья канадские патчить. А если решить это дело посредством mod_reqwrite+Smarty, то тогда нам Канада не указ. Ударим шаблонами по ЧПУ.
ZYV wrote: RE, это очень просто, надо просто туториал какой-нибудь прочитать и всё.
Читаю. Пока надо, все знаю, все понимаю. Потом месяца три не пользуюсь и опять, как с нуля. Все забываю. День сурка - "Как написать regex для начинающих" :)
ZYV wrote: RE типа такого

RewriteRule ^news/page-([0-9]+)/?$ index.php?page=news&pagenumber=$1 [QSA,L]
Смотрится красиво, я попробую.
ZYV
Language Partners
Language Partners
Posts: 868
Joined: Tue Nov 15, 2005 9:08 pm

Re: ЧПУ в постраничной навигации для news

Post by ZYV »

Это перед основным надо ставить, если что, но вроде итак понятно.

Про Канаду --- с ними надо вести долгие и изнурительные переговоры. В итоге они говорят, что с самого начала так и хотели сделать, просто ты невнятно излагаешь и всё применяют :)
unsigned double ZYV;
Post Reply

Return to “Russian - русский”