Ruled details php id

Настройка ЧПУ, правило обработки адресов

Правильно ли я понимаю, что в процессе работы с Битрикс, иногда, генерируются разные дополнительные параметры, которые передаются в строке браузера для разных компонент, например, авторизации. В представленном выше правиле вырезаются только переменные ELEMENT_ID и SECTION_ID. А, остальные потеряются для дальнейшей обработки, когда сработает правило? Может быть будет лучше как-то усложнить Условие и Правило, чтобы остальные параметры тоже вырезались и передавались дальше?
Я имею ввиду, что если после /gospel/pericope/545/208/ будет какой-то хвост переменных /gospel/pericope/545/208/?abcd, то как лучше этот хвост выделить и пристыковать к /gospel/pericope/index.php?ELEMENT_ID=S1&SECTION_ID=S2, чтобы было /gospel/pericope/index.php?ELEMENT_ID=S1&SECTION_ID=S2&abcd ?
Подскажите, пожалуйста.

Задайте для хвоста регулярное выражение: Обработка адресов . Последний пример — как раз описанная Вами ситуация.

Спасибо, пример посмотрел.
По-моему там в примере обрезались знаки доллара и цифры после них, как и в сообщениях этого форума обрезаются (вместо доллара пишу S), поэтому там для меня не очень понятно, какие цифры ставить, когда скобки вложены друг в друга.
Понял, что нужно сделать вот такое правило.

Условие: #^/gospel/pericope/(1+)/(1+)/(\\?(.*))?# Компонент: ничего не писать Файл: /gospel/pericope/index.php Правило: ELEMENT_ID=S1&SECTION_ID=S2&S3

А обратную задачу как решить, подскажете?

/index.php?option=com_virtuemart&page=shop.browse&category_id=350& и далее разные параметры.
(обращения роботов по адресам от старой версии сайта )

редирект на /old/350/index.php

Условие: #^/index.php?option=com_virtuemart&page=shop.browse&category_id=(1+)#
Компонент:
Файл: /old/
Правило: $1/index.php

Что-то не нравятся мне вложенные скобки и двойной слеш в примере, пожалуй, переделаю по-другому
Условие: #^/gospel/pericope/(5+)/(9+)/ (\\?(.*)) ?#

Так, наверное, лучше будет:
#^/gospel/pericope/(3+)/(3+)/\?(.*)?#

Алексей, для такого правила вам не нужно ничего добавлять, все параметры и так придут.
Т.е.: #^/gospel/pericope/(4+)/(4+)/#
вполне достаточно

А вот если у вас ссылка такого шаблона /gospel/pericope/(8+)/(1+).php

тогда вот такое правило должно быть:
#^/gospel/pericope/(7+)/(5+)\.php.*#

Или я не совсем понял вашу проблему?

Цитата
Sergey Leshchenko пишет:
Алексей, для такого правила вам не нужно ничего добавлять, все параметры и так прийдут.
Т.е.: #^/gospel/pericope/(8+)/(4+)/#
вполне достаточно

Я так понимаю, что им неоткуда прийти, если они не выделены в скобках и не пристыкованы через $3.

Если я оставляю правило так: #^/gospel/pericope/(4+)/(2+)/#, а потом администратором зайду на страницу /gospel/pericope/545/208/, мне будет показана страница /gospel/pericope/?ELEMENT_ID=545&SECTION_ID=208, т.к. правило сработает.
Но, если я, например, что-нибудь исправлю на странице и нажму кнопку Обновить кеш, то браузер отправит страницу с параметром /gospel/pericope/545/208/?clear_cache=Y, что вызывает ошибку (не найден раздел), я подозреваю, что из-за того, что ?clear_cache=Y теряется при формировании /gospel/pericope/?ELEMENT_ID=545&SECTION_ID=208&clear_cache=Y.
Поэтому, я добавил последнюю третью скобку, чтобы все изначальные параметры не терять, а пристыковать в конце к ELEMENT_ID=545&SECTION_ID=208.

Цитата
Алексей Комаров пишет:
Я так понимаю, что им неоткуда прийти, если они не выделены в скобках и не пристыкованы через $3.

Почему? Апач увидит тот REQUEST_URI, который его запросили и разберет его, он ничего не знает про ваше ЧПУ. Затем система urlrewrite битрикса разберет ваше правило, добавит в суперглобальные переменные ЧПУ-параметры и подправит $_SERVER[‘QUERY_STRING’].

Для проверки на вашей ЧПУ-странице с обычным правилом сделайте echo ‘

'.print_r(array($_REQUEST, $_SERVER), true).'

‘;
добавляйте какие хотите дополнительные параметры — они все будут.

