Проблема
Открываем сделку привязанную к ИМ - Просмотр - Файл - Кликаем - и редирект в колено.
Причина
Интеграция с ИМ никогда не обновлялась и не знает что вообще может быть в заказе ИМ файлы. По этому она не может понять по какой ссылке мы можем там перейти и тем более что то скачать.
Решение
Время магических костылей! Почему костыли? Потому что такого функционала просто нет )) А то что выбрасывается ошибка и редирект это следствие не последовательной разработки без тестирования всего функционала.
1) Нужно понять куда и что нас редиректит? Редиректит нас ссылка вида <...href="order_detail.php?"> которая находится в диалоговом окне редактирования заказа. По сути самого диалоговое окно имеет html форму которую грузит с ИМ через httpclient.
Следовательно лениво написанная ссылка не имеет никакого смысла
Решения два
А) Это поправить все таки файл через который мы грузим форму и там сделать preg_replace ($response["BODY"] (лучше всего так как второй способ мне не нравится, я сделал именно его)
Б) <ИМ>/bitrix/modules/sale/general/admin_tool.php строка 2017 кусок говно кода
$resultHTML= "<a href=\"sale_order_detail.php?ID=".$orderId."&download=Y&file_id=".$arFile["ID"]."&".bitrix_sessid_get()."\">".$arFile["ORIGINAL_NAME"]."</a>" |
$resultHTML= "<a href=\"/bitrix/admin/sale_order_detail.php?ID=".$orderId."&download=Y&file_id=".$arFile["ID"]."&".bitrix_sessid_get()."\">".$arFile["ORIGINAL_NAME"]."</a>"; |
Приложим подорожник!
2) Куда смотрит диалог из CRM? Сюда <КП>/bitrix/tools/crm_sale_proxy.php - пялимся внутрь. Видим правда, что все работает в лоб.
- Отправляем запрос к админке магазина с псевдоавторизацией.
- Получили ХТМЛ - попытались что то грязное сделать с хрефами, ну конечно они все стреляют в колено админки ИМ
- Показываем его в диалоге
- После сохранения пытаемся все запихнуть в строку (В СТРООКУУУУУ О БОЖЕ МОЙ) и отправить обратно.
Вставляем такой ужас.
Суть какая - мы можем получить ответ от httpclient в форме файла, а можем в форме формы. Файл надо отдать как файл. Форму как форму - не перепутать.
Строка 146
Было
146 echo $body; |
$looks_like_file = 'attachment; filename='; //Не придумал более лучшего способа - что бы много не переписывать, кроме найти загаловок атача if(stristr($response['HEADERS']->toString(), $looks_like_file)){ // Нашли что в загаловках ответа встречается слово атач $arHeaders = $response['HEADERS']->toArray(); //Мы должны сообщить браузеру который получает ответ что мы плюним ему в лицо файл, headers все есть - следовательно нужно только вернуть их ещё раз - уже не в клиент а в браузер foreach ($arHeaders as $key => $arHeader) { $name = $arHeader['name']; foreach ($arHeader['values'] as $sub => $val) { header($name . ': ' . $val); } } echo $response['BODY']; // И сам файл который как должен лежит в Боди ($body - имеет реплейсы - я очканул его использовать) } else { echo $body; } |
Если есть кто таким пользуется потом расскажу как сделать что бы при редактировании заказа из CRM в ИМ не стирались все файлы в заказе.