Давайте вместе разберемся с модулем новостей раз и навсегда.
Задача: Добиться нормального ЧПУ для модуля новостей, а именно создать ссылки вида 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/ - раздел новости

/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";
Но не тут то было!
Ссылка такого вида, конечно получается, но по ней мы попадаем на 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-запросами, ответами и т.д. и мне очень нужна ваша квалифицированная помощь, самостоятельно я буду разбираться с этой проблемой очень долго.
