DigitalWand / digitalwand.admin_helper

API для сборки кастомных админок в Битриксе
MIT License
156 stars 52 forks source link

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

Closed mrdim closed 6 years ago

mrdim commented 7 years ago

В теле функции 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') ));

ASGAlex commented 7 years ago

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

mrdim commented 7 years ago

@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"

ASGAlex commented 6 years ago

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