Перемещение по разделу статей (следующая и предыдущая)

+41
2.2K
Версия: InstantCMS v1.7

И так пилим дальше 😊
Заметно, что после прочтения статьи некуда дальше по сайту идти и те кто посещают наши сайты просто закрывают страницу. Но нам нужно удержать нашего посетителя на сайте, провести его дальше. Почему то для статей нет кнопок следующая и предыдущая, вот их то мы и сделаем.
Что нам понадобится так это немного дописать компонент статей. Открываем файл /components/content/model.php и прописываем новую функцию, которая нам будет выбирать рядом идущие статьи, назовем функцию getArticleWithButton и определим её скажем после функции getArticle:

  1. public function getArticleWithButton($article_id, $cat_id, $orderby = 'id', $order = 0) {
  2.  
  3. $sql = "SELECT *
  4. FROM cms_content
  5. WHERE category_id = '$cat_id' AND id <> $article_id ";
  6. switch ($orderby) {
  7. case 'pubdate':
  8. $sql .= " AND ($orderby BETWEEN '1900-01-01 00:00:00' AND '$order')
  9. ORDER BY $orderby DESC LIMIT 1";
  10. break;
  11. case 'ordering':
  12. $sql .= " AND id > $article_id
  13. ORDER BY $orderby DESC, id ASC LIMIT 1";
  14. break;
  15. default:
  16. $sql .= " AND id > $article_id
  17. ORDER BY id ASC LIMIT 1";
  18. break;
  19. }
  20. $result = $this->inDB->query($sql);
  21. if ($this->inDB->num_rows($result))
  22. $article['prev'] = $this->inDB->fetch_assoc($result);
  23.  
  24.  
  25. $sql = "SELECT *
  26. FROM cms_content
  27. WHERE category_id = '$cat_id' AND id <> $article_id ";
  28. switch ($orderby) {
  29. case 'pubdate':
  30. $sql .= " AND ($orderby BETWEEN '$order' AND '2100-01-01 00:00:00')
  31. ORDER BY $orderby ASC LIMIT 1";
  32. break;
  33. case 'ordering':
  34. $sql .= " AND id < $article_id
  35. ORDER BY $orderby DESC, id DESC LIMIT 1";
  36. break;
  37. default:
  38. $sql .= " AND id < $article_id
  39. ORDER BY id DESC LIMIT 1";
  40. break;
  41.  
  42. }
  43.  
  44. $result = $this->inDB->query($sql);
  45. if ($this->inDB->num_rows($result))
  46. $article['next'] = $this->inDB->fetch_assoc($result);
  47.  
  48. return $article;
  49. }
В этом файле мы как раз получаем статью следующую и предыдущую в зависимости от того поля мы сортируем.

