Сортировка правил в urlrewrite.php
Проблематика
Не секрет, что правила обработки адресов в БУСе сортируются по длине условия. Чем длиннее условие, тем оно выше располагается в файле urlrewrite.php. На практике часто необходимо изменить порядок сортировки условий, не опираясь на его длину. Много копий сломано в поисках истины (например, здесь https://dev.1c-bitrix.ru/community/webdev/user/3308/blog/2505/ и здесь https://dev.1c-bitrix.ru/community/webdev/user/35407/blog/chpu-sortirovka-pravil-v-urlrewritephp/index.php), множество идей предложено (например, здесь http://idea.1c-bitrix.ru/to-take-into-account-the-sort-field-when-sorting-urlrewrite/ или здесь http://idea.1c-bitrix.ru/sdelat-sortirovku-pravil-v-urlrewritephp/). Удивительно, но компания Битрикс никак не отреагировала на пожелания пользователей. Реализовать доработку этого вопроса на уровне ядра было бы самым простым решением. Ну, нет и нет — не беда. Спасибо Битриксу за то, что предоставил возможность писать модули и обработчики событий.
Погнали.
Процесс
Итерация намбер ван:
В проекте заметили перетасовку правил в файле urlrewrite.php → реализовали задачу, используя решение Романа Забродина (https://dev.1c-bitrix.ru/community/webdev/user/3308/blog/2505/) → при ревью задачи нам не понравилось, что пропала возможность кошерно редактировать правила в админке Битрикса.
Итерация намбер ту:
Вернули задачу в доработку → поштурмили и решили использовать события Битрикса → организовали обработчик события OnAfterEpilog, который наблюдает за состоянием файла urlrewrite.php, если были изменения, запускает сортировку массива по полю SORT и записывает результат в файл urlrewrite.php
Итерации намбер фри, фор, файв, сикс энд севен:
Внедряли решение на разных проектах → исправляли баги, одновременно упрощая и украшая код.
Итерация намбер эйт:
Решили поделиться с пользователями своим решением → завернули все написанное ранее в модуль → разместили на марктеплейсе.
В чем соль?
Модуль организует сортировку правил обработки адресов согласно полю SORT, которое добавляется в массив, описывающий правила.
Рассмотрим стандартный файл urlrewrite.php с правилами:
[code language="php"]
$arUrlRewrite = array(
array(
"CONDITION" => "#^/news/(.*?)/#",
"RULE" => "SECTION_CODE=$1",
"ID" => "",
"PATH" => "/news/index.php",
),
array(
"CONDITION" => "#^/news/x/#",
"RULE" => "SECTION_CODE=main&CODE=x",
"ID" => "",
"PATH" => "/news_main/index.php",
)
);
[/code]
Логика проекта требует от нас изменить порядок следования условий, чтобы сначала отрабатывало правило «#^/news/x/#», а затем «#^/news/(.*?)/#». Установив решение, мы получим возможность задать правила нужным нам образом, и файл urlrewrite.php будет выглядеть вот так:
[code language="php"]
$arUrlRewrite = array(
array(
"CONDITION" => "#^/news/x/#",
"RULE" => "SECTION_CODE=main&CODE=x",
"ID" => "",
"PATH" => "/news_main/index.php",
"SORT" => "90",
),
array(
"CONDITION" => "#^/news/(.*?)/#",
"RULE" => "SECTION_CODE=$1",
"ID" => "",
"PATH" => "/news/index.php",
"SORT" => "100",
)
);
[/code]
Как использовать?
Читайте на http://marketplace.1c-bitrix.ru/solutions/cosmos.urlrewrite/#tab-install-link
Для кого?
Решение работает для всех редакция Битрикса, для его использования хватит компетенций контент-редактора БУС.
Статистика
Над решением работало — 3 человека.
За время работы сделано 34 коммита и пять мердж-реквестов в гите, решено 6 задач в редмайне, потрачено 5.15 кВт электроэнергии.