Дано: 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