ЧПУ для module_news. (РЕШЕНО)

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

Moderators: iturbay, wdwp

Locked
legko
Forum Members
Forum Members
Posts: 88
Joined: Sun Jan 10, 2010 1:54 am

ЧПУ для module_news. (РЕШЕНО)

Post by legko »

Этот вопрос на форуме поднимался неоднократно, но вразумительного ответа на него до сих пор нет.
Давайте вместе разберемся с модулем новостей раз и навсегда.

Задача: Добиться нормального ЧПУ для модуля новостей, а именно создать ссылки вида http://www.site.ru/zagolovok-novjsti.html или хотя бы вида http://www.site.ru/news/zagolovok-novjsti.html

Итак, что мы имеем CMS Made Simple 1.6.6
1. Для вывода новостей на сайте в шаблон страницы достаточно вставить тег {news}.
Для этого в админке разделе Контент » Страницы создадим новый контент.
  Пусть Заголовок /*title*/ страницы будет "Новости", а  алиас этой страницы будет novosti.
  В поле Content: впишем наш тег {news}
Адрес только что созданной нами страницы с включенным ЧПУ будет выглядеть как http://www.site.ru/novosti.html
2. В Админке, в разделе Контент » Новости создадим новость вида:
   Заголовок: Первая новость
   Категория: Новости /*Идет по умолчанию*/
   Резюме: Заголовок первой новости
   Полный текст: Полный текст первой новости  
3. Зайдя по адресу http://www.site.ru/novosti.html мы увидим список новостей (краткое содержание) в обратном хронологическом порядке.
Первой новостью будет News Module Installed
Вторая наша, только что созданная новость.

Нам интересны следующие моменты:
Сам заголовок новости (Первая новость) и строка [Подробнее] представляют собой ссылку на страницу самой новости.
Эта ссылка будет иметь вид: http://www.site.ru/news/2/23/pervaya-novost.html /*у вас вместо 23 будет другое число, см. ниже*/
Что нас не устраивает:
1. /news/2/23/ - ну как-то не совсем человекопонятный URL. News - еще как-то человекопонятно, а /2/23/- вроде не очень.
2. Перейдя по ссылке http://www.site.ru/news/2/23/pervaya-novost.html мы все равно остаемся на страничке Новости, (т.е. title страницы не изменился со слова "Новости" на заголовок "Первая новость"). Но это больше SEO, а не ЧПУ, хотя вопрос тоже нужно решать.  

Теперь давайте разбираться с нашей ссылкой http://www.site.ru/news/2/23/pervaya-novost.html
/news/ - раздел новости ??? (видимо идентифицирует новости, запускает обработчик модуля News)
/2/ число "два" представляет собой id новости (т.е. это вторая новость, а вернее значение news_id в таблице _module_news нашей SQL базы)
/23/ число "двадцать три" представляет собой ссылку на страницу на которой размещены новости (novosti.html), а если быть более точным, то это значение content_id в таблице _content в SQL базе.

Где формируется такая человекоНЕпонятная ссылка?
- ссылка формируется в файле /modules/News/action.default.php в строке 344

Code: Select all

$prettyurl = 'news/'.$row['news_id'].'/'.($detailpage!=''?$detailpage:$returnid)."/$aliased_title";
Вполне понятно, что
'news/' - это раздел новости ???
$row['news_id'] - это наша "двойка"
($detailpage!=''?$detailpage:$returnid) - это "двадцать три"
$aliased_title - заголовок новости /*pervaya-novost*/
Последние три переменные передаются обработчику и по ним он осуществляет поиск в базе SQL (см. ниже)

Казалось бы, чего проще преобразовать код к виду:

Code: Select all

$prettyurl = "$aliased_title";
и получить ссылку http://www.site.ru/pervaya-novost.html
Но не тут то было!
Ссылка такого вида, конечно получается, но по ней мы попадаем на 404-ю страницу (Not Found The requested URL was not found on this server.) И это тоже не удивительно. Было бы все так просто - не было бы проблем.

Тут я вижу две проблемы:
Во-первых такой URL никак  НЕ указывает на то, что это ИМЕННО новости, а не контент, поэтому разбирая URL http://www.site.ru/pervaya-novost.html  обработчик ищет данные в в таблице _content , а НЕ в таблице _module_news в SQL базе.
Во-вторых, даже если обработчик поймет, что это НОВОСТИ а не контент, данных, передаваемых URL недостаточно для поиска по базе SQL (мы передаем только заголовок новости, а поиск осуществляется по другим параметрам).

