Три способа Способ 1. Самый универсальный способ по-битриксовски. Очень удобен, когда одну и ту же подстановку надо делать на разных страницах. Обработка события OnEndBufferContent. Парсим код всей страницы. В файле init.php: AddEventHandler("main", "OnEndBufferContent", "ChangeMyContent"); function ChangeMyContent($content) { // только если на странице есть нужный шаблон куда подставлять if (strpos( $content, '<ШАБЛОН>')!== false ) { ob_start(); // здесь вызываются компоненты которые надо подставить. $out1 = trim(ob_get_contents()); ob_end_clean(); $out1 = str_replace('<ШАБЛОН>', $out1, $content); } } Замечание. <ШАБЛОН> лучше всего писать со спецсимволами <>. Начинающие хакеры не испортят вид вашей страницы, написав что-то в отзыве о товаре. Cпособ 2.1. Примерно тоже самое, но пишем в коде страницы, на которой лежат компоненты: ob_start(); // код компонента, куда вставляем. $out1 = trim(ob_get_contents()); ob_end_clean(); if (strlen($out1)>0) { if ( strpos( $out1, '<ШАБЛОН>')!== false ) { ob_start(); // код, что вставляем. $out2 = trim(ob_get_contents()); ob_end_clean(); echo str_replace('<ШАБЛОН>', $out2, $out1); } else { echo $out1; } } Способ 2.2. Чуть хитрее. Применяется, когда во вставляемом компоненте включен аякс. Мы не вставляем один компонент в другой. А наоборот. Первый компонент режем и половинки вставляем вокруг второго. ob_start(); // код компонента, куда вставляем. $out1 = trim(ob_get_contents()); ob_end_clean(); if (strlen($out1)>0) { if ( strpos( $out1, '<ШАБЛОН>')!== false ) { $parts = explode('<ШАБЛОН>', $out1); echo $parts[0]; // код, что вставляем. echo $parts[1]; } else { echo $out1; } } Способ 3. Самый любимый. В одну строчку. А зачем парсить на сервере и тратить дорогие ресурсы? Пусть у пользователя JavaScript сам подставляет. Оказалось, что такая реализация самая универсальная и совсем не сложная. <!--Скрытый див, где-то на странице.--> <div style="display: none;" id="from">Наш html, который надо подставить</div> ... <!--пустой див в закэшированном компонете--> <div style="display: block;" id="to"></div> <script type="text/JavaScript"> <!--Вот эта строчка--> document.getElementById('to').innerHTML = document.getElementById('from').innerHTML; </script> Мы всегда можем найти нужный узел по id и вставить в него тот HTML который нам нравится.
Компания АКРИТ
Некэшируемые области в стандартном компоненте.
Три способа
Способ 1.
Самый универсальный способ по-битриксовски. Очень удобен, когда одну и ту же подстановку надо делать на разных страницах.
Обработка события OnEndBufferContent. Парсим код всей страницы.
В файле init.php:
AddEventHandler("main", "OnEndBufferContent", "ChangeMyContent");
function ChangeMyContent($content)
{
// только если на странице есть нужный шаблон куда подставлять
if (strpos( $content, '<ШАБЛОН>')!== false ) {
ob_start();
// здесь вызываются компоненты которые надо подставить.
$out1 = trim(ob_get_contents());
ob_end_clean();
$out1 = str_replace('<ШАБЛОН>', $out1, $content);
}
}
Замечание. <ШАБЛОН> лучше всего писать со спецсимволами <>.
Начинающие хакеры не испортят вид вашей страницы, написав что-то в отзыве о товаре.
Cпособ 2.1.
Примерно тоже самое, но пишем в коде страницы, на которой лежат компоненты:
ob_start();
// код компонента, куда вставляем.
$out1 = trim(ob_get_contents());
ob_end_clean();
if (strlen($out1)>0) {
if ( strpos( $out1, '<ШАБЛОН>')!== false ) {
ob_start();
// код, что вставляем.
$out2 = trim(ob_get_contents());
ob_end_clean();
echo str_replace('<ШАБЛОН>', $out2, $out1);
} else {
echo $out1;
}
}
Способ 2.2.
Чуть хитрее. Применяется, когда во вставляемом компоненте включен аякс.
Мы не вставляем один компонент в другой. А наоборот. Первый компонент режем и половинки вставляем вокруг второго.
ob_start();
// код компонента, куда вставляем.
$out1 = trim(ob_get_contents());
ob_end_clean();
if (strlen($out1)>0) {
if ( strpos( $out1, '<ШАБЛОН>')!== false ) {
$parts = explode('<ШАБЛОН>', $out1);
echo $parts[0];
// код, что вставляем.
echo $parts[1];
} else {
echo $out1;
}
}
Способ 3.
Самый любимый. В одну строчку.
А зачем парсить на сервере и тратить дорогие ресурсы? Пусть у пользователя JavaScript сам подставляет.
Оказалось, что такая реализация самая универсальная и совсем не сложная.
<!--Скрытый див, где-то на странице.-->
<div style="display: none;" id="from">Наш html, который надо подставить</div>
...
<!--пустой див в закэшированном компонете-->
<div style="display: block;" id="to"></div>
<script type="text/JavaScript">
<!--Вот эта строчка-->
document.getElementById('to').innerHTML = document.getElementById('from').innerHTML;
</script>
Мы всегда можем найти нужный узел по id и вставить в него тот HTML который нам нравится.