Система VtigerCRM предоставляет отличный инструмент, позволяющий выполнять любые операции с модулями - создание, редактирование, просмотр, удаление.
Представьте ситуацию - у вас есть веб-сервис, в котором пользователи прикрепляют сканы документов. И вы хотите сделать так, чтобы эти документы отправлялись по API в VtigerCRM и прикреплялись, например, к карточке контакта.
Чтобы сделать это вручную, вам надо перейти в карту контакта, нажать на вкладку документы и в ней добавить новый документ. Как это выглядит в системе, вы можете посмотреть выше на скриншоте. Но если у вас стоит свой собственный сервис, куда пользователи уже загрузили документы, то вам нет необходимости дополнительно передавать весь файл. Достаточно передать ссылку на него на внешнем сервисе. Поэтому обычно удобнее добавить ссылку на файл. К счастью, у Vtiger есть подобный функционал.
Итак, мы знаем как добавлять ссылку на файл через интерфейс системы. Теперь давайте попробуем сделать это из API.
Для этого вам надо отправить POST-запрос на адрес Vtiger /webserbive.php в виде формы со следующими полями:
- operation: create
- sessionName: ключ сессии для авторизации
- elementType: Documents
- element: текст в формате json, например
{
"notes_title": "External Five PDF",
"filename": "https:\/\/itvolga.com\/storage\/settings\/October2018\/ITy6ZA0VlyRWZsYOGNnZ.png",
"assigned_user_id": "19x1",
"notecontent": "",
"filetype": "",
"filesize": "0",
"filelocationtype": "E",
"fileversion": "",
"filestatus": "1",
"filedownloadcount": "",
"folderid": "22x1",
"modifiedby": "19x1",
"created_user_id": "19x1",
"starred": "0",
"tags": "",
"relations": "12x100"
}
В примере выше вы видете поле relations, в котором мы говорим системе, что документ должен быть привязан к контакту с id 100.
Если вы отправите подобный запрос в Vtiger, то у вас успешно будет создан документ со ссылкой на файл. Но если вы перейдёте в карту контакта, то нужного документа там не будет. Здесь мы наблюдаем проблему, что при создании документа не срабатывает создание связи. Давайте попробуем решить эту задачу.
Для этого, во-первых, создайте новую служебную функцию в файле include/Webservices/Utils.php
function vtws_getEntityId($entityName) {
global $adb;
$wsrs=$adb->pquery('select id from vtiger_ws_entity where name=?', array($entityName));
if ($wsrs && $adb->num_rows($wsrs)==1) {
$wsid = $adb->query_result($wsrs, 0, 0);
} else {
$wsid = 0;
}
return $wsid;
}
Затем перейдите в файл include/Webservices/SetRelation.php, найдите в нём функцию vtws_internal_setrelation (строчка 57) и в конце этой функции, перед строчкой
relateEntities($focus, $moduleName, $elementId, $withModuleName, $withElementId);
Добавьте следующий блок кода:
if ($moduleName === 'Documents' && $withModuleName === 'Contacts') {
$focus = CRMEntity::getInstance($withModuleName);
$moduleName = $withModuleName;
$tmpElementId = $elementId;
$elementId = $withElementId;
$withElementId = $tmpElementId;
$withModuleName = 'Documents';
}
После этих операций при очередной отправке запроса на создание внешнего документа он будет не только создан в модуле "Документы", но и успешно привязан к контакту.
Если у вас остались вопросы по доработке системы, обращайтесь, я вам с удовольствием помогу.