моя статья - орининал здесь
))заранее извините за синтаксические и граматические ошибки) пишу на скорую руку)
идея в том чтобы получить на сайте нормальные чпу с полным адресом элементов и разделов каталога
ну тоесть site.com/catalog/razdel1/podrazdel1_1/podpodrazdel1_1_1/tovar.html а не site.com/catalog/podpodrazdel1_1_1/tovar.html
тема больная для битрикса - пару раз поднималась на форуме, окончательного решения никто не предложил.
были предожения обработчиками сохранять урл в пользовательское свойство раздела и свойство элемента... но в таком потходе куча нюансов - прийдётся допустим переписывать все штатные компоненты, которые выводят элемент каталога... поиск, всякие менюшки, карту сайта и тд т и.п. вобщем везде вместо DETAIL_PAGE_URL прийдётся вставлять правльный путь
я не претендую на нормальное решение - я хочу показать свой костыль, которым я быстро решил эту задачу, и просто начать небольшое обсуждение как можно правильнее решить эту задачу
минусы моего решения - костыль - работает через задницу
плюсы - абсолютно простое решение, придумал и сделал за час, все штатные компоненты, которые выводят DETAIL_PAGE_URL или SECTION_PAGE_URL будут выводить совершенно верный урл c любым уровнем вложенности! ))
итак сначала я создал таблицу с 2мя полями - real_section_url и rewrite_url для реального урла радела (тот самый который #SITE_DIR#/catalog/#SECTION_CODE#/ ) и для того, который мы хотим получить на сайте
далее всё просто ))
1) обработчиками действий с разделами OnAfterIBlockSectionAdd и OnAfterIBlockSectionUpdate мы поддерживаем эту таблицу в актуальном состоянии - для каждого изменения или добавления мы записываем в поле rewrite_url верный урл
2) сам костыль
вешаем обработчик на завершение страницы OnEpilog
в нём
$r=$APPLICATION->EndBufferContentMan();
получаю всю буферизованую страницу в переменную)))
затем тяну с моей таблицы в 2 массива значения 2х столбцов
и
$r = str_replace($arrFrom,$arrTo,$r);



ну и вывожу то что получилось после замены ) echo $r;
)) всё!)
)))
такой вот костыль..
работает по всему сайту) везде урлы как надо) тоесть происходит замена для разделов и для товаров соответтсвенно тоже адреса становятся правильными
(кстати есть ещё неотдокументированое событие OnEndBufferContent - потом на досуге поэксперементирую с ним - ато не очень красиво наверное делать так $r=$APPLICATION->EndBufferContentMan(); )))) - не в этом суть) я просто хотел описать принцип)
а приходилось ли вам решать эту же проблему с урлами в каталоге и как вы её решали или как идите решение?
))заранее извините за синтаксические и граматические ошибки) пишу на скорую руку)
идея в том чтобы получить на сайте нормальные чпу с полным адресом элементов и разделов каталога
ну тоесть site.com/catalog/razdel1/podrazdel1_1/podpodrazdel1_1_1/tovar.html а не site.com/catalog/podpodrazdel1_1_1/tovar.html
тема больная для битрикса - пару раз поднималась на форуме, окончательного решения никто не предложил.
были предожения обработчиками сохранять урл в пользовательское свойство раздела и свойство элемента... но в таком потходе куча нюансов - прийдётся допустим переписывать все штатные компоненты, которые выводят элемент каталога... поиск, всякие менюшки, карту сайта и тд т и.п. вобщем везде вместо DETAIL_PAGE_URL прийдётся вставлять правльный путь
я не претендую на нормальное решение - я хочу показать свой костыль, которым я быстро решил эту задачу, и просто начать небольшое обсуждение как можно правильнее решить эту задачу
минусы моего решения - костыль - работает через задницу
плюсы - абсолютно простое решение, придумал и сделал за час, все штатные компоненты, которые выводят DETAIL_PAGE_URL или SECTION_PAGE_URL будут выводить совершенно верный урл c любым уровнем вложенности! ))
итак сначала я создал таблицу с 2мя полями - real_section_url и rewrite_url для реального урла радела (тот самый который #SITE_DIR#/catalog/#SECTION_CODE#/ ) и для того, который мы хотим получить на сайте
далее всё просто ))
1) обработчиками действий с разделами OnAfterIBlockSectionAdd и OnAfterIBlockSectionUpdate мы поддерживаем эту таблицу в актуальном состоянии - для каждого изменения или добавления мы записываем в поле rewrite_url верный урл
2) сам костыль
вешаем обработчик на завершение страницы OnEpilog
в нём
$r=$APPLICATION->EndBufferContentMan();
получаю всю буферизованую страницу в переменную)))
затем тяну с моей таблицы в 2 массива значения 2х столбцов
и
$r = str_replace($arrFrom,$arrTo,$r);



ну и вывожу то что получилось после замены ) echo $r;
)) всё!)
function OnEpilog() { global $DB, $APPLICATION; $r = $APPLICATION->EndBufferContentMan(); $results = $DB->Query("SEL ECT * FR `kudin_section_url_rewrite`"); while ($row = $results->Fetch()) { $arrFrom[] = $row['real_section_url']; $arrTo[] = $row['rewrite_url']; } $r = str_replace($arrFrom,$arrTo,$r); echo $r;} |
)))
такой вот костыль..
работает по всему сайту) везде урлы как надо) тоесть происходит замена для разделов и для товаров соответтсвенно тоже адреса становятся правильными
(кстати есть ещё неотдокументированое событие OnEndBufferContent - потом на досуге поэксперементирую с ним - ато не очень красиво наверное делать так $r=$APPLICATION->EndBufferContentMan(); )))) - не в этом суть) я просто хотел описать принцип)
а приходилось ли вам решать эту же проблему с урлами в каталоге и как вы её решали или как идите решение?