Архив новостей CMS Made Simple

Апрель 25th, 2011 by McCrush Комментировать »

Дано: CMS Made Simple + News module
Требуется: сделать архив новостей с разбивкой вывода по месяцам как на wordpress.
Проблема: в версии 1.9.4.1 такого функционала попросту нет.

Решается задача конечно же извращенскими модификациями, но они работают :)

Для решения данной задачи нам потребуется установить дополнительный модуль «NFS» и кое-что в нем подправить, а также написать немного PHP-кода в шаблоне. Возможно, извращения могли быть менее хардкорными, но я всё придумал именно так.

Для начала давайте создадим страничку, на которой и будем транслировать наш архив. В моем случае страница имеет алиас «news». Вставляем на страничку код:

{cms_module module="nfs" dateformat="%d.%m.%Y" sortasc="true"}

Открываем файл modules/NFS/action.default.php, находим строчку:

$where_date = '';

После нее добавляем такой код:


if($_GET['ar_month']){
$mcget = explode("-", $_GET['ar_month']);
if($_GET['ar_month'] != 'all'){
$mcfromdate = $mcget[0]."-".$mcget[1]."-%";
$where_date .= " AND news_date LIKE '".$mcfromdate."' ";
}
}else{

И затем, перед строкой

$orderby = '';

закрываем фигурную скобку:

}

То есть, если наша страничка получает GET-параметр ar_news, то родной код модуля не выполняется, а выполняется наш.

Далее нам нужно выключить бегущую строку. Ищем такое:


echo '<marquee LOOP="infinite" truespeed="truespeed" direction="'.$scroll_direction.'" scrollamount="'.$scroll_amount.'" scrolldelay="'.$scroll_delay.'"'.$scroll_behavior. $css_id . $css_class;

такое:

echo $mouseover.'>'."\n";

и такое:

echo '</marquee>'."\n";

и просто комментируем, поставив в начале строки // (два слеша), выключая эти строки.

Окей, сохраняем файл.

Теперь нам нужно вывести в сайдбар несколько строк вида:

Январь 1969
Февраль 1969
… и т.д.

Для этого нам нужно в нужном месте шаблона выполнить такой PHP-код:


{php}
function news_archive(){

$num_rows = "3"; // Здесь задаем количество выводимых строчек
$date = date("Y-m");

$months = array(
'01' => 'Январь',
'02' => 'Февраль',
'03' => 'Март',
'04' => 'Апрель',
'05' => 'Май',
'06' => 'Июнь',
'07' => 'Июль',
'08' => 'Август',
'09' => 'Сентябрь',
'10' => 'Октябрь',
'11' => 'Ноябрь',
'12' => 'Декабрь',
);

$mc_out = "<ul>";
for($i=$num_rows; $i > 0; $i--){
if($i > 0){
$j = $i - 1;
if(date('d') > '28'){ // Чтобы не было косяков с февралём
$date = date("Y-m", strtotime("- $j month - 7 days"));
}else{
$date = date("Y-m", strtotime("- $j month"));
}
}

$preprint_date = explode("-", $date);
$printable = $months[$preprint_date[1]]." ".$preprint_date[0];

$mc_out .= "<li><a href=\"/news/?ar_month=".$date."\">".$printable."</a></li>";
}
$mc_out .= "</ul>";

$mc_out .= "<p align=\"right\"><a href=\"/news/?ar_month=all\">Смотреть весь архив</a></p>";

return $mc_out;
}
print news_archive();
{/php}

И не забудьте включить опцию выполнения PHP-кода в шаблонах. Делается это в конфигурационном файле CMS.

Наш PHP-код «завернут» в функцию для того, чтобы случайно не «перебить» какую-нибудь переменную ядра.

Вуа-ля, у меня все работает.

Пример скоро можно будет посмотреть на сайте заказчика: navruzfm.uz

Комментирование закрыто.