Abr@X@bra.ru
Быстрая навигация по новостям или постам в 1С-Битрикс
Быстрая навигация по новостям или постам в 1С-Битрикс

Быстрая навигация по новостям или постам в 1С-Битрикс

13.07.2016
210

Вот как это будит выглядеть в дальнейшем (Всю стилизацию конечно можно поменять под свой дизайн, через CSS.) :


И так идем в папку нашего компонента НОВОСТИ news.detail и в нем нам нужен файл под названием result_modifier.php , в нем мы напишем для нашей дальнейшей навигации, сам функционал работы. 

PS

Если у Вас по кокой-то причине нет данного файла result_modifier.php, его нужно создать в ручную.

После того как мы открыли фаил result_modifier.php в него нужно скопировать вот этот код:

<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
/**
 * Bitrix vars
 *
 * @var CBitrixComponent $component
 * @var CBitrixComponentTemplate $this
 * @var array $arParams
 * @var array $arResult
 * @var array $arLangMessages
 * @var array $templateData
 *
 * @var string $templateFile
 * @var string $templateFolder
 * @var string $parentTemplateFolder
 * @var string $templateName
 * @var string $componentPath
 *
 * @var CDatabase $DB
 * @var CUser $USER
 * @var CMain $APPLICATION
 */

// Прямая сортировка, чтобы последний элемент был справа от текущего, при обратной будет наоборот, слева.
$arSort = array(
    'ACTIVE_FROM' => 'ASC',
    'ID' => 'ASC',
);

// минимальные поля ID, NAME, DETAIL_PAGE_URL
$arSelect = array(
    'ID',
    'NAME',
    'DETAIL_PAGE_URL',
    //'DATE_CREATE',
    //'DATE_ACTIVE_FROM',
    //'PREVIEW_PICTURE',
    //'DETAIL_PICTURE',
);

// выбираем активные элементы из нужного инфоблока по фильтру, вообще фильтр должен совпадать с фильтром компонента
// иначе могут в пагинацию попасть левые элементы инфоблока, которых не будет на сайте.
$arFilter = array(
    'IBLOCK_ID'             => $arParams['IBLOCK_ID'],
    //'SECTION_CODE'          => $arParams['SECTION_CODE'],
    //'SECTION_CODE'          => $arResult['SECTION']['CODE'],
    //'SECTION_ID'            => $arResult['IBLOCK_SECTION_ID'],
    'ACTIVE'                => 'Y',
    'ACTIVE_DATE'           => 'Y',
    'SECTION_ACTIVE'        => 'Y',
    'SECTION_GLOBAL_ACTIVE' => 'Y',
    'INCLUDE_SUBSECTIONS'   => 'Y',
    'CHECK_PERMISSIONS'     => 'Y',
    'MIN_PERMISSION'        => 'R',
);


// тут получим по 1 соседу с каждой стороны от текущего элемента
$arNavParams = array(
    'nPageSize'  => 1,
    'nElementID' => $arResult['ID'],
);
$arElements     = Array();
$rsElements   = CIBlockElement::GetList($arSort, $arFilter, FALSE, $arNavParams, $arSelect);
if($arParams['DETAIL_URL'])
    $rsElements->SetUrlTemplates($arParams['DETAIL_URL']);

while($obElement = $rsElements->GetNextElement()) {
    $arElements[] = $obElement->GetFields();
}

