РФ
  • Россия
  • Мир
 

Сортировка правил в 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 кВт электроэнергии.

Узнать больше
РФ
  • Россия
  • Мир
 
Читайте также:

Мы используем куки — так надо, чтобы сайт работал как следует.

Хорошо!