SalesPlatform Vtiger CRM Developers XML конфигурация

Материал из SalesPlatform Wiki
Перейти к: навигация, поиск

Содержание

Руководство для опытных пользователей

Работа с конфигурацией

Конфигурация - это механизм расширений, облегчающий адаптацию прикладного решения под конкретного заказчика.

При помощи конфигураций можно:

Для работы конфигурации необходимо иметь установленный модуль SPConfigurationManager и XML-файл с описанием конфигурации.

Установка модуля конфигурации в CRM-систему


Для того, чтобы установить модуль конфигураций в CRM-систему необходимо:

1. Скачать по ссылке (указана ниже) модуль “Менеджер Конфигураций” в виде zip-архива (SPConfigurationManager.zip).

2. Перейти в Настройки CRM -> Менеджер модулей и загрузить zip-архив. Для этого следует нажать на строку “Установка из zip-архива” (см.рис. 1).


Рис. 1.1: Установка модуля конфигурации в CRM


3. Включить модуль “Менеджер Конфигураций” в менеджере модулей (см.рис. 2).

Рис. 1.2: Включение модуля конфигураций


В результате в настройках CRM-системы в области “Другие настройки” будет добавлен пункт “Менеджер конфигураций” (см.рис.3).

Рис. 1.3: Менеджер Конфигураций


Применение конфигурации

Для начала следует создать XML-файл с описанием конфигурации. Для того, чтобы применить данную конфигурацию необходимо открыть Настройки CRM -> Другие настройки -> Менеджер Конфигураций (см.рис. 3).

Загрузить конфигурацию можно двумя способами:

Если для загрузки конфигурации используется Дизайнер конфигураций, то в поле [URL] надо указать путь к Дизайнеру, ввести логин/пароль и нажать на кнопку [Загрузить список конфигураций] (см.рис. 4).

Рис. 1.4: Загрузка конфигурации из графического файла через Дизайнер конфигураций


В случае, если загрузка конфигурации осуществляется из XML-файла, то следует нажать на кнопку [Выберите файл] (см.рис. 5). После этого будет открыто окно, в котором можно выбрать на своем компьютере необходимый файл конфигурации и нажать на кнопку [Применить]. В случае успешного применения конфигурации, все изменения фиксируются в системе.

Рис. 1.5: Загрузка конфигурации из XML-файла


Экспорт текущей конфигурации через параметры GET-запроса: http://localhost/vtiger650/spconfiguration.php?export=1

Добавление новых полей в существующий модуль

Создание нового модуля

Перед тем, как добавлять новые поля в модуль через конфигурацию, надо создать новый модуль с одним обязательным полем (н-р: поле [name]), которое должно быть установлено в качестве идентификатора сущности модуля (Entity Identifier или Entity Name). Для этого вы можете воспользоваться статьей «Создание нового модуля».
Готовый скрипт создания нового модуля с полем [name]:

<?php 
    include_once 'vtlib/Vtiger/Module.php';
    require_once('vtlib/Vtiger/Package.php');
  
    $Vtiger_Utils_Log = true;
  
    $MODULENAME = 'NewModule';
 
    $moduleInstance = new Vtiger_Module();
    $moduleInstance->name = $MODULENAME;
    $moduleInstance->parent = 'Tools';
    $moduleInstance->save();
    $moduleInstance->initTables();
    $info_block = new Vtiger_Block();
    $info_block->label = 'LBL_' . strtoupper($moduleInstance->name) . '_INFORMATION';
    $moduleInstance->addBlock($info_block);
      
    $name_filed = new Vtiger_Field();
    $name_filed->name = 'name';
    $name_filed->label = 'Name';
    $name_filed->uitype = 2;
    $name_filed->summaryfield =1;
    $name_filed->column = $name_filed->name;
    $name_filed->columntype = 'VARCHAR(255)';
    $name_filed->typeofdata = 'V~M';
    $info_block->addField($name_filed);
    $moduleInstance->setEntityIdentifier($name_filed);
     
    //настройка совместного доступа (права доступа устанавливаются по умолчанию). 
    $moduleInstance->setDefaultSharing();
 
    //инициализация Веб-сервиса (автоматический вызов API)
    $moduleInstance->initWebservice();   
 
    $package = new Vtiger_Package();
    $package->export($moduleInstance, 'test/vtlib', 'NewModule.zip', false);