// в $arResult['RIGHT_PAGE'] и $arResult['LEFT_PAGE']  массивы с информацией о соседних элементах для текущего
switch(count($arElements))
{
    case '3': //Сработает, когда справа и слева есть элементы
    {
        $RIGHT_PAGE = array_pop($arElements); // Последний элемент справа
        $LEFT_PAGE = array_shift($arElements); // Первый элемент слева

        $arResult['RIGHT_PAGE'] = Array(
            'NAME' => $RIGHT_PAGE['NAME'],
            'URL'  => $RIGHT_PAGE['DETAIL_PAGE_URL']
        );
        $arResult['LEFT_PAGE']  = Array(
            'NAME' => $LEFT_PAGE['NAME'],
            'URL'  => $LEFT_PAGE['DETAIL_PAGE_URL']
        );
    }
    break;

    case '2': //Сработает либо на первом, либо на последнем элементе
    {
        $RIGHT_PAGE = array_pop($arElements); // Последний элемент справа
        $LEFT_PAGE = array_shift($arElements); // Первый элемент слева

        // тут проверяем, слева или справа будет текущий открытый элемент, его исключаем

        if($LEFT_PAGE["ID"] && $LEFT_PAGE["ID"] != $arResult["ID"])
        {
            $arResult['RIGHT_PAGE'] = Array();
            $arResult['LEFT_PAGE']  = Array(
                'NAME' => $LEFT_PAGE['NAME'],
                'URL'  => $LEFT_PAGE['DETAIL_PAGE_URL']
            );
        }
        elseif($RIGHT_PAGE && $RIGHT_PAGE != $arResult["ID"])
        {
            $arResult['LEFT_PAGE'] = Array();
            $arResult['RIGHT_PAGE']  = Array(
                'NAME' => $RIGHT_PAGE['NAME'],
                'URL'  => $RIGHT_PAGE['DETAIL_PAGE_URL']
            );
        }
        else
        {
            $arResult['RIGHT_PAGE'] = Array();
            $arResult['LEFT_PAGE']  = Array();
        }
    }
    break;

    default: //Если что-то пойдет не так, постраничка выводиться не будет
    {
        $arResult['RIGHT_PAGE'] = Array();
        $arResult['LEFT_PAGE']  = Array();
    }
}

Сохраняем данный файл и закрываем его.

Дальше нам нужно открыть файл под названием template.php и в него давить следующий код:

<div class="название своего класса для оформление">
    <div class="название своего класса для оформление">
    <?if(!empty($arResult["LEFT_PAGE"])):?>
        <a class="название своего класса для оформление" title="&larr; ctrl предыдущая" href="<?=$arResult["LEFT_PAGE"]["URL"]?>" data-uk-tooltip> <i class="название своего класса для оформление"></i> <?=$arResult["LEFT_PAGE"]["NAME"]?></a>
    <?endif?>
    </div>
    <div class="название своего класса для оформление">
    <?if(!empty($arResult["RIGHT_PAGE"])):?>
        <a class="название своего класса для оформление" title="следующая ctrl &rarr;"  href="<?=$arResult["RIGHT_PAGE"]["URL"]?>" data-uk-tooltip><?=$arResult["RIGHT_PAGE"]["NAME"]?> <i class="uk-icon-caret-right"></i></a>
    <?endif?>
    </div>
</div>
В дивах подставьте свои название классов для стилистического оформление через CSS.

Так же в этом же файле template.php еще нужно добавить jQuery-код:

<script type="text/javascript">
    $(document).keyup(function(event){
        event = event || window.event;
        var link = null;

        if (!event.ctrlKey)
            return;

        var key = (event.keyCode ? event.keyCode : (event.which ? event.which : null));

        if (!key)
            return;

        if (key == 39)
            link = $('.next-prev-pager .ts-next-page');
        else if (key == 37)
            link = $('.next-prev-pager .ts-prev-page');

        if (link && link.attr('href'))
            document.location = link.attr('href');
        else if(key == 39 || key == 37)
            alert('Дальше новостей пока нет, заходите попозже или подпишитесь на мои статьи в форме в самом низу!');

    });
</script>
После чего все сохраняем и все должно работать. Так же данный метод можно использовать для компонента catalog.element.

Если вдруг у Вас возникли проблемы или вопросы по данному методу, Вы всегда их можете задавать в комментариях.



Навигация, PHP, Bitrix
Читайте также:
Табы как вывести свойство товара инфоблока Битрикс

Табы как вывести свойство товара инфоблока Битрикс

В этом посте хочу поделиться как вывести разные свойство товара в разных табах, например в карточке товара интернет-магазина...

Читать
Что нового принес ФЗ-54 для продавцов?

Что нового принес ФЗ-54 для продавцов?

С 1 февраля 2017-го компании регистрируют кассовые аппараты нового онлайн-формата. В них уже установлен фискальный накопитель....

Читать
ЧПУ компонентов битрикса от корня сайта

ЧПУ компонентов битрикса от корня сайта

На новом сайте товары разложены по категориям и нужно поставить чпу так, как на старом сайте. 
Начинаем эпопею...

Читать