Следующая/предыдущая новость/статья при просмотре подробной в Битрикс

7633  |  8

Странное дело, в Битрикс по умолчанию, отсутсвует функционал для навигации внутри новостей или статей аля "Следующая/Предыдущая" при подробном просмотре. Давайте вставим?

Собственно все элементарно: в шаблон news.detail , в нужном месте, достаточно вставить вот такой код

<?$rs=CIBlockElement::GetList(array("active_from" => "desc"), array("ACTIVE"=>"Y", "IBLOCK_ID"=>$arResult["IBLOCK_ID"]), false, array("nElementID"=>$arResult["ID"], "nPageSize"=>1), array("ID"));
while($ar=$rs->GetNext())
{ $page[] = $ar["ID"]; }?>

<?if (count($page) == 2 && $arResult["ID"] == $page[0]):?>
<a href="/путь для ЧПУ/<?=$page[1]?>/">Предыдущая</a>

<?elseif (count($page) == 3):?>
<a href="/путь для ЧПУ/<?=$page[0]?>/">Следующая</a>

<a href="/путь для ЧПУ/<?=$page[2]?>/">Предыдущая</a>

<?elseif (count($page) == 2 && $arResult["ID"] == $page[1]):?>
<a href="/путь для ЧПУ/<?=$page[0]?>/">Следующая</a>
<?endif;?>  

Само собой привел безо всякого оформления, вы сможете назначить свои классы или списки для ссылок. Пример работы: собственно под этим текстом. Удачного допиливания битрикс под удобства ).

Расскажи друзьям-то:
Уважаемый читатель! В связи с участившимся спамом в комментариях, возможность писать доступна только для зарегистрированных пользователей
Зарегистрироваться Войти Напомнить пароль
Или войти через социальную сеть:
Гость сайта
Можно ли сделать так, чтобы в ссылку выводился не id, а символьный код ?
Михаил Базаров
Цитата
Гость сайта пишет:
Можно ли сделать так, чтобы в ссылку выводился не id, а символьный код ?
Можно попоробовать вписать CODE вместе ID - но надо пробовать
Михаил Базаров
Более феншуйный и правильный вариант:

В result_modifier.php (если нет, нужно создать) шаблона вставляем

Код
<?
// сортировку берем из параметров компонента
$arSort = array(
      $arParams["SORT_BY1"]=>$arParams["SORT_ORDER1"],
      $arParams["SORT_BY2"]=>$arParams["SORT_ORDER2"],
   );
// выбрать нужно id элемента, его имя и ссылку. Можно добавить любые другие поля, например PREVIEW_PICTURE или PREVIEW_TEXT
$arSelect = array(
      "ID",
      "NAME",
      "DETAIL_PAGE_URL"
   );
// выбираем активные элементы из нужного инфоблока. Раскомментировав строку можно ограничить секцией
$arFilter = array (
      "IBLOCK_ID" => $arResult["IBLOCK_ID"],
      //"SECTION_CODE" => $arParams["SECTION_CODE"],
      "ACTIVE" => "Y",
      "CHECK_PERMISSIONS" => "Y",
   );
// выбирать будем по 1 соседу с каждой стороны от текущего
$arNavParams = array(
      "nPageSize" => 1,
      "nElementID" => $arResult["ID"],
   );
$arItems = Array();
$rsElement = CIBlockElement::GetList($arSort, $arFilter, false, $arNavParams, $arSelect);
$rsElement->SetUrlTemplates($arParams["DETAIL_URL"]);
while($obElement = $rsElement->GetNextElement())
      $arItems[] = $obElement->GetFields();
// возвращается от 1го до 3х элементов в зависимости от наличия соседей, обрабатываем эту ситуацию      
if(count($arItems)==3):
   $arResult["TORIGHT"] = Array("NAME"=>$arItems[0]["NAME"], "URL"=>$arItems[0]["DETAIL_PAGE_URL"]);
   $arResult["TOLEFT"] = Array("NAME"=>$arItems[2]["NAME"], "URL"=>$arItems[2]["DETAIL_PAGE_URL"]);