P.S. А ошибку вызывает что-то другое.

Ошибка, вроде ушла, когда я второй подряд ? добавил, т.е. сделалал первый ? необязательным, пока так оставляю:
#^/gospel/pericope/(4+)/(9+)/\??(.*)?#

Цитата
Sergey Leshchenko пишет:
Для проверки на вашей ЧПУ-странице с обычным правилом сделайте echo ‘
'.print_r(array($_REQUEST, $_SERVER), true).'

‘; добавляйте какие хотите дополнительные параметры — они все будут.

echo '
'.print_r(array($_REQUEST, $_SERVER), true).'

';

Если дополнительных параметров в строке браузера нет, то все правила срабатывают одинаково, но если дополнительный параметр есть, то нужно использовать второе правило, т.к. первое не выделяет номер раздела.
Результаты после первого правила

Цитата
Условие: #^/gospel/synopsis/infogram/(5+)/(6+)/#
Файл: /gospel/synopsis/infogram/index.php
Правило: ELEMENT_ID=$1&SECTION_ID=$2

Результат, в сокращении, на строку в браузере (когда будет ошибочный SECTION_ID): …/gospel/synopsis/infogram/493/141/?clear_cache=Y

Цитата
Условие: #^/gospel/synopsis/infogram/(6+)/(7+)/.*#
Файл: /gospel/synopsis/infogram/index.php
Правило: ELEMENT_ID=$1&SECTION_ID=$2

Результат, в сокращении, на строку в браузере (правильный SECTION_ID): …/gospel/synopsis/infogram/493/141/?clear_cache=Y

Цитата
Array ( [0] => Array (
[clear_cache] => Y
[ELEMENT_ID] => 493
[SECTION_ID] => 141 )
[1] => Array (
[REDIRECT_QUERY_STRING] => clear_cache=Y
[REDIRECT_URL] => /gospel/synopsis/infogram/493/141/
[QUERY_STRING] => ELEMENT_ID=493&SECTION_ID=141
[REQUEST_URI] => /gospel/synopsis/infogram/493/141/?clear_cache=Y
[SCRIPT_NAME] => /bitrix/urlrewrite.php
[PHP_SELF] => /bitrix/urlrewrite.php
[argv] => Array ( [0] => clear_cache=Y )
[argc] => 1
[REAL_FILE_PATH] => /gospel/synopsis/infogram/index.php ))
Условие: #^/ido/kurs/(4+)/# Файл: /ido/kurs/detail.php Правило: >

Все работает. Ровно до того момента, как в адресе появляется что-то типа ?clear_cache=Y или ?sphrase_id=37998
Как изменить правило?

