На данный момент система предусматривает 4 места в карточках (сделки, контакта, компании, покупателя), в которые может встроиться виджет:
Для работы виджета в карточке необходимо обязательно указать все локейшны карточек, в которых виджет должен работать:
Если ваш виджет использует правую колонку, то для того, чтобы система правильно посчитала количество виджетов в правой колонке до рендера карточки нужно указать постфикс 1 у локейшна. Например, если виджет работает в карточке сделки и выводится в правой колонке, то в manifest.json locations должен выглядеть, примерно, так:
{
...,
"locations": [
"lcard-1"
],
...
}
Для отрисовки собственного блока в правой колонке используйте вызов метода render_template() в колбэке render виджета. Пример вызова с необходимыми параметрами:
self.render_template({
body: '',
caption: {
class_name: 'widget-caption-unique-class-name'
},
render: '<div class="widget-body-unique-class-name">' +
‘Количество сделок: {{count}}’ +
'</div>'
}, { count: 10 });
Шапку с логотипом система отрисует самостоятельно, с теми изображениями, которые лежат у вас в папке images виджета, можно задать ей собственный caption.class_name, чтобы поправить что-то стилями.
За тело блока отвечают свойства body и render, в body можно передать готовую html-строку для отрисовки, в свойство render можно передать разметку, которая будет отрендерена с параметрами, переданными вторым аргументом в render_template.
Позволяет указать новый источник, который будет отображаться в контроле в нижней части фида карточки сделки, покупателя, контакта или компании.
Для этого необходимо вызвать метод this.add_source(source_type, callback [,source_text]) объекта Widget
Параметр | Тип | Описание |
---|---|---|
source_type | string | Тип источника. Может быть “sms”, “chat” , “email” и “custom”. В зависимости от типа виджет будет автоматически выбираться при загрузке карточки, если последнее событие в фиде сообщение чата или sms, или email. |
callback | function | Функция-обработчик источника. Ниже есть примеры реализации. |
source_text | string | Название источника, которое будет видеть пользователь. Имеется для всех типов, кроме “sms”, и является обязательным параметром. Если виджет мультиязычный, то должно подставляться из языковых сообщений. |
Всегда лучше стараться выбирать конкретный тип и, только если ни один не подходит, использовать “custom“. В этом случае внешние источники будут работать наравне с системными.
Если тип источника “sms”, то используется системный контрол, а колбэком является функция, которая вызывается нажатием на кнопку “отправить”.
В этом случае callback всегда должен возвращать объект Promise.
// Пример реализации
self.add_source('sms', function (params) {
/*
params - объект с необходимыми параметрами для отправки смс, который передается в callback
{
'phone': 75555555555, // Телефон получателя
'message': 'sms text', // Сообщение для отправки
'contact_id': 12345 // Идентификатор контакта, к которому привязан номер телефона
}
*/
return new Promise(function (resolve, reject) {
// Место, где описывается логика для отправки смс
$.ajax({
url: '/widgets/' + self.system().subdomain + '/loader/' + self.get_settings().widget_code + '/send_sms',
method: 'POST',
data: params,
success: function () {
// При успешном завершении будет автоматически создано примечание типа 'sms'
resolve();
},
error: function () {
reject();
}
});
});
});
Если тип источника иной, то в callback передается JQuery элемент контрола, который можно использовать для создания любой логики.
Пример реализации
self.add_source('email', function ($el) {
console.log($el);
}, 'Gmail');
С помощью данного метода разработчик может добавить новую вкладку в карточке сущности. В добавленной вкладке будут отображаться различные товары, которые можно будет привязывать и отвязывать от сущности, осуществлять поиск по ним и изменять их количество.
Если вы не используете штатный механизм для работы с товарами, колбэки данного раздела можно использовать для отрисовки произвольных данных на вкладке в карточке.
Для добавления новой вкладки необходимо:
Методы необходимые для подключения источников данных.
В файле script.js виджета обязательно должны быть созданы 4 метода в объекте callbacks:
Описание методов
Метод loadPreloadedData()
Метод вызывается при инициализации вкладки, связанной с виджетом.
Отвечает за отображение предлагаемых к добавлению в карточку данных при открытии поля поиска.
Метод должен возвращать объект типа Promise, который, по выполнении вашего запроса вернет массив [Obj1, Obj2, … ObjN], где Obj — объект, описывающий элемент в формате:
{
"id": 934244, // ID
"sku": "SNI/01/136/0500", // SKU код
"name": "Name", // Наименование
"price": "999" // Цена
}
Пример реализации:
loadPreloadedData: function () {
return new Promise(_.bind(function (resolve, reject) {
self.crm_post(
'http://my.sdk.api.com/sdk_back/',
{},
function (msg) {
resolve(msg);
},
'json'
);
}), this);
}
Если ваш виджет не работает с товарами, а нужно просто отрендерить какие-то данные во вкладку, то можно использовать как раз этот метод со следующим содержимым:
loadPreloadedData: function () {
var $widget_tab = $('#' + self.get_settings().widget_code);
$widget_tab.html('widget body here');
return Promise.resolve({});
}
Метод loadElements(type, id)
Метод вызывается при инициализации вкладки, связанной с виджетом.
Отвечает за отображение привязанных к карточке элементов.
Метод должен возвращать объект типа Promise, который, по выполнении вашего запроса вернет массив [Obj1, Obj2, … ObjN], где Obj — объект, описывающий элемент в формате:
{
"id": 934244, // ID
"sku": "SNI/01/136/0500", // SKU код
"name": "Name", // Наименование
"price": "999", // Цена
"quantity": 2 // Количество
}
Параметры:
Параметр | Тип | Описание |
---|---|---|
type | array | Информация о сущности, из которой делается запрос |
type[id] | int | ID сущности (1 – контакт, 2 – сделка, 3 – компания, 12 – покупатель) |
type[type] | string | Текстовый идентификатор сущности |
id | int | ID элемента, из которого делается запрос |
Пример реализации:
loadElements: function (type, id) {
return new Promise(_.bind(function (resolve, reject) {
self.crm_post(
'http://my.sdk.api.com/sdk_back/?products=true&type='+type.type+'&entity_id='+id,
{},
function (msg) {
resolve(msg);
},
'json'
);
}), this);
}
Метод linkCard(links)
Метод вызывается при сохранении привязанных элементов в карточки, при изменении колличества и их отвязке.
Отвечает за привязку/отвязку элементов в карточку.
Параметры метода:
Параметр | Тип | Описание |
---|---|---|
links | array | Массив объектов |
links[link] | array | Массив элементов для привязки |
links[link][from] | string | Сущность, к которой осуществляется привязка |
links[link][from_id] | int | ID сущности, к которой осуществляется привязка |
links[link][quantity] | int | Количество |
links[link][to_id] | int | ID товара |
links[link][to_widget_id] | string | Код виджета |
links[unlink] | array | Массив элементов для отвязки |
links[link][from] | string | Сущность, от которой осуществляется отвязка |
links[link][from_id] | int | ID сущности, от которой осуществляется отвязка |
links[link][quantity] | int | Количество |
links[link][to_id] | int | ID товара |
links[link][to_widget_id] | string | Код виджета |
Пример реализации метода:
linkCard: function (links) {
return new Promise(_.bind(function (resolve, reject) {
self.crm_post(
'http://my.sdk.api.com/sdk_back/link.php',
links,
function () {},
'json'
);
resolve();
}), this);
}
Метод searchDataInCard(query, type, id)
Метод вызывается при поиске элементов.
Отвечает за отображение найденных элементов к карточке элементов.
Метод должен возвращать объект типа Promise, который, после выполнения вашего запроса, вернет массив [Obj1, Obj2, … ObjN], где Obj — объект, описывающий элемент в формате:
{
"id": 934244, // ID
"sku": "SNI/01/136/0500", // SKU код
"name": "Name", // Наименование
"price": "999" // Цена
}
Параметры метода
Параметр | Тип | Описание |
---|---|---|
query | string | Строка запроса на поиск |
type | int | Тип сущности, из которой делается запрос (1 – контакт, 2 – сделка, 3 – компания, 12 – покупатель) |
id | int | ID элемента, из которого делается запрос. |
Пример реализации метода:
searchDataInCard: function (query, type, id) {
return new Promise(_.bind(function (resolve, reject) {
self.crm_post(
'http://my.sdk.api.com/sdk_back/search.php',
{
query: query,
type: type,
id: id
},
function (msg) {
resolve(msg);
},
'json'
);
}), this);
}
В системе реализована возможность использовать кастомный поиск юридических лиц при заполнении поля типа Юр. лицо
Для реализации данной функции можно использовать предусмотренный метод. Для этого необходимо поместить в массив AMOCRM.widgets.legal_handlers функцию, которая будет возвращать ajax. Ajax должен вернуть массив объектов следующей структуры:
{
"name": "ООО ШОКОЛАДНИЦА",
"inn": "5009051111",
"kpp": "500901001",
"ogrn": "1065009000187",
"type": "1",
"address": "МОСКОВСКАЯ ОБЛ., Г ДОМОДЕДОВО,КАШИРСКОЕ ШОССЕ, Д 70"
}
Пример реализации:
AMOCRM.widgets.legal_handlers = [function (data) {
var def = $.Deferred();
$.ajax({
type: 'POST',
url: 'http://www.example.com/',
dataType: 'json',
data: data
}).done(_.bind(function (response) {
var res;
res = _.map(response._embedded.items, function (item) {
return {
name: item.name,
inn: item.inn,
kpp: item.kpp,
ogrn: item.ogrn,
type: item.type,
address: item.address
};
});
this.def.resolve(res);
}, {def: def}))
.fail(_.bind(def.reject, def, []));
return def.promise();
}];
При работе пользователя в amoCRM, можно обеспечить вызов какой-либо функции, при нажатии на номер телефона или e-mail адрес контакта.
Данная возможность реализуется готовой функцией add_action(). Возможные параметры
Параметр | Описание |
---|---|
type | Тип передаваемого параметра, может быть: “email”, “phone” |
action | Функция, которая будет вызываться при нажатии на номер телефона или email адрес |
Рассмотрим пример использования функции add_action(), поместив её в функцию обратного вызова init, объекта callbacks структуры script.js.
Пример:
this.callbacks = {
init: function () {
self.add_action('phone', function (data) {
self.crm_post(
'http://127.0.0.1/file.php',
{ call_to: data.value },
function (msg) {
console.log('Данные отправлены');
},
'text',
function () {
console.log('Error');
}
);
});
}
};
Важно помнить, что необходимо объявить область подключения виджета в manifest.json. Для выполнения функции add_action(), нужно задать области видимости, где есть отображённые номера телефонов или email адреса. Либо задать ограниченный спектр областей срабатывания, на ваше усмотрение, подробнее об областях подключения читайте здесь. В примере заданы все области, где встречаются номера телефонов и email адреса.
Пример:
{
...
"locations": [
"ccard-1",
"clist-1",
"lcard-1",
"llist-1",
"cucard-1",
"culist-1 ",
"comcard-1"
],
...
}
Для того, чтобы изменить надпись на кнопке, вызываемой во время нажатия на номер телефона или email адрес, необходимо в директории i18n структуры вашего виджета, внести соответствующие изменения в файле локализации *.json, так, как указано в примере ниже. Если параметр “call_action” не задан, по умолчанию в надпись на кнопке будет подставлено имя вашего виджета, являющееся обязательным параметром в manifest.json. Значение “call_action” будет подставлено в кнопку автоматически, при инициализации виджета.
Пример (файл ru.json):
{
"widget": {
"call_action": "Позвонить"
}
}
Интерфейс amoCRM позволяет инициировать переписку с клиентом из карточки. Для этого достаточно создать карточку и добавить в нее контакт с номером телефона.
Если ваш канал поддерживает функцию “написать первым”, то он отобразится в выпадающем списке Click 2 Call (подробнее Регистрация нового канала).