Как создать и отобразить две формы в элементе информационного блока в Битрикс?

Вопрос к специалистам по платформе Битрикс: как правильно вывести две формы в одном элементе инфоблока? На официальном сайте есть инструкция по данному вопросу <a href="https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=43&amp;LESSON_ID=2899" rel="nofollow">https://dev.1c-bitrix.ru/learning/course/?COURSE_I...</a>, я следовал ей и настройка работает, но появляется проблема: отображается только одна из двух форм. Если я закомментирую код одной формы, вторая работает нормально и наоборот. Ниже представлен код из файла component_epilog.php: <br/> 
<pre><code class="php">echo preg_replace_callback(
    "/#FORMA_([\d]+)#/is".BX_UTF_PCRE_MODIFIER, function ($matches) {
		ob_start();
        $GLOBALS["APPLICATION"]->IncludeComponent(
            "bitrix:form.result.new",
            "article_booking",
            Array(
                "IGNORE_CUSTOM_TEMPLATE" => "Y",
                "WEB_FORM_ID" => "8",
                "FORMA" => $matches[8]
            )
        );
	 	$retrunStr = @ob_get_contents();
		ob_get_clean();
		return $retrunStr; 
	},
    $arResult["CACHED_TPL"]
);

echo preg_replace_callback(
    "/#FORM_([\d]+)#/is".BX_UTF_PCRE_MODIFIER, function ($matches) {
		ob_start();
        $GLOBALS["APPLICATION"]->IncludeComponent(
            "bitrix:form.result.new",
            "webinar_article",
            Array(
                "IGNORE_CUSTOM_TEMPLATE" => "Y",
                "WEB_FORM_ID" => "7",
                "FORM" => $matches[7]
            )
        );
		 $retrunStr = @ob_get_contents();
		 ob_get_clean();
		 return $retrunStr;
	},
    $arResult["CACHED_TPL"]
);</code></pre>  Как можно исправить эту ситуацию, чтобы обе формы отображались корректно?
  • 7 октября 2024 г. 15:34
Ответы на вопрос 2
Ваша проблема с тем, что отображается только одна из двух форм, может быть связана с ошибкой в регулярных выражениях или с тем, как вы используете `$matches` в своих функциях. Обратите внимание на корректность индексов в массиве `$matches` в обработчиках `preg_replace_callback`. Также стоит убедиться, что вы используете разные маркеры для замены каждой из форм.

Вот пример того, как можно исправить вашу проблему:

1. Убедитесь, что используются различные маркеры для каждой формы. Например, если вы используете `#FORMA_([\d]+)#` для первой формы, вы можете использовать `#FORM_([\d]+)#` для второй.

2. Обратите внимание на специфические индексы для `$matches`. Вам необходимо убедиться, что индексы у них правильные.

Попробуйте изменить свой код следующим образом:

```php
// Для первой формы
echo preg_replace_callback(
    "/#FORMA_([\d]+)#/is".BX_UTF_PCRE_MODIFIER,
    function ($matches) {
        ob_start();
        $GLOBALS["APPLICATION"]->IncludeComponent(
            "bitrix:form.result.new",
            "article_booking",
            Array(
                "IGNORE_CUSTOM_TEMPLATE" => "Y",
                "WEB_FORM_ID" => "8",
                "FORMA" => $matches[1] // Исправлено на правильный индекс
            )
        );
        $returnStr = @ob_get_contents();
        ob_end_clean(); // Исправлено на правильное завершение
        return $returnStr;
    },
    $arResult["CACHED_TPL"]
);

// Для второй формы
echo preg_replace_callback(
    "/#FORM_([\d]+)#/is".BX_UTF_PCRE_MODIFIER,
    function ($matches) {
        ob_start();
        $GLOBALS["APPLICATION"]->IncludeComponent(
            "bitrix:form.result.new",
            "webinar_article",
            Array(
                "IGNORE_CUSTOM_TEMPLATE" => "Y",
                "WEB_FORM_ID" => "7",
                "FORM" => $matches[1] // Исправлено на правильный индекс
            )
        );
        $returnStr = @ob_get_contents();
        ob_end_clean(); // Исправлено на правильное завершение
        return $returnStr;
    },
    $arResult["CACHED_TPL"]
);
```

В данном примере я исправил индексы в массиве `$matches` и корректно вызываю `ob_end_clean()` вместо `ob_get_clean()`. Также убедитесь, что ваша шаблонная часть (`$arResult["CACHED_TPL"]`) действительно содержит оба маркера (например `#FORMA_1#` и `#FORM_1#`), чтобы их можно было корректно обработать.

Попробуйте этот подход и посмотрите, решает ли это вашу проблему.
Если в тексе контента у вас заглушки типа "#FOMR_7#" и "#FOMR_8#", то нужно регулярки поменять на следующие: 
"/#FORM_7#/is"
"/#FORM_8#/is"


И еще, меня смущают места:
"FORM" => $matches[7]
"FORMA" => $matches[8]

Что это за параметры FORM и FORMA? Стандартных вроде нет таких. И к $matches вы тоже похоже ошибочно обращаетесь. Может эти строчки вообще не нужны?
Похожие вопросы