Реализация постраничности обычных текстовых страниц на 1C-Битрикс

Сергей П.

Это небольшая заметка о том, как «простым движением» руки вы можете реализовать постраничность простых текстовых страниц на битриксе. Я опишу только самый простой вариант реализации постраничности на java script’е, а более продвинутый вариант, с использованием стандартного механизма постраничности битрикса, с использованием шаблонов, вы, при небольшом усилии, сможете реализовать сами.

В некоторых случаях, по какой-либо причине необходимо редактору или администратору сайта дать возможность создавать простые текстовые страницы с постраничностью! Причины может быть масса: фиксированный дизайн и по ширине и по высоте, особенности самого создаваемого сайта и другие...

Постраничная навигация прекрасно реализована в инфоблоках, в стандартных полях «детального описания» элемента. Там вы можете вставить <BREAK /> (нажав на панели инструментов соответствующую иконку) и штатный компонент news.detail (или Новость детально) разобьет ваш детальный текст на страницы при выводе на странице сайта. На столько страниц, на сколько потребуется.

1.png

Хорошо, что есть такой механизм, но как он нам сможет помочь, ведь такой же функционал не реализован для простых текстовых страниц?

Да, совершенно верно. Такого механизма для простых текстовых страниц нет, и не предполагается. Но есть мы и мы попробуем реализовать такой механизм.

2.png

Давайте реализуем механизм постраничности с помощью той же вставки <BREAK /> (или <!—pages --> или вообще, мало используемого тега <hr>. Какую конструкцию вы будете использовать для обозначения новой страницы – это совершенно не важно для программирования. Только, не забудьте об удобстве для редактора сайта.).

Теперь подумаем, каким образом мы сможем модифицировать уже готовый php файл?

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

Вот и нашли нужный нам механизм.

В битриксе есть возможность создания шаблонов стандартных текстовых страниц. Шаблон из себя может представлять практически любой произвольный php файл.

Берем, например, стандартный шаблон standard.php и модифицируем следующим образом (или создаем свой шаблон и называем, например, «текстовая страница с постраничностью». Как это сделать можно найти в документации битрикса):


<?

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");

$APPLICATION->SetTitle("Заголовок");

require($_SERVER["DOCUMENT_ROOT"].SITE_TEMPLATE_PATH."/page_header.php");

?>

Текст писать сюда....

<?

require($_SERVER["DOCUMENT_ROOT"].SITE_TEMPLATE_PATH."/page_footer.php");

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>

Содержимое подключаемого файла page_header.php:


<?

if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();

function callback($buffer) {

global $APPLICATION;

if(strpos($buffer, '<BREAK /> ') !== false)

{

$strok=explode("<BREAK /> ", $buffer);

$buffer=' <h2>'.$APPLICATION->GetTitle(false).'</h2> <ul id="slider1">';

foreach ($strok as $cell)

{

$buffer.=' <li class="slider__item">';

$buffer.=$cell;

$buffer.=' </li>';

}

$buffer.=' </ul>';

$buffer.='<script type="text/javascript">

jQuery(function(){

jQuery(\'#slider1\').bxSlider({

pager: true

});

});

</script>';

}

else

$buffer=' <h2>'.$APPLICATION->GetTitle(false).'</h2> <div class="b-content__text-desc">'.$buffer.' </div>';

return ($buffer);

}

ob_start("callback");

?>

Содержимое подключаемого файла page_footer.php:


<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();

ob_end_flush();

?>

Поясню, что у нас тут происходит:

ob_start("callback") - включает буферизацию, сохраняя вывод во внутреннем буфере, а так же передает весь вывод в функцию callback в виде параметра.

ob_end_flush() – отключает буферизацию и выводит содержимое буфера.

