Вопрос к специалистам по платформе Битрикс: как правильно вывести две формы в одном элементе инфоблока? На официальном сайте есть инструкция по данному вопросу <a href="https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=43&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> Как можно исправить эту ситуацию, чтобы обе формы отображались корректно?
Ваша проблема с тем, что отображается только одна из двух форм, может быть связана с ошибкой в регулярных выражениях или с тем, как вы используете `$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 вы тоже похоже ошибочно обращаетесь. Может эти строчки вообще не нужны?