elseif(count($arItems)==2):
   if($arItems[0]["ID"]!=$arResult["ID"])
      $arResult["TORIGHT"] = Array("NAME"=>$arItems[0]["NAME"], "URL"=>$arItems[0]["DETAIL_PAGE_URL"]);
   else
      $arResult["TOLEFT"] = Array("NAME"=>$arItems[1]["NAME"], "URL"=>$arItems[1]["DETAIL_PAGE_URL"]);
endif;
// в $arResult["TORIGHT"] и $arResult["TOLEFT"] лежат массивы с информацией о соседних элементах
?> 

В нужном месте шаблона детальной новости

Код
<?if(is_array($arResult["TOLEFT"])):?> 
   <a href="<?=$arResult["TOLEFT"]["URL"]?>"> 
      < <?=$arResult["TOLEFT"]["NAME"]?> 
   </a> 
<?endif?>
<?if(is_array($arResult["TORIGHT"])):?> 
   <a href="<?=$arResult["TORIGHT"]["URL"]?>"> 
      <?=$arResult["TORIGHT"]["NAME"]?> > 
   </a> 
<?endif?>


Сайт автора http://alexvaleev.ru/
Ярослав
Здравствуйте Михаил!
Подскажите пожалуйста, а помимо навигации внутри статьи, как сделать разбивку статьи если в ней очень много текста на подстраницы с величиной такой подстраницы например с максимальной длинной текста не более 5000
П.С. А как вы уменьшили количество кнопок в редакторе для комментариев?
Михаил Базаров
Цитата
Ярослав пишет:
Здравствуйте Михаил!
Подскажите пожалуйста, а помимо навигации внутри статьи, как сделать разбивку статьи если в ней очень много текста на подстраницы с величиной такой подстраницы например с максимальной длинной текста не более 5000
П.С. А как вы уменьшили количество кнопок в редакторе для комментариев?
При написании новости/статьи которую хотите разорвать на несколько страниц- прямо в в изуальном редакторе есть кнопка- так и называется "Разрыв страницы"

Настройки редактора для пользователей настраивается в Сервисы-Форум при создании нового подфорума. Просто запрещающими методами "Запретить ссылки" , "Запретить таблицы" ну итд- чтобы только работа с текстом осталось, Можно хоть все поотключать- но как же без смайликов-то ;)
Гость сайта
Цитата
Михаил Базаров пишет:
Цитата
Ярослав пишет:
Здравствуйте Михаил!
Подскажите пожалуйста, а помимо навигации внутри статьи, как сделать разбивку статьи если в ней очень много текста на подстраницы с величиной такой подстраницы например с максимальной длинной текста не более 5000
П.С. А как вы уменьшили количество кнопок в редакторе для комментариев?
При написании новости/статьи которую хотите разорвать на несколько страниц- прямо в в изуальном редакторе есть кнопка- так и называется "Разрыв страницы"

Настройки редактора для пользователей настраивается в Сервисы-Форум при создании нового подфорума. Просто запрещающими методами "Запретить ссылки" , "Запретить таблицы" ну итд- чтобы только работа с текстом осталось, Можно хоть все поотключать- но как же без смайликов-то
Спасибо за ответ. К сожалению нет никакой кнопки разрыв страницы или что-то в том же духе. Есть совет использовать тег <BREAK />, но в ручную его ставить если много текста это как то не очень.
Равиль
Для символьного кода

Код
<?$rs=CIBlockElement::GetList(
            array("active_from" => "desc"), 
            array("ACTIVE"=>"Y", "IBLOCK_ID"=>$arResult["IBLOCK_ID"]), 
            false,
            array("nElementID"=>$arResult["ID"], "nPageSize"=>1), 
            array("ID", "CODE"));
  while($ar=$rs->GetNext())
      { $page[] = $ar["CODE"]; }?>
<div class="news_page">
   <ul>
   <?if (count($page) == 2 && $arResult["CODE"] == $page[0]):?>
      <li><a href="/news/<?=$page[1]?>/">Следующая новость &raquo;</a></li>
   <?elseif (count($page) == 3):?>
      <li><a href="/news/<?=$page[0]?>/">&laquo; Предыдущая новость</a></li>
<li><a class="" href="/news/<?=$page[2]?>/">Следующая новость &raquo;</a></li>
   <?elseif (count($page) == 2 && $arResult["ID"] == $page[1]):?>