В функции callback мы производим обработку содержимого буфера, обрамляя его в нужные элементы верстки, чтобы в дальнейшем, с помощью JS реализовать постраничность на странице, с переключению между страниц без перезагрузки. Например, в нашем примере используется bxslider – достаточно богатый по функционалу и возможностям jquery слайдер. Среди возможностей bxslider есть возможность создания и постраничной навигацию (Вы можете самостоятельно ознакомиться с возможностями скрипта на сайте http://bxslider.com/ ).

Вы самостоятельно можете модернизировать JS таким образом, чтобы у каждой, полученной таким образом, «страницы», мог быть свой URL, например. Но это относиться к программированию на JS, поэтому здесь описывать не будем.

Разбиваем страницу на части по разделителю. Если разделителя нет, то страница возвращается без изменения.

Если вы обратили внимание, то для вывода заголовка страницы используется $APPLICATION->GetTitle(false), а не классический вариант: $APPLICATION->ShowTitle(false).

Почему и настолько ли это важно?

Скажу: это очень важно!

Есть простое правило, при использовании буфера вывода. Функции буферизации могут создавать не один, а несколько буферов. Но единственное и обязательное условие: буфера вывода могут быть только вложенным друг в друга и закрываться должны в обратном порядке от того, в котором они открывались.

А битрикс повсеместно использует буферизацию вывода и наша буферизация будет вложенная в нее.

GetTitle выводит заголовок страницы в переменную или на экран (с помощью echo, например). А ShowTitle – это отложенная функция битрикса и если вы ее будете использовать, то вся система сработает некорректно, нарушиться принцип вложенности буферов. Отложенные функции битрикса логическую структуру вложенности нарушают и одни функции буферизации вывода вмешиваются в работу других функций буферизации, что может привести к самым неожиданным последствиям. Поэтому, данный нюанс и ограничение нужно учитывать!

Зададим изначально текст страницы такой:


Текст писать сюда.... <BREAK /> Текст писать сюда....2

А на выходе мы будем иметь html код:

<h2>Заголовок страницы</h2>

<ul id="slider1">

<li class="slider__item">

Текст писать сюда....

</li>

<li class="slider__item">

Текст писать сюда....2

</li>

</ul>

<script type="text/javascript">

jQuery(function(){

jQuery('#slider1').bxSlider({

pager: true

});

});

</script>

Только не забываем в <head> подключить bxslider

При желании данную реализацию можно модифицировать произвольным образом. Вы можете даже попробовать написать парсер, который автоматически будет разбивать на страницы текст, деля на страницу по количеству символов.

Оцените статью
23.04.2013
Понравилась статья?
Поделитесь ссылкой с друзьями и коллегами!

Статьи по теме

Почему мы рекомендуем начинать с внедрения базовой версии b2b-платформыК нам в компанию ИНТЕРВОЛГА часто обращаются клиенты с заявками на внедрение личного кабинета дилера с длинным списком желаемых функций. Однако мы рекомендуем н...
Функция b2b-платформы — отправка рекламаций в CRMОптовые покупатели — ключевой сегмент экономики торгово-производственного предприятия, и их удовлетворённость напрямую влияет на успех бизнеса. Новый функционал...
Как b2b-платформа передает в 1С данные по новым контрагентам В этой статье мы расскажем, что происходит после того, как клиент зарегистрировал в б2б-кабинете новое юридическое лицо и сделал заказ, а также покажем, как...
Автоматизация и оптимизация бизнес-процессов — лонгрид, чтобы не запутаться Статья будет полезна всем, кто хочет улучшить эффективность своего бизнеса или узнать больше о возможностях автоматизации бизнес-процессов для повышения ко...
10 обязательных задач поддержки сайта на БитриксСтатья посвящена организации поддержки сайтов на Битрикс. Здесь не только про решение технических проблем и устранение багов. Здесь про развитие живых проектов...
B2B-SaaS или B2B-система (платформа+CRM) на вашем сервере: плюс и минусы, что выбрать? Введение Эта статья для коммерческих директоров, руководителей отделов продаж производственных и оптово-торговых компаний, которые ищут инструменты для ро...
Мы работаем по одному из двух форматов:
  • аренда команды (от 2 человек, не менее 3 месяцев);
  • итерации с фиксированной ценой (1-3 месяца длительностью).
ИНТЕРВОЛГА предоставляет:
  • регулярные онлайн-планерки с заказчиком;
  • квалифицированных специалистов;
  • организованную команду (находятся в одном помещении, что упрощает решение рабочих вопросов);
  • полную прозрачность и регулярность отчетов о результатах.
Ключевые услуги:
  • нагруженный интернет-магазин;
  • личный кабинет;
  • оптовые продажи — B2B-платформа;
  • маркетплейс;
  • технический аудит сайта;
  • Битрикс24 — корпоративные HR-порталы;
  • Битрикс24 — построение CRM-системы;
  • Битрикс24 — личные кабинеты сотрудников;
  • Битрикс24 — аудит портала;
  • 1С — интеграция с другими системами;
  • 1С — доработка системы;
  • маркетинг — комплексное интернет-продвижение;
  • маркетинг — продвижение для B2B.
Хотите получать лучшие статьи от INTERVOLGA раз в месяц?
Подпишитесь на рассылку — спамить не будем