Думаю, надо добавить в конец условия .*
Условие: #^/ido/kurs/(5+)/.*#
Тогда, ID вырежется точно, но, я не знаю, потеряются ли дополнительные параметры clear_cache или sphrase_i. В моём втором примере выше дополнительные параметры есть (и у Вас будут, наверное) в
Array ( [0] => Array (
[clear_cache] => Y
[REDIRECT_QUERY_STRING] => clear_cache=Y
[argv] => Array ( [0] => clear_cache=Y )
Но, как они дальше отрабатываются или же теряются мне не понятно.

А, вспомнил про этот косяк с дописыванием ‘?’ в preg_replace() modules/main/include/urlrewrite.php
И в ТП тикет создал (#61636) по этому поводу, два с половиной года тому назад.
Мне ответили:

Цитата
Если исправление необходимо и возможно — оно будет выпущено в одном из обновлений главного модуля.

Значит нет необходимости или еще очередь не дошла

Цитата
Sergey Leshchenko пишет:
Да, нужно всегда добавлять .* в конец условия если правило (RULE) задано. И тогда будет все ок.

Чтобы понять как нужно писать правило ЧПУ, рассматривал, как образец, уже созданные автоматически БУСом правила, например комплексным компонентом форум или faq, есть в демонстрационной версии. Так вот, компонентом создаётся обычное правило без .* в конце. У этих автоматически созданных битрисовкских правил не задано правил, использующих (через $1, $2. ) вырезающие из условия дополнительные группировки в скобках.
Получается, что до этого .* в конце условия нужно самим доходить опытным экспериментальным путём, потому что на мой взгляд это избыточные символы в условии, но без них, ведь, не работает, когда есть в строке дополнительные параметры. И, не написано об этом в руководстве по ссылке, приведённой в теме выше, хотя получить SECTION_ID или ELEMENT_ID из строки при настройке ЧПУ — это типовая операция, если переходить на ЧПУ от динамических адресов. Странно как-то, сидеть пользователю и экспериментировать с ЧПУ и регулярными выражениями, чтобы понять как это нужно вписать в Битрикс.

Источник

Как сделать, чтобы news.detail понимал, что это за элемент?

Создаю страницу детального просмотра через detail.php.
detail.php вызываю через urlrewrite.php
Надо как-то передавать данные элемента инфоблока, чтобы компонент news.detail понимал, что это за элемент
Заранее спасибо.

 IncludeComponent( "site:news.detail", "decision", Array( "ACTIVE_DATE_FORMAT" => "d.m.Y", "ADD_ELEMENT_CHAIN" => "N", "ADD_SECTIONS_CHAIN" => "Y", "AJAX_MODE" => "N", "AJAX_OPTION_ADDITIONAL" => "", "AJAX_OPTION_HISTORY" => "N", "AJAX_OPTION_JUMP" => "N", "AJAX_OPTION_STYLE" => "Y", "BROWSER_TITLE" => "-", "CACHE_GROUPS" => "Y", "CACHE_TIME" => "36000000", "CACHE_TYPE" => "A", "CHECK_DATES" => "Y", "DETAIL_URL" => "", "DISPLAY_BOTTOM_PAGER" => "Y", "DISPLAY_DATE" => "Y", "DISPLAY_NAME" => "Y", "DISPLAY_PICTURE" => "Y", "DISPLAY_PREVIEW_TEXT" => "Y", "DISPLAY_TOP_PAGER" => "N", "ELEMENT_CODE" => "", "ELEMENT_ID" => "", "FIELD_CODE" => array("",""), "IBLOCK_ID" => "13", "IBLOCK_TYPE" => "content", "IBLOCK_URL" => "", "INCLUDE_IBLOCK_INTO_CHAIN" => "Y", "MESSAGE_404" => "", "META_DESCRIPTION" => "-", "META_KEYWORDS" => "-", "PAGER_BASE_LINK_ENABLE" => "N", "PAGER_SHOW_ALL" => "N", "PAGER_TEMPLATE" => ".default", "PAGER_TITLE" => "Страница", "PROPERTY_CODE" => array("",""), "SET_BROWSER_TITLE" => "Y", "SET_CANONICAL_URL" => "N", "SET_LAST_MODIFIED" => "N", "SET_META_DESCRIPTION" => "Y", "SET_META_KEYWORDS" => "Y", "SET_STATUS_404" => "N", "SET_TITLE" => "Y", "SHOW_404" => "N", "STRICT_SECTION_CHECK" => "N", "USE_PERMISSIONS" => "N", "USE_SHARE" => "N" ) );?>

5dc341d90bc16355402824.png

Настройки инфоблока:

 array ( 'CONDITION' => '#^/about/([0-9a-zA-Z_-]+)/.*#', 'RULE' => '', 'ID' => 'site:news', 'PATH' => '/about/detail.php', 'SORT' => 100, ), );

Источник

yunaliev.ru

Программирование, как и искусство — одно слово, за которым скрывается бесконечное множество занятий 😉

Битрикс ЧПУ, правила urlrewrite.php

Самые часто используемые правила ЧПУ в битриксе это страницы детального описания элемента, например /section/125/ 125 это ID элемента, в основном это дополнительные разделы сайта, для магазинов используется комплексный компонент каталога и там 1 правило для всего компонента, но речь не о ней.

Для таких страницы правило выглядет так.

Если 1 числовой идентификатор:

array( "CONDITION" => "#^/section/(9+)/#", "RULE" => "ELEMENT_ID=\$1", "ID" => "", "PATH" => "/section/detail.php", )

Если символьный идентификатор:

array( "CONDITION" => "#^/section/([A-z]+)/#", "RULE" => "ELEMENT_CODE=\$1", "ID" => "", "PATH" => "/section/detail.php", )

Если смешанный, состоящий как из цифр так и из символов:

array( "CONDITION" => "#^/section/[A-z-0-9]+)/#", "RULE" => "ELEMENT_CODE=\$1", "ID" => "", "PATH" => "/section/detail.php", )

Но зачастую, особенно новички оставляют эти правильно как показано в примере, но если мы к этом адресу добавим параметры, то идентификатор ломается

в массиве $_GET вы получите не ELEMENT_ID = 125, а ELEMENT_ID = 125/?param=1, решением может быть функция intval($_GET[‘ELEMENT_ID’]), но правильным решением будет добавить в правило условие (\\?(.*))?#

В итоге, для простых страниц с ЧПУ нужно использовать правило:

array( "CONDITION" => "#^/section/(8+)/(\\?(.*))?#", "RULE" => "ELEMENT_ID=\$1", "ID" => "", "PATH" => "/section/detail.php", )

Источник

Читайте также:  Java int length byte
Оцените статью