Задача: Необходимо, чтобы после создания нового элемента в публичке через "/bitrix/admin/iblock_element_edit.php" открывалась страница указанная в настройке инфоблока в параметре URL страницы детального просмотра
Решение: При передачи параметра return_url его необходимо дважды енкодить:
Далее представлена предыдущая реализация, которая мне не очень нравилась... Рекомендуется использовать метод описанный выше.
В событии OnAfterIBlockElementAdd сохраняем в сессию ID документа
затем на страницу со списком элементов добавляем перенаправление:
Однако при этом есть 2 не приятных момента... Во-превых мы имеем лишний хит, а во-вторых (а точнее в следствии) в истории браузера (кнопка назад) страница со списком элементов дублируется... Немного не удобно..
Сначала я пробовал добавить LocalRedirect сразу в OnAfterIBlockElementAdd, но оказалось, что при этом запись не создается... Странно, ведь я уже получил ID новой записи.. но после редиректа я получал сообщение, что элемент с таким ID не найден.. По видимому при редиректе происходит rollback...
Наверняка существует более элегантное решение.. Помогите, пожалуйста, его найти.. Спасибо!
Решение: При передачи параметра return_url его необходимо дважды енкодить:
$APPLICATION->GetPopupLink(array( 'URL' => "/bitrix/admin/iblock_element_edit.php?lang=".LANGUAGE_ID ."&type=busi_docs&IBLOCK_SECTION_ID=".$arResult["SECTION_ID"] ."&IBLOCK_ID=".$arResult["IBLOCK_ID"]."&ID=".$arResult["ID"] ."&bxpublic=Y&from_module=iblock&return_url=".urlencode(urlencode($arResult['IBLOCK']['DETAIL_PAGE_URL'])), 'PARAMS' => array( 'height' => 500, 'width' => 900, 'resize' => false )); |
Далее представлена предыдущая реализация, которая мне не очень нравилась... Рекомендуется использовать метод описанный выше.
В событии OnAfterIBlockElementAdd сохраняем в сессию ID документа
AddEventHandler("iblock", "OnAfterIBlockElementAdd", array("Documents", "OnAfterAddDocument")); class Documents{ function OnAfterAddDocument($arFields){ //проверим на то что это не элмент документооборота!!! а если он то установи корректный ID $ID = (array_key_exists("WF_PARENT_ELEMENT_ID", $arFields) && $arFields["WF_PARENT_ELEMENT_ID"]>0) ?$arFields["WF_PARENT_ELEMENT_ID"] :$arFields["ID"]; //Для определенных инфоблоков зададим перенаправление if($ID > 0 && in_array($arFields["IBLOCK_ID"], array( 48, // Отладочный 34, // HR ))) $_SESSION["REDIRECT_TO_BD"] = $ID; } } |
затем на страницу со списком элементов добавляем перенаправление:
if(isset($_SESSION["REDIRECT_TO_BD"])){ $ID = $_SESSION["REDIRECT_TO_BD"]; unset($_SESSION["REDIRECT_TO_BD"]); if($ID > 0){ LocalRedirect($ID."/"); } } |
Однако при этом есть 2 не приятных момента... Во-превых мы имеем лишний хит, а во-вторых (а точнее в следствии) в истории браузера (кнопка назад) страница со списком элементов дублируется... Немного не удобно..
Сначала я пробовал добавить LocalRedirect сразу в OnAfterIBlockElementAdd, но оказалось, что при этом запись не создается... Странно, ведь я уже получил ID новой записи.. но после редиректа я получал сообщение, что элемент с таким ID не найден.. По видимому при редиректе происходит rollback...
Наверняка существует более элегантное решение.. Помогите, пожалуйста, его найти.. Спасибо!