Добавление новых полей в существующий модуль

После того как будет создан новый модуль, необходимо, используя XML-файл конфигурации:

- добавить новые поля в существующий блок модуля:

Состав полей блока “Общая информация”
Название поля Тип поля
Заказ* Поле-ссылка на карточку Заказа
Статус* Выпадающий список. Значения: Активно, Неактивно
Дата Дата
Ответственный* Ответственный


- добавить в новый блок новое поле:

Состав полей блока “Описание”
Название поля Тип поля
Описание Текстовая область

Используемые теги в файле конфигурации:

Описание XML-файла конфигурации

<configurations>
    <configuration>
       <uid>newmodule</uid>
       <name>newmodule</name>
       <language>ru_ru</language>
       <modules>
           <module>
               <name>NewModule</name>
               <label>NewModule</label>
               <parent>Tools</parent>
               <state>1</state>
               <translation>
                   <modstrings>
                       <modstring>
                           <original>NewModule</original>
                           <translated>Новый Модуль</translated>
                       </modstring>
                       <modstring>
                           <original>SINGLE_NewModule</original>
                           <translated>Новый Модуль</translated>
                       </modstring>
                       <modstring>
                           <original>LBL_ADD_RECORD</original>
                           <translated>Добавить запись в новый модуль</translated>
                       </modstring>
                       <modstring>
                           <original>LBL_RECORDS_LIST</original>
                           <translated>Список записей</translated>
                       </modstring>
                       <modstring>
                           <original>LBL_NEWMODULE_INFORMATION</original>
                           <translated>Общая информация</translated>
                       </modstring>
                       <modstring>
                           <original>LBL_NEWMODULE_DESCRIPTION</original>
                           <translated>Описание</translated>
                       </modstring>
                       <modstring>
                           <original>Name</original>
                           <translated>Имя</translated>
                       </modstring>
                       <modstring>
                           <original>Sales order</original>
                           <translated>Заказ</translated>
                       </modstring>
                       <modstring>
                           <original>Status</original>
                           <translated>Статус</translated>
                       </modstring>     
                       <modstring>
                           <original>Date</original>
                           <translated>Дата</translated>
                       </modstring>                    
                       <modstring>
                           <original>Responsible</original>
                           <translated>Ответственный</translated>
                       </modstring> 
                       <modstring>
                           <original>Description</original>
                           <translated>Описание</translated>
                       </modstring>                 
                   </modstrings>
               </translation>
               <blocks>
                   <block>
                       <label>LBL_NEWMODULE_INFORMATION</label>
                       <sequence/>
                       <fields>
                           <field>
			       <fieldname>salesorderid</fieldname>
			       <uitype>10</uitype>
			       <columnname>salesorderid</columnname>
      			       <tablename>vtiger_newmodule</tablename>
			       <columntype>int(19)</columntype>
			       <generatedtype>1</generatedtype>
			       <fieldlabel>Sales order</fieldlabel>
			       <readonly>1</readonly>
			       <presence>2</presence>
			       <defaultvalue/>
			       <!--<sequence>3</sequence>-->
		    	       <maximumlength>100</maximumlength>
			       <typeofdata>I~M</typeofdata>
			       <quickcreate>1</quickcreate>
			       <quickcreatesequence>1</quickcreatesequence>
			       <displaytype>1</displaytype>
			       <info_type>BAS</info_type>
			       <helpinfo>
			           <![CDATA[ ]]>
			       </helpinfo>
			       <summaryfield>1</summaryfield>
			       <masseditable>1</masseditable>
			       <relatedmodules>
			           <relatedmodule>SalesOrder</relatedmodule>
			       </relatedmodules>
			   </field>
                           <field>
                               <fieldname>nm_status</fieldname>
		               <uitype>15</uitype>
			       <columnname>nm_status</columnname>
			       <tablename>vtiger_newmodule</tablename>
			       <columntype>varchar(255)</columntype>
			       <fieldlabel>Status</fieldlabel>
			       <readonly>1</readonly>
                               <presence>2</presence>
                               <defaultvalue/>
			       <!--<sequence>4</sequence>-->
			       <maximumlength>255</maximumlength>
			       <typeofdata>V~O</typeofdata>
			       <quickcreate>1</quickcreate>
                               <quickcreatesequence>2</quickcreatesequence>
	 		       <displaytype>1</displaytype>
			       <info_type>BAS</info_type>
			       <helpinfo>
			           <![CDATA[ ]]>
			       </helpinfo>-->
		               <summaryfield>0</summaryfield>
			       <masseditable>1</masseditable>
			       <cleanpicklistvalues>1</cleanpicklistvalues>
                               <picklistvalues>
			           <picklistvalue>Активно</picklistvalue>
			           <picklistvalue>Неактивно</picklistvalue>
			       </picklistvalues>
                           </field>
                           <field>
			       <fieldname>nmdate</fieldname>
			       <uitype>5</uitype>
			       <columnname>nmdate</columnname>
			       <tablename>vtiger_newmodule</tablename>
			       <columntype>date</columntype>
			       <generatedtype>1</generatedtype>
			       <fieldlabel>Date</fieldlabel>
			       <readonly>1</readonly>
			       <presence>2</presence>	
			       <defaultvalue/>
			       <!--<sequence>4</sequence>-->
			       <maximumlength>100</maximumlength>
			       <typeofdata>D~O</typeofdata>
			       <quickcreate>1</quickcreate>
                               <quickcreatesequence>3</quickcreatesequence>
			       <displaytype>1</displaytype>
			       <info_type>BAS</info_type>
			       <helpinfo>
				   <![CDATA[ ]]>
			       </helpinfo>
			       <summaryfield>0</summaryfield>
			       <masseditable>1</masseditable>
			   </field>
                           <field>
			       <fieldname>responsible</fieldname>
			       <uitype>53</uitype>
			       <columnname>smownerid</columnname>
			       <tablename>vtiger_crmentity</tablename>
			       <generatedtype>1</generatedtype>
			       <fieldlabel>Responsible</fieldlabel>
			       <readonly>1</readonly>
			       <presence>2</presence>
			       <defaultvalue/>
			       <!--<sequence>2</sequence>-->
			       <maximumlength>100</maximumlength>
			       <typeofdata>V~M</typeofdata>
			       <quickcreate>1</quickcreate> <!--форма быстрого создания-->
			       <quickcreatesequence>4</quickcreatesequence>
			       <displaytype>1</displaytype>
			       <info_type>BAS</info_type>
			       <helpinfo>
				   <![CDATA[ ]]>
			       </helpinfo>
			       <columntype>VARCHAR(255)</columntype>
			       <masseditable>1</masseditable>
			       <summaryfield>1</summaryfield> <!--краткий вид карточки>-->
			  </field>
                      </fields>
	          </block>
                  <block>
                      <label>LBL_NEWMODULE_DESCRIPTION</label>
                      <sequence/>
                      <fields>
                          <field>
                              <fieldname>nm_description</fieldname>
                              <uitype>19</uitype>
                              <columnname>nm_description</columnname>
                              <tablename>vtiger_newmodule</tablename>
                              <columntype>varchar(255)</columntype>
                              <generatedtype>1</generatedtype>
                              <fieldlabel>Description</fieldlabel>
                              <readonly>1</readonly>
                              <presence>2</presence>
                              <defaultvalue/>
                              <!--<sequence>2</sequence>-->
                              <maximumlength>100</maximumlength>
                              <typeofdata>V~O</typeofdata>
                              <quickcreate>0</quickcreate>
                              <quickcreatesequence>5</quickcreatesequence>
                              <displaytype>1</displaytype>
                              <info_type>BAS</info_type>
                              <helpinfo>
                                  <![CDATA[ ]]>
                              </helpinfo>
                              <summaryfield>1</summaryfield>
                              <masseditable>1</masseditable>
                          </field>
                      </fields>
	          </block>
              </blocks>
	      <customviews>
                  <customview>
		      <viewname>All</viewname>
		      <setdefault>true</setdefault>
		      <setmetrics>false</setmetrics>
		      <fields>
		          <field>
			      <fieldname>salesorderid</fieldname>
			      <columnindex>2</columnindex>
			  </field>
                          <field>
			      <fieldname>nm_status</fieldname>
			      <columnindex>3</columnindex>
			  </field>	
                          <field>
			      <fieldname>nmdate</fieldname>
			      <columnindex>4</columnindex>
			  </field>
                          <field>
			      <fieldname>responsible</fieldname>
			      <columnindex>5</columnindex>
			  </field>
		      </fields>
		  </customview>
	      </customviews>
          </module>
      </modules>
  </configuration>
</configurations>

Локализация

В статье «Создание нового модуля» Вы можете ознакомится с процессом локализации. Ниже рассмотрен пример аналогичный примеру, который представлен в данной статье.

Vt note.png Примечание
процесс локализации названий полей, блоков, а также записей раскрывающихся списков и т.д. не вносит изменений в систему, а лишь перезаписывает файл <MODULENAME>.php в директории "renamed".


Используемые теги в файле конфигурации


Описание XML-файла конфигурации

<configurations>
    <configuration>
        <uid>newmodule</uid>
        <name>newmodule</name>
        <language>ru_ru</language>
        <translation>
            <modstrings>
                <modstring>
                    <original>
                        <![CDATA[ NewModule ]]>
                    </original>
                    <translated>
                        <![CDATA[ Новый модуль ]]>
                    </translated>
               </modstring>
               <modstring>
                   <original>
                       <![CDATA[ SINGLE_NewModule ]]>
                   </original>
                   <translated>
                       <![CDATA[ Новый модуль ]]>
                   </translated> 
               </modstring>
           </modstrings>
       </translation>
       <modules>
           <module>
               <name>NewModule</name>
               <state>1</state>
               <translation>
                   <modstrings>
                       <modstring>
                           <original>
                               <![CDATA[ LBL_NEWMODULE_INFORMATION ]]>
                           </original>
                           <translated>
                               <![CDATA[ Общая информация ]]>
                           </translated>
                       </modstring>
                       <modstring> 
                           <original>
                               <![CDATA[ Name ]]>
                           </original>
                           <translated>
                               <![CDATA[ Имя ]]>
                           </translated>
                       </modstring>
                       ...
                   </modstrings>
               </translation>
           </module>
       </modules>
    </configuration>
</configurations>

Проверка полей перед сохранением

C механизмом “check-before-save”, который осуществляет проверку перед сохранением сущности, Вы можете ознакомится в статье «Проверка полей перед сохранением».
Для реализации механизма “check-before-save” необходимо создать директорию “actions” в директории Модуля. Ниже рассмотрен пример аналогичный примеру, который представлен в статье «Проверка полей перед сохранением». Необходимо предпринять следующие действия в режиме создания и редактирования:


Используемые теги в файле конфигурации


Описание XML-файла конфигурации

<configurations>
    <configuration>
        <uid>conf_newmodule</uid>
        <name>conf_newmodule</name>
        <language>ru_ru</language>
        <modules>
            <module>
                <name>NewModule</name>
                <label>NewModule</label>
                <parent>Tools</parent>
                <state>1</state>
                <checkbeforesave>
                    <sourcecode>
                          <![CDATA[
                              class NewModule_CheckBeforeSave_Action extends Vtiger_Action_Controller {
 
                                  function checkPermission(Vtiger_Request $request) {
                                      return;
                                  }
   
                                  public function process(Vtiger_Request $request) {
                                      $dataArr = (array)json_decode(urldecode($request->get('checkBeforeSaveData')));
                                      $response = "OK";
                                      $message = "";
                                      $selected_date = new DateTime($dataArr['nmdate']);
                                      $сurrent_date = new DateTime(date("d-m-Y"));
         
                                      if($request->get('EditViewAjaxMode')) { 
                                          $mode = $request->get('CreateMode');
             
                                          // On create or edit
                                          if (isset($mode) && (($mode == 'create') || ($mode == 'edit'))) {
                                              if($dataArr['nm_status']== 'Активно' && $dataArr['nm_description'] == '') {
                                                  $response = "CONFIRM";
                                                  $message = "Вы действительно хотите сохранить запись без Описания?"; 
                                              }
                                              if($selected_date > $сurrent_date) {
                                                  $response ="ALERT";
                                                  $message = "Выбранная Дата больше текущей. Измените Дату.";                    
                                              }                
                                          }
                                          echo json_encode(array("response" => $response, "message" => $message));
                                      }
         
                                      //Никакого окна подтверждения выведено не будет, карточка сохранится как обычно
                                      return;
                                  }
                              }
        	          ]]>
                    </sourcecode>
                    <language>php</language>
                </checkbeforesave>
            </module>
        </modules>
    </configuration>
</configurations>

Автозаполнение полей

C механизмом “prepare-view”, который организует предварительную обработку данных карточки перед ее отображением пользователю, Вы можете ознакомится в статье «Автозаполнение полей». Ниже рассмотрен пример аналогичный примеру, который представлен в данной статье. Необходимо создать карточку для Модуля «NewModule» из связанного списка открытой карточки Модуля «Accounts», где должно выполняться автозаполнение необходимых полей текущего Модуля из карточки Модуля-источника «Accounts». А именно:

Для реализации механизма “prepare-view” следует отключить возможность быстрого создания карточки Модуля, подробнее смотрите в статье «Автозаполнение полей». Также необходимо добавить в связанный список Модуля “Аccounts” ссылку на Модуль “NewModule” и реализовать механизм “prepare-view” через XML-файл конфигурации.


Используемые теги в файле конфигурации


Описание XML-файла конфигурации

<configurations>
    <configuration>
        <uid>conf_newmodule</uid>
        <name>conf_newmodule</name>
        <language>ru_ru</language>
        <modules>
            <module>
                <name>Accounts</name>
                <label>Accounts</label>
                <parent>Marketing</parent>
                <state>1</state>
                <relatedlists>
                    <relatedlist>
                        <function>get_related_list</function>
                        <label>NewModule</label>
                        <sequence>0</sequence>
                        <presence>0</presence>
                        <actions>
                            <action>ADD</action>
                            <action>SELECT</action>
                        </actions>
                        <relatedmodule>NewModule</relatedmodule>
                    </relatedlist>
                </relatedlists>
                <prepareview>
                    <sourcecode>
                        <![CDATA[
                            function prepareEditView_NewModule($focus, $request, $smarty) {
      
                                $sourceModule = $request['sourceModule'];
                                $sourceRecordId = $request['sourceRecord'];
    
                                if (!empty($sourceRecordId) && $sourceModule == 'Accounts' ) {
                                    //Подключаем Модуль-источник
                                    require_once ("modules/$sourceModule/$sourceModule.php");                
                                    $sourceFocus = new $sourceModule();
                                    $sourceFocus->id = $sourceRecordId; 
                                    $sourceFocus->retrieve_entity_info($sourceRecordId, $sourceModule);
          
                                    //Заполняем поля текущего Модуля     
                                    $focus->set('nm_status', 'Активно');
                                    $focus->set('name', $sourceFocus->column_fields['account_no']);               
                                }
                                return $focus;
                            }
                        ]]>
                    </sourcecode>
                    <language>php</language>
                </prepareview>
            </module>
        </modules>
    </configuration>
</configurations>

Создание программного обработчика

C процессом создания программного обработчика Вы можете ознакомится в статье «Создание программного обработчика». Ниже рассмотрен пример аналогичный примеру, который представлен в данной статье.
В качестве примера следует создать Обработчик, в котором предусмотрена программная Задача, осуществляющая перенос значения поля “Дата” из текущей записи Модуля “NewModule” в связанную с данным Модулем карточку Заказа в поле “Срок оплаты”.


Используемые теги в файле конфигурации


Описание XML-файла конфигурации

<configurations>
    <configuration>
        <uid>conf_newmodule</uid>
        <name>conf_newmodule</name>
        <language>ru_ru</language>
        <modules>
            <module>
                <name>NewModule</name>
                <label>NewModule</label>
                <parent>Tools</parent>
                <state>1</state>
       	        <workflows>
                    <workflow>
                        <summary>Перенос значение поля Дата</summary>
                        <conditions>
                            <![CDATA[[{"fieldname":"nm_status","operation":"is","value":"\u0410\u043a\u0442\u0438\u0432\u043d\u043e",                
                            "valuetype":"rawtext","joincondition":"","groupjoin":"and","groupid":"0"}]]]>
                        </conditions>
                        <executioncondition>3</executioncondition>
                        <tasks>
                            <task>
                                <type>VTEntityMethodTask</type>
                                <summary><![CDATA[Перенос значение поля Дата]]></summary>
                                <object>
                                    <![CDATA[O:18:"VTEntityMethodTask":7:{s:18:"executeImmediately";b:1;s:10:"workflowId";i:#workflowId#;s:7:"summary";s:49:"Перенос значение 
                                    поля Дата";s:6:"active";b:1;s:7:"trigger";N;s:10:"methodName";s:15:"UpdateOrderDate";s:2:"id";i:#taskId#;}]]>
                                </object>
                                <method>
                                    <name><![CDATA[UpdateOrderDate]]></name>
                                    <language><![CDATA[php]]></language>
                                    <sourcecode>
                                        <![CDATA[
                                            require_once('modules/com_vtiger_workflow/VTWorkflowUtils.php');
 
                                            function UpdateOrderDate($ws_entity){
                                                // WS id
                                                $ws_id = $ws_entity->getId();
                                                $module = $ws_entity->getModuleName();
                                                if (empty($ws_id) || empty($module)) {
                                                    return;
                                                }
    
                                                // CRM id
                                                $crmid = vtws_getCRMEntityId($ws_id);
                                                if ($crmid <= 0) {
                                                    return;
                                                }
    
                                                //получение объекта со всеми данными о текущей записи Модуля "NewModule"
                                                $myModuleInstance = Vtiger_Record_Model::getInstanceById($crmid);    
    
                                                //получение id Заказа
                                                $soId = $myModuleInstance->get('salesorderid');
    
                                                if($soId) {
                                                    //получение Даты текущей записи Модуля "NewModule"
                                                    $date = $myModuleInstance->get('nmdate');
        
                                                    //получение объекта со всеми данными о текущей записи Модуля "Заказ"        
                                                    $soInstance = Vtiger_Record_Model::getInstanceById($soId);  
        
                                                    //объект в режиме редактирования          
                                                    $soInstance->set('mode', 'edit');
        
                                                    //запись Даты в поле “Срок оплаты”
                                                    $soInstance->set('duedate', $date);
 
                                                    //сохранение
                                                    $soInstance->save();
                                                }
                                            }                      
                                        ]]>
                                    </sourcecode>
                                </method>
                            </task>
                        </tasks>
                    </workflow>  
                </workflows>
            </module>
        </modules>
    </configuration>
</configurations>

Смс-провайдер


Провайдер СМС-услуг - это компания, предоставляющая услуги по отправке/приёму СМС-сообщений.


Используемые теги в файле конфигурации


Описание XML-файла конфигурации

<configurations>
    <configuration>
        <uid>conf_newmodule</uid>
        <name>conf_newmodule</name>
        <language>ru_ru</language>
        <smsnotifiers>
            <smsnotifier>
                <username>test</username>
                <password>test</password>
                <providertype>VESMSru</providertype>
                <active>1</active>
                <parameters><![CDATA[{"LBL_SMS_SENDER_VESMSru":"Test"}]]></parameters>               
            </smsnotifier>     
        </smsnotifiers>  
    </configuration>
</configurations>

Создание задачи планировщика

В статье «Создание задачи планировщика» Вы можете ознакомится с процессом создания задачи планировщика. Ниже рассмотрен пример аналогичный примеру, который представлен в данной статье.
Необходимо создать задачу Планировщика для Модуля “NewModule”, который будет осуществлять отправку поздравления “С Днем Рождения” в виде смс-сообщения на мобильный телефон Контактам, у которых в этот день День рождения. Задача Планировщика должна запускаться один раз в сутки, выбирая всех Контактов, у которых День рождения, и отправлять им сообщения.


Используемые теги в файле конфигурации


Описание XML-файла конфигурации

<configurations>
    <configuration>
        <uid>conf_newmodule</uid>
        <name>conf_newmodule</name>
        <language>ru_ru</language>
        <modules>      
            <module>
                <name>NewModule</name>
                <label>NewModule</label>
                <parent>Tools</parent>
                <state>1</state>
                <crons>
                    <cron>
                        <name>MyTask</name>
                        <handler>cron/MyTask.service</handler>
                        <frequency>86400</frequency>
                        <status>1</status>
                        <sourcecode>
                            <![CDATA[
                                include_once 'modules/SMSNotifier/SMSNotifier.php';
                                global $adb; 
                                $Result_Contacts = $adb->query("SELECT * FROM vtiger_contactdetails
                                                                INNER JOIN vtiger_crmentity ON vtiger_contactdetails.contactid=vtiger_crmentity.crmid
                                                                INNER JOIN vtiger_contactsubdetails ON vtiger_contactdetails.contactid=vtiger_contactsubdetails.contactsubscriptionid
                                                                WHERE vtiger_crmentity.deleted=0 and '".date("d")."' = (SELECT EXTRACT(DAY FROM birthday) AS vtiger_contactsubdetails) 
                                                                      and '".date("m")."' = (SELECT EXTRACT(MONTH FROM birthday) AS vtiger_contactsubdetails)");  
 
                                //получение номеров телефонов Контактов
                                $record_count = $adb->num_rows($Result_Contacts); 
                                $tel_array = array();                   
                                for($i=0;$i<$record_count;$i++) {
                                    $tel_array[$i] = $adb->query_result($Result_Contacts,$i,'mobile');
                                }
 
                               //отправка сообщений
                               SMSNotifier::sendsms("DR", $tel_array, false, false, false);
                           ]]>
                       </sourcecode>
                       <language>php</language>
                   </cron>
               </crons>                
           </module>
       </modules> 
   </configuration>
</configurations>

Создание программного отчета

C процессом создания отчета Вы можете ознакомится в статье «Создание программного отчета». Ниже рассмотрен пример аналогичный примеру, который представлен в данной статье.
Необходимо создать программный отчет “Тестовый отчет” в директории “Тестовые отчеты” следующего вида:

Структура отчета
Количество Контрагентов Количество Контактов
5 6

Реализовать фильтрацию.


Используемые теги в файле конфигурации

Обязательные теги для секции <customreports>:
<name> - имя отчета.</p>
<sourcecode> - исходный код отчета.
<language> - язык отчета, должен быть php.
<primarymodule> - основной модуль, к которому принадлежит отчет. Данный параметр влияет на доступные “из коробки” фильтры для данного отчета. В нашем примере выбран модуль “Accounts” - соответственно будут доступны все фильтры как в обычном отчете для модуля “Accounts”.
<identifier> - уникальный идентификатор отчета. Обычно идентификатор отчета совпадает с именем класса в исходном коде.
<type> - дубликат идентификатора отчета, должен с ним совпадать. Дубликат идентификатора отчета необходим для размещения служебной информации по всем отчетам в системе.
Необязательные теги для секции <customreports>:
<functionname> - имя функции.
<state> (SAVE/CUSTOM).
<filters> - фильтры, которые будут отображаться и применять по умолчанию при открытии отчета.
Описание секции <filters>:
<andFilters> - фильтры, соответствующие логическому “и” (все условия должны выполняться).
<orFilters> - фильтры, соответствующие логическому “или” (хотя бы одно условие должно выполняться).
Данные секции могут содержать 0 или более фильтров (тег <filter>).
Описание тега <filter>:
<columnname> - имя колонки таблицы, к которой принадлежит фильтр.
<module> - модуль, к которому принадлежит фильтр.
<label> - отображаемое имя фильтра.
<fieldname> - имя поля, соответствующее фильтру.
<datatype> - тип данных (строка, дата, число и т.п.), соответствующий данному фильтру. Влияет на доступные условия фильтрации (больше чем, начиная с и т.п.).
<comparator> - используемое условие фильтрации по умолчанию (больше, меньше и т.п.).
<value> - сравниваемое значение.


Описание XML-файла конфигурации

<configurations>
    <configuration>
        <uid>1.0.0</uid>
	<name></name>
	<language>ru_ru</language>
	<customreportfolders>
    	    <customreportfolder>
                <name>Специализированные отчеты</name>
        	<description></description>
        	<state>CUSTOMIZED</state>
        	<customreports>
            	    <customreport>
                        <name>Тестовый отчет</name>
                        <functionname>TestReport</functionname>
                	<sourcecode>
                            <![CDATA[
                                class TestReport extends AbstractCustomReportModel {
                                    public function getChartsViewControlData() {
                                        return array(Reports_CustomReportTypes_Model::TABLE => array(),
                                                     Reports_CustomReportTypes_Model::PIE => array(
                                                         'group' => array('sp_delay_level' => 'Уровень просрочки',),
                                                         'agregate' => array('treatments_count' => 'Количество задач')
                                                     ),
                                                     Reports_CustomReportTypes_Model::LINEAR=> array(
                                                         'group' => array('sp_delay_level' => 'Уровень просрочки',),
                                                         'agregate' => array('treatments_count' => 'Количество задач')
                                                     ),
                                                     Reports_CustomReportTypes_Model::BARCHART => array(
                                                         'group' => array('sp_delay_level' => 'Уровень просрочки',),
                                                         'agregate' => array('treatments_count' => 'Количество задач')
                                                     )
                                        );
                                    }
 
                                    protected function getCalculationData($outputFormat = 'PDF') {
                                        global $adb;
                                        $sql = $this->getFilterSql();
                                        error_log("Filter - " . $sql);
                                        if ($sql == '') { 
                                            // Подготовка данных для заполнения таблицы отчета
                                            $Quantity_Accounts = $adb->query("SELECT COUNT(*) AS Count_Accounts FROM vtiger_account
                                                INNER JOIN vtiger_crmentity ON vtiger_account.accountid=vtiger_crmentity.crmid
                                                    WHERE vtiger_crmentity.deleted=0");
                                            $Quantity_Contacts = $adb->query("SELECT COUNT(*) AS Count_Contacts FROM vtiger_contactdetails
                                                INNER JOIN vtiger_crmentity ON vtiger_contactdetails.contactid=vtiger_crmentity.crmid
                                                    WHERE vtiger_crmentity.deleted=0");               
                                        } else {
                                            $Quantity_Accounts = $adb->query("SELECT COUNT(*) AS Count_Accounts FROM vtiger_account
                                                INNER JOIN vtiger_crmentity ON vtiger_account.accountid=vtiger_crmentity.crmid
                                                    WHERE vtiger_crmentity.deleted=0 AND {$sql}"); 
                                            $Quantity_Contacts = $adb->query("SELECT COUNT(*) AS Count_Contacts FROM vtiger_contactdetails
                                                INNER JOIN vtiger_crmentity ON vtiger_contactdetails.contactid=vtiger_crmentity.crmid  
                                                INNER JOIN vtiger_account ON vtiger_contactdetails.accountid=vtiger_account.accountid
                                                    WHERE vtiger_crmentity.deleted=0 AND {$sql}");
                                        }
                                        $quantity_Accounts = $adb->query_result($Quantity_Accounts, 0, 0);
                                        $quantity_Contacts = $adb->query_result($Quantity_Contacts, 0, 0);
                              
                                        if ($this->getViewTypeName() === Reports_CustomReportTypes_Model::TABLE) {
                                            return [
                                                [$quantity_Accounts, $quantity_Contacts],
                                            ];
                                        } else if ($this->getViewTypeName() === Reports_CustomReportTypes_Model::PIE) {
                                            return [
                                                'values' => [$quantity_Accounts, $quantity_Contacts],
                                                'labels' => ['A', 'B'],
                                                'data_labels' => ['Q', 'W']
                                            ];
                                        } else {
                                            return [
                                                'values' => [[$quantity_Accounts, $quantity_Contacts]],
                                                'labels' => ['A'],
                                                'data_labels' => ['Q','W']
                                            ];
                                        }
                                    }
 
                                    protected function getLabels($outputFormat = 'PDF') {
                                        return array("Количество Контрагентов", "Количество Контактов");
                                    }
                                }                                
                            ]]>
                        </sourcecode>
                	<language>php</language>
                	<primarymodule>Accounts</primarymodule>  
                	<identifier>TestReport</identifier>
                	<type>TestReport</type>
                	<state>CUSTOM</state>                   
                    </customreport>
                </customreports>
           </customreportfolder>
       </customreportfolders>
    </configuration>
</configurations>
Личные инструменты
Пространства имён
Варианты
Действия
Навигация
Документация
Разработчикам
Присоединяйтесь!
Инструменты