@black_xe

Как сделать подмену файла на событии OnBeforeCrmDealUpdate?

Подскажите пожалуйста, хочу подменять файл в сделке по событию OnBeforeCrmDealUpdate.

код:
public static function createDealBasedOnFiles(&$fields)
    {
        $deal = \CCrmDeal::GetList([], array('ID' => $fields['ID']))->Fetch();

        if ($deal['UF_CONTRACT_REGISTER_DOCUMENT'][0] !== $fields['UF_CONTRACT_REGISTER_DOCUMENT'][0]) {
            $resPdf = DealSubscriber::createPdf($fields['UF_CONTRACT_REGISTER_DOCUMENT'][0]);

            $protocol = strpos(strtolower($_SERVER['SERVER_PROTOCOL']), 'https') === false ? 'http' : 'https';

            $fields['UF_CONTRACT_REGISTER_DOCUMENT'][] = [  
                'fileData' => [
                    preg_replace('#.*/#', '', $resPdf['path']),
                    base64_encode(file_get_contents($protocol . '://' . $_SERVER["SERVER_NAME"] . $resPdf['path']))
                ]
            ];
        }
    }


Подскажите,
1. Правильно ли использовать file_get_contents($protocol . '://' . $_SERVER["SERVER_NAME"] . $resPdf['path']), так как делаю это я ?

2. В итоге, в момент изменения и сохранения сделки, вечная загрузка идет (Скрин 1.)

подскажите пожалуйста что я делаю не так!
  • Вопрос задан
  • 33 просмотра
Решения вопроса 1
gromdron
@gromdron Куратор тега Битрикс24
Bitrix developer
Вы уже правильно ответили в своем вопросе: Как прикрепить файл к сделке в множественное поле типа Файл?

1) При работе с коробочным API использование облачного API не допустимо.
Вместо конструкции:

$fields['UF_CONTRACT_REGISTER_DOCUMENT'][] = [  
                'fileData' => [
                    preg_replace('#.*/#', '', $resPdf['path']),
                    base64_encode(file_get_contents($protocol . '://' . $_SERVER["SERVER_NAME"] . $resPdf['path']))
                ]
            ];


Вам необходимо использовать \CFile::MakeFileArray() в который вы передадите абсолютный путь к необходимому файлу.

2) Не обязательно получать все поля сделки сразу. Для начала имеет смысл проверить: а пришло ли у вас в $fields поле UF_CONTRACT_REGISTER_DOCUMENT. Дело в том, что в новой карточке к вам может прийти только NAME (например меняете заголовок) или набор других полей. Нет смысла каждый раз получать эти поля и сравнивать с возможным null-значением ибо null значение всегда не будет равно существующему элементу.

Можно использовать для проверки конструкцию array_key_exists('UF_CONTRACT_REGISTER_DOCUMENT', $fields)

3) Генерация pdf файла может занять продолжительное время, а запрос на сохранение имеет таймаут в 30 секунд. Если вы не успеете то для пользователя он вызовет бесконечную загрузку и нерабочую карточку. Имеет смысл делать отложенную генерацию. т.е. регистрировать агента на дальнейшую генерацию или использовать другие механизмы для заполнения данного поля
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы