
Автообновление списка при появлении нового контакта в Vtiger CRM 7.2
От одного из клиентов поступил запрос на интересный функционал системы. Сотрудники пользовались в основной своей массе модулем "Контакты". И в списках постоянно добавлялись всё новые и новые клиенты. Клиент хотел видеть появление в таблице новых контактов без необходимости перезагрузки страницы.
От одного из клиентов поступил запрос на интересный функционал системы. Сотрудники пользовались в основной своей массе модулем "Контакты". И в списках постоянно добавлялись всё новые и новые клиенты. Клиент хотел видеть появление в таблице новых контактов без необходимости перезагрузки страницы.
Например, как только какой-нибудь пользователь добавил нового контакта, запись тут же появилась у всех других сотрудников.
Что самое интересное, реализуется это довольно просто. Достаточно добавить два файла.
Первый файл: modules/Contacts/actions/LiveUpdateAjax.php
Со следующим содержимым:
<?php
class Contacts_LiveUpdateAjax_Action extends Vtiger_Action_Controller
{
public function checkPermission(Vtiger_Request $request)
{
}
public function __construct()
{
$this->exposeMethod("getContacts");
$this->exposeMethod("getLastId");
}
public function process(Vtiger_Request $request)
{
$mode = $request->get("mode");
if (!empty($mode)) {
$this->invokeExposedMethod($mode, $request);
}
}
public function getContacts(Vtiger_Request $request)
{
$response = new Vtiger_Response();
global $adb;
$result = array();
$res = $adb->pquery('SELECT contactid FROM vtiger_contactdetails INNER JOIN vtiger_crmentity ON vtiger_contactdetails.contactid = vtiger_crmentity.crmid WHERE contactid > ? AND vtiger_crmentity.deleted = 0 ORDER BY contactid DESC', array($request->get('record')));
if (0 < $adb->num_rows($res)) {
while ($row = $adb->fetchByAssoc($res)) {
$result[] = array('id' => $row['contactid']);
}
}
$response->setResult($result);
$response->emit();
}
public function getLastId(Vtiger_Request $request)
{
global $adb;
$res = $adb->pquery('SELECT contactid FROM vtiger_contactdetails ORDER BY contactid DESC LIMIT 1');
$contactid=$adb->query_result($res,0,'contactid');
$response = new Vtiger_Response();
$response->setResult(array('id' => $contactid));
$response->emit();
}
}
Второй файл: layouts/v7/modules/Contacts/resources/List.js
С содержимым:
Vtiger_List_Js("Contacts_List_Js", {
lastId: false,
}, {
registerUpdateContactsEvent: function () {
var self = this;
var params = {
module: 'Contacts',
action: 'LiveUpdateAjax',
mode: 'getLastId'
}
app.request.post({data: params}).then(
function(err,data) {
if (err === null) {
Contacts_List_Js.lastId = data.id;
setInterval(self.runUpdate, 10000);
}
}
)
},
runUpdate: function() {
var params = {
module: 'Contacts',
action: 'LiveUpdateAjax',
mode: 'getContacts',
record: Contacts_List_Js.lastId
}
app.request.post({data: params}).then(
function(err,data) {
data.forEach(function(entity) {
Contacts_List_Js.lastId = entity.id;
});
if(data.length > 0) {
var listInstance = new Vtiger_List_Js();
listInstance.loadListViewRecords();
}
}
);
},
registerEvents : function() {
this._super();
this.registerUpdateContactsEvent();
}
});
Как это всё работает:
- Яваскрипт при загрузке страницы получает последний контакт, который на данный момент находится в базе. Т.е. кладёт закладку.
- После установки закладки, скрипт ставится на таймаут в 10 секунд.
- Каждые 10 секунд происходит запуск функции, которая смотрит, появились ли новые контакты после установленной закладки. И если появились, то происходит обновление таблицы по аяксу (страница при этом не перезагружается).
Таким нехитрым способом можно добиться быстрого появления новых записей в таблице при их появлении в базе.
Остались вопросы? Спросите меня!