CIBlock::ReplaceDetailUrl - можно ли туда внедриться?

Рейтинг: 23.9099  
На голосовании
Предложил Пользователь 11948 22.08.2014 13:57:12

CIBlock::ReplaceDetailUrl - можно ли туда внедриться?

Иногда нужна возможность по-хитрому построить URL секции/элемента инфоблока. Хорошо бы попасть в указанный метод.

Хотя бы на уровне переопределения метода.

Рейтинг: 0  
Пользователь 11948 22.08.2014 14:00:35
На уровне переопределения метода даже лучше. Тогда просто копируем метод и правим под себя.
Рейтинг: 16.9428  
Пользователь 9700 28.08.2014 03:35:33
Если на своих проектах и если там установлен runkit, то можно переопределить с помощью runkit_method_redefine
http://php.net/manual/en/function.runkit-method-redefine.php

В идеале хотелось бы видеть DI, но и вариант как с bx_mail()/custom_mail() тоже сойдет.
Рейтинг: 0  
Пользователь 95084 29.03.2016 22:36:42
на самом деле, для большинства задач уже было бы достаточно #CUSTOM_VAR1# и  #CUSTOM_VAR2#, а то слишком уж скромный список

            /*Thees come from GetNext*/
      "#SITE_DIR#",
      "#ID#",
      "#CODE#",
      "#EXTERNAL_ID#",
      "#IBLOCK_TYPE_ID#",
      "#IBLOCK_ID#",
      "#IBLOCK_CODE#",
      "#IBLOCK_EXTERNAL_ID#",
      /*And thees was born during components 2 development*/
      "#ELEMENT_ID#",
      "#ELEMENT_CODE#",
      "#SECTION_ID#",
      "#SECTION_CODE#",
      "#SECTION_CODE_PATH#",
 
Рейтинг: 0  
Пользователь 3089 18.11.2016 00:59:58
На уровне переопределения метода даже лучше. Тогда просто копируем метод и правим под себя.
Как предполагается это использовать потом? Все ядро делает статический вызов CIBlock::ReplaceDetailURL. Или действительно как сделано в bx_mail предлагаете?

Копировать метод - не очень удачная идея. После каждого обновления нужно будет сверяться с изменениями в нем и добавлять в свою версию. Нужно событие.

runkit_method_redefine
Наверное возможно, но выглядит очень смело. Даже на своем VPS (у меня такие все) как-то неприятно думать в эту сторону. Увы, на PHP 7 его вообще нет. Так что не вариант.

DI
Это что?

для большинства задач уже было бы достаточно #CUSTOM_VAR1# и #CUSTOM_VAR2#
Оно так, но ведь все равно нужно запрограммировать какую-то реакцию на эти макросы. На ум приходит событие. В таком случае как поможет фиксированный список таких макросов?


Голосую за событие.

В моем случае надо поддержать адресацию для списка предложений. Да, это разврат. Но чего только не бывает.

Мне нужны макросы #PRODUCT_SECTION_ID#, #PRODUCT_SECTION_CODE# и #PRODUCT_SECTION_CODE_PATH# для инфоблока предложений. И никак этого не сделать.

#PRODUCT_URL# не подходит, т.к. помимо раздела в адресе использует и элемент из инфоблоока предложений.
Рейтинг: 6.8063  
Пользователь 57031 24.08.2017 10:45:09
Событие позволяющее модифицировать $arSearch и $arReplace и получающее данные из $arr
решит множество проблем.
Рейтинг: 0  
Пользователь 3089 02.01.2018 23:15:44
Просто, чтобы не терять данные. Добавлю сюда.

  1. Проблема известна давно (я нашел упоминание в январе 2013).
  2. В iblock 17.5.3 (ноябрь 2017) события еще нет.

runkit для PHP7 еще нет. Замены для семерки пока тоже нет. Так что, либо ждать, либо лезть в ядро (как в упомянутой статье за январь 2013), либо городить огород в каждой компоненте.

d7 еще тоже не доросла.

Очень плохо для такого продукта.