DigitalWand/digitalwand.admin_helper

Некорректная ссылка выбора элемента в OrmElementWidget в Multiple режиме

mrdim opened this issue · 3 comments

mrdim commented

В теле функции getUrl при передаче параметра k=>'{{field_id}}' происходит экраниранирование значения, из-за чего шаблонизатор не делает замену и на выходе некорректная ссылка $popupUrl.

public function getMultipleEditHtml()
{
.....
$popupUrl = $linkedHelper::getUrl(array_merge(
array(
'popup' => 'Y',
'eltitle' => $this->getSettings('TITLE_FIELD_NAME'),
'n' => $name,
'k' => '{{field_id}}'
),
$this->getSettings('ADDITIONAL_URL_PARAMS')
));

Если почитать исходники битрикса, то там в недрах при выводе элементов всё прогоняется через htmlspecialcharsbx. Если ваш html заканчивает путь где-нибудь в $row->AddViewField, то и его ждёт эта незавидная участь. Проследите, что у вас этого не происходит, и результат getMultipleEditHtml во всех случаях рендерится через простой print, а не через битриксовый API. Если где-то битриксовый API мешает - переопределите эти классы и методы. В самом AdminHelper нигде нет экранирования HTML выводимых виджетов.

mrdim commented

@ASGAlex, давайте отследим цепочку вызовов: getUrl вызывает AdminBaseHelper::getViewURL, в которой параметр k=>'{{field_id}}' попадая в функцию http_build_query кодируется в строку "k=%7B%7Bfield_id%7D%7D", а её уже не видет шаблонизатор, рассположенный в js-объекте MultipleWidgetHelper. Таким образом переменная k в URL всегда принимает значение "%7B%7Bfield_id%7D%7D"

Нашел время разобраться с виджетом, спасибо за репорт. Там, похоже, в мультипл режиме совсем всё плохо. Сейчас он не умеет удалять связь с объектами, а в текущей реализации вместо просто удаления связи вообще сносится весь связанный объект :-) Буду копать на досуге...