Автообновление списка при появлении нового контакта в Vtiger CRM 7.2

Автообновление списка при появлении нового контакта в 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();

    }

});

 

Как это всё работает:

  1. Яваскрипт при загрузке страницы получает последний контакт, который на данный момент находится в базе. Т.е. кладёт закладку.
  2. После установки закладки, скрипт ставится на таймаут в 10 секунд.
  3. Каждые 10 секунд происходит запуск функции, которая смотрит, появились ли новые контакты после установленной закладки. И если появились, то происходит обновление таблицы по аяксу (страница при этом не перезагружается).

Таким нехитрым способом можно добиться быстрого появления новых записей в таблице при их появлении в базе.

Популярное

Самые популярные посты

Как быть максимально продуктивным на удалённой работе?
Business

Как быть максимально продуктивным на удалённой работе?

Я запустил собственный бизнес и намеренно сделал всё возможное, чтобы работать из любой точки мира. Иногда я сижу с своём кабинете с большим 27-дюймовым монитором в своей квартире в г. Чебоксары. Иногда я нахожусь в офисе или в каком-нибудь кафе в другом городе.

Привет! Меня зовут Сергей Емельянов и я трудоголик
Business PHP

Привет! Меня зовут Сергей Емельянов и я трудоголик

Я программист. В душе я предприниматель. Я начал зарабатывать деньги с 11 лет, в суровые 90-е годы, сдавая стеклотару в местный магазин и обменивая её на сладости. Я зарабатывал столько, что хватало на разные вкусняшки.

Акция! Профессиональный разработчик CRM за 2000 руб. в час

Выделю время под ваш проект. Знания технологий Vtiger CRM, SuiteCRM, Laravel, Vue.js, Golang, React.js. Предлагаю варианты сотрудничества, которые помогут вам воспользоваться преимуществами внешнего опыта, оптимизировать затраты и снизить риски. Полная прозрачность всех этапов работы и учёт временных затрат. Оплачивайте только рабочие часы разработки после приемки задачи. Экономьте на платежах по его содержанию разработчика в штате. Возможно заключение договора по ИП. С чего начать, чтобы нанять профессионального разработчика на full-time? Просто заполните форму!

Telegram
@sergeyem
Telephone
+4915211100235