Теперь будем пользовать эту функцию в файле, как вы уже наверное догадались /components/content/frontend.php. Открываем его, ищем кусок кода, где начало взятие из базы текущей статьи (у меня это 164 по 176 строку):
  1.  
  2. if ($do=='read'){
  3.  
  4. $inCore->includeConfig();
  5.  
  6. $seolink = $inCore->request('seolink', 'str', '');
  7.  
  8. $seolink = preg_replace ('/[^a-z0-9_\/\-]/i', '', $seolink);
  9.  
  10. if ($seolink) {
  11. $article = $model->getArticleByLink($seolink);
  12. } elseif($id) {
  13. $article = $model->getArticle($id);
  14. }
  15.  
и сразу после этого кода добавляем:
  1. $cat = $model->getCategory($article['category_id']);
этот код, берет категорию статей.

Ну и теперь самый важный код (вернее он весь тут самый важный, но этот как раз получает наши искомые статьи).
И так пролистываем ниже примерно до 272 строки и ищем код:
  1. if($cfg['rating'] && $article['canrate']){
  2. $inCore->loadLib('karma');
  3. $karma = cmsKarma('content', $article['id']);
  4.  
  5. $smarty->assign('karma_points', cmsKarmaFormatSmall($karma['points']));
  6. $smarty->assign('karma_votes', $karma['votes']);
  7.  
  8. $btns = cmsKarmaButtonsText('content', $article['id'], $karma['points'], $is_author);
  9. if ($btns) { $smarty->assign('karma_buttons', $btns); }
  10. }
и сразу после него добавляем код:
  1. $article_button = $model->getArticleWithButton($article['id'], $article['cat_id'], $cat['orderby'], $article[$cat['orderby']]);
  2. if ($article_button['prev']) $article_button['prev']['image'] = (file_exists(PATH.'/images/photos/medium/article'.$article_button['prev']['id'].'.jpg') ? 'article'.$article_button['prev']['id'].'.jpg' : '');
  3. if ($article_button['next']) $article_button['next']['image'] = (file_exists(PATH.'/images/photos/medium/article'.$article_button['next']['id'].'.jpg') ? 'article'.$article_button['next']['id'].'.jpg' : '');
  4. if ($cat['orderto']=="ASC") { list($article_button['next'],$article_button['prev']) = array($article_button['prev'],$article_button['next']); }
  5. $smarty->assign('article_button', $article_button);
  6.  
вот таким образом мы получили данные наших статей и в зависимости от метода сортировки они и будут показываться.
Теперь собственно осталось их вывести после текущей статьи, что бы можно было перейти на следующую или предыдущую. Открываем в шаблонах файл отвечающий за вывод текущей статьи /templates/мой_шаблон/components/com_content_read.tpl
Перемещаемся по файлу в самый конец и оформляем вывод следующей и предыдущей статьи. Я использовал заголовок статьи и картинку к статье для перехода, можно конечно и вставить описание, но это уже дело каждого, кто что хочет. Может кому то нужно будет просто сделать стрелочки влево и право. Здесь полет ваших фантазий.
  1. {if $article_button.prev || $article_button.next}
  2. <table width="100%" class="article_button">
  3. <tr>
  4. <th>{if $article_button.prev}Предыдущая статья в разделе <a href="/{$pcat.seolink}">{$article.cat_title}</a>{else} {/if}</th>
  5. <th>{if $article_button.next}Следующая статья в разделе <a href="/{$pcat.seolink}">{$article.cat_title}</a>{else} {/if}</th>
  6. </tr>
  7. <tr>
  8. <td width="50%" class="prev">{if $article_button.prev}
  9. <div class="title"><a href="/{$article_button.prev.seolink}.html">{$article_button.prev.title}</a></div>
  10. {if $article_button.prev.image}<div class="text"><a href="/{$article_button.prev.seolink}.html"><img src="/images/photos/small/{$article_button.prev.image}" alt="{$article_button.prev.title}" title="{$article_button.prev.title}" /></a></div>{/if}
  11. {else} {/if}</td>
  12. <td width="50%" class="next">{if $article_button.next}
  13. <div class="title"><a href="/{$article_button.next.seolink}.html">{$article_button.next.title}</a></div>
  14. {if $article_button.next.image}<div class="text"><a href="/{$article_button.next.seolink}.html"><img src="/images/photos/small/{$article_button.next.image}" alt="{$article_button.next.title}" title="{$article_button.next.title}" /></a></div>{/if}
  15. {else} {/if}</td>
  16. </tr>
  17. </table>
  18. {/if}
Для тех кому нужны только стрелочки можно вставить в шаблон следующий код, вместо того который выше:
  1.  
  2. <table width="100%" class="article_button">
  3. <tr>
  4. <td width="50%" class="prev">{if $article_button.prev}&#8592; <a href="/{$article_button.prev.seolink}.html">{$article_button.prev.title}</a>
  5. {else} {/if}</td>
  6. <td width="50%" class="next">{if $article_button.next}<a href="/{$article_button.next.seolink}.html">{$article_button.next.title} &#8594;</a>
  7. {else} {/if}</td>
  8. </tr>
  9. </table>
  10.  

Переменные, которые используются в шаблоне:
{$article_button.prev} — массив с предыдущей статьёй
{$article_button.next} — массив со следующей статьёй
{$article_button.next.title} {$article_button.next.title} — заголовок статьи
{$article_button.next.image} {$article_button.next.image} — картинка превьюшка к статье
{$article_button.next.seolink} {$article_button.next.seolink} — недоссылка к статье
{$article_button.next.description} {$article_button.next.description} — описание статьи

Думаю этих переменных достаточно что бы организовать перемещение по текущему разделу статей.
Пример можете посмотреть на сайте: oxuxo.ru/polezno/dom/komnatnye-rasteniya-i-cvety-dlya-doma.html

Пользуйтесь на благо посещаемости ваших проектов!
+1
Hmelex Hmelex 13 лет назад #
Спасибо молодец
+1
+4
Hmelex Hmelex 13 лет назад #
Было бы не плохо включить данное предложение в 1.8
+1
seego seego 13 лет назад #
Да, это было бы замечательное дополнение к статьям новых версиях
+1
13 лет назад #
Спасибо за труды! Хорошее дополнение.
0
nikolas nikolas 13 лет назад #
твердый + ..реализовал то что нада
Было бы не плохо включить данное предложение в 1.8

поддерживаю
0
Edik_Salonikski Edik_Salonikski 13 лет назад #
+ класс
0
imprint imprint 13 лет назад #
от меня тоже плюс....только не как не получается описание с боку картинки сделать...или с над ней или под ней....
+1
seego seego 13 лет назад #
Держи решение smile
Код PHP:
{if $article_button.prev || $article_button.next}
<table width="100%" border="0" class="article_button">
    <tr>
        <td width="50%" class="prev">{if $article_button.prev}
            <div class="cat">Предыдущая статья в разделе <a href="/{$pcat.seolink}">{$article.cat_title}</a></div>
            <div class="title"><a href="/{$article_button.prev.seolink}.html">{$article_button.prev.title}</a></div>
            <div class="text">{if $article_button.prev.image}<a href="/{$article_button.prev.seolink}.html"><img src="/images/photos/small/{$article_button.prev.image}" alt="{$article_button.prev.title}" title="{$article_button.prev.title}" align="left" /></a>{/if}{$article_button.prev.description|truncate:330:"...":true}</div>
        {else}&nbsp;{/if}</td>
        <td width="50%" class="next">{if $article_button.next}
            <div class="cat">Следующая статья в разделе <a href="/{$pcat.seolink}">{$article.cat_title}</a></div>
            <div class="title"><a href="/{$article_button.next.seolink}.html">{$article_button.next.title}</a></div>
            <div class="text">{if $article_button.next.image}<a href="/{$article_button.next.seolink}.html"><img src="/images/photos/small/{$article_button.next.image}" alt="{$article_button.next.title}" title="{$article_button.next.title}" align="right" /></a>{/if}{$article_button.next.description|truncate:330:"...":true}</div>
        {else}&nbsp;{/if}</td>
    </tr>
</table>
{/if}
и CSS:

.article_button { font-size: 80%; }
.article_button td {padding: 5px 10px; vertical-align: top;}
.article_button .title {font-size: 140%; font-style: italic; font-weight: bold; padding-top: 7px;}
0
imprint imprint 13 лет назад #
окей....спасибо....
0
Zau4man Zau4man 13 лет назад #
Спасибо большое. Завтра прикручу у себя!
0
Yuri Yuri 13 лет назад #
Спасибо!!!Слов,нет одни слюни.
0
braincord braincord 13 лет назад #
отличное дополнение, вы можете подсказать как вывести аватар автора статьи?
0
seego seego 13 лет назад #
Пока что нет, не знаю. Но думаю другие участники проекта знают и с удовольствием вам ответят.
0
mrDON mrDON 13 лет назад #
+ однозначно.
0
Умные Интернет Разработки Умные Интернет Разработки 13 лет назад #
мне необходимо чтобы это вылазило только для раздела новости, а что находиться в корневом разделе, чтобы не показывалось.
Возможно такое?
0
seego seego 13 лет назад #
мне необходимо чтобы это вылазило только для раздела новости
Простите, вылазило что?
0
Умные Интернет Разработки Умные Интернет Разработки 13 лет назад #
(следующая и предыдущая), а что здесь можно еще подумать?
0
seego seego 13 лет назад #
Возможно
0
Умные Интернет Разработки Умные Интернет Разработки 13 лет назад #
А решение можешь подсказать?
0
SP SP 12 лет назад #
Может попробовать последний кусок кода прописать не в тпл а в тело самой статьи? Делаешь режим "Источник" и вставляешь... Только это нужно будет для каждой новостной статьи проделывать.
0
pasplus pasplus 13 лет назад #
Спасибо за разработку, и отдельное спасибо за описание +1
0
bondar bondar 12 лет назад #
Иногда в некоторых статьях выходит так что в две стороны идут одинаковые статьи, пример на фото

причем если такой баг попадает то идет обычно таких две страницы, в итоге получается замкнутый круг, и он перекидывает между двумя статьями
Кто знает с чем это связано**???????
0
seego seego 12 лет назад #
Такой проблемы не было замечено, возможно у вас версия другая.
0
bondar bondar 12 лет назад #
версия 1.7, на двух разных сайтах есть такое. может просто не замечали, поскольку не во всех статьях такое бывает... не могу понять из-за чего такое случается (((
0
seego seego 12 лет назад #
Может в разделе только одна статья?
0
seego seego 12 лет назад #
Видимо, что не правильно настроили sad
0
bondar bondar 12 лет назад #
та тоже так подумал, но щя на двух, и перед этим еще был - может, может. Ладно спасибо))
0
Kotanol Kotanol 12 лет назад #
Было бы полезным, сделать доработку для кольцевой перелинковки. Т. е. сейчас идя по этим ссылкам нажимая только по ссылке"следующая статья" упираешься в последнюю статью где стоит только одна ссылка на предыдущую. Возможно-ли на последней статье вывести ссылку на предыдущую и на следующую (первую в разделе) т. е. замкнуть кольцо. Это будет очень полезно для SEO. Если возможно, то как?
0
toropa toropa 11 лет назад #
а есть решение под 1.10?
0
Юрий Юрий 10 лет назад #
Спасибо большое. То что искал ! Воткнул на 1.9 Рабоет без проблем !
0
Викторыч Викторыч 10 лет назад #
А вещь-то крайне полезная и нужная! Но автора не было здесь больше года. Кто-нибудь из программистов возьмется адаптировать это под 1.10... ?
0
Pasha Pasha 10 лет назад #
У меня в блоге...

Еще от автора

Простая регистрация пользователей
Версия: InstantCMS v1.7 Давно ведутся споры по поводу регистрации пользователей на сайте. Нужны ли те или иные поля, никнейм, логин и тд.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.