Разбираемся с обработчиками
Для упрощения скажем так - контента обработчик это - /index.php, а для новостей /modules/News/News.module.php.
index.php получает URL вида: index.php?page=pervaya-novost (RewriteRule в .htaccess), предает данные в виде переменной pervaya-novost ядру CMS, ядро осуществляет поиск по базе в таблице _content, формирует ответ...
News.module.php самостоятельно разбирает URL (поправьте если я не прав) и осуществляет поиск по базе в таблице _module_news
ВНИМАНИЕ! Для новостей RewriteRule в .htaccess не работает, я пробовал удалять строки в .htaccess

Code: Select all

RewriteRule ^([0-9]*).html$ index.php?mact=News,cntnt01,detail,0&cntnt01articleid=$1 [NC,L]
RewriteRule ^([0-9]*)/([0-9]*).html$ index.php?mact=News,cntnt01,detail,0&cntnt01articleid=$1&cntnt01returnid=$2 [NC,L]
- результата никакого, ссылки работают, новости отображаются корректно, страница печати формируется правильно (попробуйте у себя и отпишитесь, может я не прав или чего-то не заметил)

Итак, что мы имеем для решения поставленной задачи?
Мы имеем два пути:
1. Добиваться ссылки вида http://www.site.ru/zagolovok-novjsti.html
В этом случае обработчику передается только один параметр, а именно zagolovok-novjsti. Обработчик (index.php) получает его в виде index.php?page=zagolovok-novjsti, передает ядру параметр "zagolovok-novjsti", ядро ищет данные в SQL базе в таблицах _content (уже сделано разработчиками CMS) и _module_news (нам нужно будет сделать) и если  данные найдены в таблице _module_news, формирует ответ и возвращает результат в обработчик /modules/News/News.module.php
Нужно не забывать, что при добавлении новости или контента нам необходимо будет сделать проверку на уникальность алиаса по двум таблицам (_content и _module_news), плюс у новостей существуют категории, о которых тоже не стОит забывать.
2. Добиваться ссылки вида http://www.site.ru/news/zagolovok-novjsti.html
В этом случае обработчику передаются два параметра, а именно news и zagolovok-novjsti. Обработчик (опять-таки index.php) понимает, что news - это новости и передает данные (zagolovok-novjsti) другому обработчику - /modules/News/News.module.php (все это уже сделано разработчиками CMS).
Нам остается только переделать модуль News.module.php так, что бы он искал данные только по одному параметру (zagolovok-novjsti), а не по трем, как это сделано разработчиками. Опять-таки не стОит забывать о категориях новостей (я еще с этим не разбирался).

Вопрос к сообществу:
Каким путем пойдем есть ли желающие мне помочь?
Я не программист, не знаю ни PHP ни SQL (так самоучка, просто соображалка кумекает и есть интерес), но знаю, что ничего невозможного нет.
Мне очень нравится эта CMS, это именно то, что я искал.
Пока я пытаюсь разбираться с php-кодом, sql-запросами, ответами и т.д. и мне очень нужна ваша квалифицированная помощь, самостоятельно я буду разбираться с этой проблемой очень долго. :(
Last edited by legko on Mon Jan 18, 2010 11:49 pm, edited 1 time in total.
User avatar
push
New Member
New Member
Posts: 6
Joined: Thu Dec 10, 2009 8:11 am

Re: ЧПУ для module_news. Давайте вместе разберемся

Post by push »

Полностью согласен со всем вышеописанным  :)

Я вам ответил в основном топике про ЧПУ. ещё раз продублирую решение проблемы здесь.


Подробно описал реализацию ЧПУ в модуле News http://2push.net/cmsms-seo-friendly-url
User avatar
Robur
Forum Members
Forum Members
Posts: 86
Joined: Wed Mar 11, 2009 10:41 am

Re: ЧПУ для module_news. Давайте вместе разберемся

Post by Robur »

push wrote:Подробно описал реализацию ЧПУ в модуле News http://2push.net/cmsms-seo-friendly-url
Страница не существует... :(
Locked

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