<li><a href="/news/<?=$page[0]?>/">&laquo; Предыдущая новость</a></li>
<?endif;?>
   </ul>
</div>
Владимир
Здравствуйте Михаил!
Подскажите пожалуйста, как можно сделать так, чтобы при детальном просмотре новости можно было переходить к следующей и предыдущей не по ID новости, а по числу сортировки (которое 500 по умолчанию)? Что нужно поменять в вашем коде:
Цитата
Михаил Базаров пишет:
Более феншуйный и правильный вариант:

В result_modifier.php (если нет, нужно создать) шаблона вставляем
Код
 <?
// сортировку берем из параметров компонента
$arSort = array(
      $arParams["SORT_BY1"]=>$arParams["SORT_ORDER1"],
      $arParams["SORT_BY2"]=>$arParams["SORT_ORDER2"],
   );
// выбрать нужно id элемента, его имя и ссылку. Можно добавить любые другие поля, например PREVIEW_PICTURE или PREVIEW_TEXT
$arSelect = array(
      "ID",
      "NAME",
      "DETAIL_PAGE_URL"
   );
// выбираем активные элементы из нужного инфоблока. Раскомментировав строку можно ограничить секцией
$arFilter = array (
      "IBLOCK_ID" => $arResult["IBLOCK_ID"],
      //"SECTION_CODE" => $arParams["SECTION_CODE"],
      "ACTIVE" => "Y",
      "CHECK_PERMISSIONS" => "Y",
   );
// выбирать будем по 1 соседу с каждой стороны от текущего
$arNavParams = array(
      "nPageSize" => 1,
      "nElementID" => $arResult["ID"],
   );
$arItems = Array();
$rsElement = CIBlockElement::GetList($arSort, $arFilter, false, $arNavParams, $arSelect);
$rsElement->SetUrlTemplates($arParams["DETAIL_URL"]);
while($obElement = $rsElement->GetNextElement())
      $arItems[] = $obElement->GetFields();
// возвращается от 1го до 3х элементов в зависимости от наличия соседей, обрабатываем эту ситуацию      
if(count($arItems)==3):
   $arResult["TORIGHT"] = Array("NAME"=>$arItems[0]["NAME"], "URL"=>$arItems[0]["DETAIL_PAGE_URL"]);
   $arResult["TOLEFT"] = Array("NAME"=>$arItems[2]["NAME"], "URL"=>$arItems[2]["DETAIL_PAGE_URL"]);
elseif(count($arItems)==2):
   if($arItems[0]["ID"]!=$arResult["ID"])
      $arResult["TORIGHT"] = Array("NAME"=>$arItems[0]["NAME"], "URL"=>$arItems[0]["DETAIL_PAGE_URL"]);
   else
      $arResult["TOLEFT"] = Array("NAME"=>$arItems[1]["NAME"], "URL"=>$arItems[1]["DETAIL_PAGE_URL"]);
endif;
// в $arResult["TORIGHT"] и $arResult["TOLEFT"] лежат массивы с информацией о соседних элементах
?> 
 

В нужном месте шаблона детальной новости
Код
 <?if(is_array($arResult["TOLEFT"])):?> 
   <a href="<?=$arResult["TOLEFT"]["URL"]?>"> 
      < <?=$arResult["TOLEFT"]["NAME"]?> 
   </a> 
<?endif?>
<?if(is_array($arResult["TORIGHT"])):?> 
   <a href="<?=$arResult["TORIGHT"]["URL"]?>"> 
      <?=$arResult["TORIGHT"]["NAME"]?> > 
   </a> 
<?endif?>
 


Сайт автора http://alexvaleev.ru/

© 2011—2016 Частный вебмастер: ИП Базаров, ОГРНИП: 315784700173692. Работает на 1С-Битрикс.
Копирование материалов запрещено: "ГК РФ, часть 4, раздел VII: Права на результаты интеллектуальной деятельности".

Информация размещенная на сайте, не является публичной офертой. Политика конфеденциальности
x
Как к Вам обращаться? *
Ваша электронная почта: *
Доп. материалы (логотип, тех. задание):
 
Обзор
Текст сообщения: