Вывод последних статей модуля "Статьи" (article) на главной странице в CMS Danneo 1.5.4 реализован блоком b-Article и позволяет вывести заданное в конфигурации блока количество статей.
Данная реализация не всегда может удовлетворять требованиям к оформлению. В частности для блога более функциональным является наличие возможности листать последние публикации на главной странице не переходя в отдельные категории.
Добавим возможность постраничного просмотра статей на главной странице.
Для начала, чтобы сохранить имеющийся модуль и его функционал не измененными для возможности переключения в случае необходимости, сделаем копию-клон. Для этого копируем блок мода `article`, который находтся по пути '/block/b-Article.php' и называем его '/block/b-ArticlePaged.php'. В админ панели добавляем на главную страницу новый блок. Все настройки блока идентичны его родителю 'b-Article'.
Первое, что необходимо сделать - обучить роутер переходить на нужные страницы в пределах домашней(главной). Исходя из замыслов разработчиков, любой переход с главной страницы, если он отсутствует, ведет к модулю 'Pages'. Т.е. если в URL указать 'http://site-name/page3', то вероятнее всего будет выведена ошибка '404', так как такой страницы не существует. Но, как было уже сказано, обработка данного запроса производится модулем 'Pages'. Чтобы не ломать весь другой функционал данного модуля, просто сделаем переадресацию ссылок вида 'http://site-name/page5' на главную страницу.
Для этого добавим шаблон преобразования url для роутера модуля 'Pages'.
В файл '/mod/pages/mod.rules.php' в раздел 'to' добавляем строчку вида:
"page(d+)" => "index.php?dn=home&p=$1",
Обратное преобразование нужно добавить для роутера модуля 'Home'.
В файл '/mod/home/mod.rules.php' в раздел 're' добавляем строчку вида:
"index.php?dn=".$WORKMOD."&p=(d+)" => "page$1"
Далее приступаем к редактированию файла блока '/block/b-ArticlePaged.php'.
В начале файла находим код:
$lang['block_article'] = isset($lang['block_article']) ? $lang['block_article'] : 'Article';
И меняем его на следующий:
$lang['block_article_paged'] = isset($lang['block_article_paged']) ? $lang['block_article_paged'] : 'ArticlePaged';
Находим далее по коду следующий фрагмент:
/**
* Получаем настройки
*/
if (
isset($config['bsarray']) AND
is_array($config['bsarray']) AND
isset($config['mod'][$config['bsarray']['mod']])
) {
$ins = array();
$bs = $config['bsarray'];
$cats = preg_replace('/[^0-9,]/', '', trim($bs['cats'], ' '));
$cats = ($cats !== '') ? " art.catid IN (".$cats.") AND" : "";
и после него вставляем следующий код:
/**
* Номер страницы, SEO
*/
$seopage = isset($p) ? ', '.mb_strtolower($lang['page_one']).'-'.$p : '';
$p = preparse($p, THIS_INT);
$p = ( ! isset($p) OR $p <= 1) ? 1 : $p;
// вычисляем начальную позицию для запроса с учетом выбранной страницы
$s = $bs['col'] * ($p - 1);
/**
* Новые статьи
*/
// Количество всех новых публикаций
$total_last = $db->fetchassoc(
$db->query(
"SELECT COUNT(id) AS total FROM ".$basepref."_".$bs['mod']." AS art
LEFT JOIN ".$basepref."_".$bs['mod']."_cat AS cat ON (art.catid = cat.catid)
WHERE".$cats." art.act = 'yes' ".$imp."
AND (stpublic = 0 OR stpublic < '".NEWTIME."')
AND (unpublic = 0 OR unpublic > '".NEWTIME."')
".(($bs['imp'] == 'yes') ? 'AND imp = 1 ' : '')
)
);
// Построение пагинации страниц последних публикаций
$ins['pages'] = null;
if ($total_last['total'] > $conf['pagcol']) {
$ins['pagesview'] = $api->pages(
$bs['mod']." AS art
LEFT JOIN ".$basepref."_".$bs['mod']."_cat AS cat ON (art.catid = cat.catid)
WHERE".$cats." art.act = 'yes' ".$imp."
AND (stpublic = 0 OR stpublic < '".NEWTIME."')
AND (unpublic = 0 OR unpublic > '".NEWTIME."')",
'id', 'index', 'home', $bs['col'], $p, $total_last['total']
);
$ins['pages'] = "".$ins['pagesview']."";
}
Для вывода пагинации страниц, перед кодом:
/**
* Вывод
*/
return $api->siteuni($bc);
добавляем строку
$bc.= $ins['pages'];
Отключаем вывод новостей на 2-й и последующих страницах
Основной смысл данного изменения в том, что если уж пользователь перешел на последующую страницу со статьями, то значит его заинтересовали именно статьи и выводить лишнюю информацию не совсем правильно. Именно поэтому отключим вывод новостей на всех страницах кроме 1-й.
Для этого открываем файл блока '/block/b-News.php' и после строк:
$bc = null;
$lang['block_news'] = isset($lang['block_news']) ? $lang['block_news'] : 'News';
вставляем код:
/**
* Номер страницы, SEO
*/
$seopage = isset($p) ? ', '.mb_strtolower($lang['page_one']).'-'.$p : '';
$p = preparse($p, THIS_INT);
$p = ( ! isset($p) OR $p <= 1) ? 1 : $p;
// если страница не первая, то новости не выводим
if ($p > 1) {
$val_block = null;
return;
}