Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

ru:start:developers [2016/07/01 16:24] (текущий)
admin создано
Строка 1: Строка 1:
 +===== Разработчикам =====
  
 +Если вы владеете языком PHP, то можете менять интерфейс Дизайнера Бизнес-Процессов. \\
 +Такие изменения интерфейса доступны начиная с 6 версии CRM, поэтому,​ если вы все еще используете версию 5.4, то ничего не выйдет,​ так как в ней отсутствуют необходимые директории для создания файлов в рамках данной задачи.
 +
 +<WRAP center important 100%>
 +Важный момент:​ НЕ изменяйте никаких файлов,​ созданных ядром Дизайнера Бизнес-Процессов,​ так как при каждом обновлении они будут автоматически переписываться и, таким образом,​ вы потеряете все свои изменения.
 +</​WRAP>​
 +
 +Файлы ядра написаны на PHP и не шифруются.
 +
 +==== Добавление функций в пользовательские выражения ====
 +
 +This is the only interface existing also in the 5.4.0 version.
 +
 +Если вы хотите интегрировать в vTiger функцию,​ а ее размеры слишком велики для простого текстового поля, то вы можете ее отдельно.
 +
 +В VtigerCRM 5.4: Создайте новый файл в **modules/​Workflow2/​functions/​** с названием **<​individual>​.inc.php** \\
 +В VtigerCRM 6.x: Создайте новый файл в **modules/​Workflow2/​extends/​functions/​** с названием **<​individual>​.inc.php**
 +
 +Все функции с префиксом fix wf_ , которые вы напишите/​определите в этом файле, будут доступны для пользовательских выражений.
 +
 +**Не вносите изменений в файл core.inc.php** , так как функции,​ описанные в этом файле, запускаются с Дизайнером Бизнес-Процессов. \\
 +Но вы можете использовать этот файл как пример того, как должен выглядеть файл, созданный вами.
 +
 +
 +<WRAP center important 100%>
 +Если вы нарушите синтаксис PHP и интегрируете его с ошибкой,​ то Бизнес-Процесс не выполнится,​ потому что эти файлы включены в работу множества Задач!
 +</​WRAP>​
 +
 +Пример функции,​ которая интегрирована в ядро:
 +
 +<​Code>​
 +if(!function_exists("​wf_date"​)) {
 +    function wf_date($value,​ $interval, $format = "​Y-m-d"​) {
 +        if(empty($interval)) {
 +            $dateValue = strtotime($value);​
 +        } else {
 +            $dateValue = strtotime($interval,​ strtotime($value));​
 +        }
 + 
 +        return date($format,​ $dateValue);​
 +    }
 +}
 +</​Code>​
 +==== У вас есть модуль,​ который создает файлы, которые вы хотите интегрировать в Бизнес-Процесс?​ ====
 +
 +<WRAP center right info 30%>
 +Доступно только в версии VtigerCRM 6.x
 +</​WRAP>​
 +
 +PDFMaker и SQL-отчеты реализуются следующим образом:​
 +
 +Если вы создадите похожий модуль,​ то сможете создать другой interfacefile,​ который сможет прикреплять файлы к электронным письмам,​ хранить их как документы или просто использовать в любой Задаче,​ которая может так или иначе обрабатывать файлы.
 +
 +Файлы создаются в папке **modules/​Workflow2/​extends/​interfaceFiles/​** с названиями **<​individual>​.inc.php**.
 +
 +Этот файл должен включать в себя класс (Class), который находится по такому пути \Workflow\InterfaceFiles. \\
 +Для того, чтобы Дизайнер Бизнес-Процессов распознал ваш файл, он должен иметь такую структуру:​
 +
 +<​Code>​
 +<?php
 +namespace Workflow\Plugins\InterfaceFiles;​
 + 
 +class [ModuleName] extends \Workflow\InterfaceFiles {
 +    protected $title = '​[ModuleName]';​
 +    protected $key = '​[SanitizedModuleName]';​
 + 
 +    public function __construct() {
 +        if(!$this->​isModuleActive()) {
 +            return;
 +        }
 +    }
 + 
 +    /**
 +     * @var String $moduleName The module of the current Workflow
 +     * @return array -  array(
 +     ​* ​                  '​filekeyA'​ => 'File title of the first file from this module',​
 +     ​* ​                   ...
 +     ​* ​                 )
 +     *
 +     ​* ​     The file title will be shown in the task configurations.
 +     ​* ​     The filekey will be given to your _getFile and should uniquely identify the file you should generate
 +     */
 +    protected function _getAvailableFiles($moduleName) {
 +        $return = array();
 +        if(!$this->​isModuleActive()) {
 +            return $return;
 +        }
 + 
 +        /*
 +          This function must simple return an array, like this:
 +             ​array(
 +                '​filekeyA'​ => 'File title of this file'
 +             )
 + 
 +        */
 + 
 +        return $return;
 +    }
 + 
 +    /**
 +     * @var String $key - The fileKey you set in the _getAvailableFiles function
 +     * @var String $moduleName - The module from the given RecordID, which should be used to generate the file
 +     * @var Int $crmid - The ID of the Record, which should be used to generate the file
 +     * @return array - An Array with the following Structure
 +     ​* ​                 array(
 +     ​* ​                     '​path'​ => "<​temporarily path to the generated file>",​
 +     ​* ​                     '​type'​ => "<​mime type of the generated file>",​
 +     ​* ​                     '​name'​ => "<​filename of the generated file>"​
 +     ​* ​                 );
 +     * The filename will probably overwritten by some tasks,
 +     * but if not, it will be used to give this file to the user.
 +     */
 +    protected function _getFile($key,​ $moduleName,​ $crmid) {
 +        if(!$this->​isModuleActive()) {
 +            return false;
 +        }
 + 
 +        return array(
 +            '​path'​ => "<​temporarily path to the generated file>",​
 +            '​type'​ => "<​mime type of the generated file>",​
 +            '​name'​ => "<​filename of the generated file>"​
 +        );
 +    }
 + 
 +    public function isModuleActive() {
 +        return getTabid('​[moduleName]'​) && vtlib_isModuleActive('​[moduleName]'​);​
 +    }
 +}
 + 
 +// This will register this class in the Interface Registry
 +\Workflow\InterfaceFiles::​register('​[SanitizedModuleName]',​ '​\Workflow\Plugins\InterfaceFiles\[ModuleName]'​);​
 +
 +</​Code>​
 +==== Добавление опций для работы с Файлами,​ созданными Бизнес-Процессом ====
 +
 +После версий 600.0801 эта Задача будет интегрирована в каждую версию vTiger. \\
 +В данный момент функция присутствует только в блоке "​Интеграция PDFMaker"​.
 +
 +Добавьте файл с название **<​individual>​.inc.php** в папку **/​modules/​Workflow2/​extends/​fileactions/​**.
 +
 +Этот файл должен содержать класс (class), который извлекается из **\Workflow\FileAction**.
 +Этот класс должен содержать следующую структуру:​
 +
 +<​Code>​
 +<?php
 +namespace Workflow\Plugins\FileActions;​
 + 
 +class [IndividualNameA] extends \Workflow\FileAction {
 + 
 +    /**
 +     * @param String $moduleName - The module from the workflow, this action will be used
 +     * @return array - Returns an array with the Option, this file could provide:
 +     ​* ​                 array(
 +                             '​title'​ => '<​title of this FileAction (could be translated in lang Files)>',​
 +                             '​options'​ => $options
 +                        )
 + 
 +                        $options is also an array with configuration options,
 +                                 the User should input, if he choose this action
 +                        $options = array(
 +                              '<​configKeyA>'​ => array(
 +                                  '​type'​ => '<​templatefield|templatearea|picklist|checkbox>',​
 +                                  '​label'​ => '<​label show before this configuration option (could be translated)',​
 +                                  '​placeholder'​ => '<​placeholder of input field>,
 +                                    // if type = checkbox
 +                                    //  '​value'​ => 1
 +                                    // if type = picklist
 +                                    //  '​options'​ => array('​ID1'​ => '​value1',​ '​ID2'​ => '​value2',​ ...)
 +                              ),
 +                              ...
 +                          )
 +     */
 +    public function getActions($moduleName) {
 +        $return = array();
 + 
 +        return $return;
 +    }
 + 
 +    /**
 +     * @param array $configuration - Array with all configuration options, the user configure
 +     * @param string $filepath ​ - The temporarily filepath of the file, which should be transformed
 +     * @param string $filename ​ - The filename of this file
 +     * @param \Workflow\VTEntity $context - The Context of the Workflow
 +     * @param array $targetRecordIds
 +     * @return void
 +     */
 +    public function doAction($configuration,​ $filepath, $filename, $context, $targetRecordIds = array()) {
 + 
 +    }
 + 
 +}
 + 
 +\Workflow\FileAction::​register('​[SanitizedIndividualNameA]',​ '​\Workflow\Plugins\FileActions\[IndividualNameA]'​);​
 +</​Code>​
 +
 +==== Добавить тип поля для запроса значений от пользователя Add a FieldType for Request Values from User ====
 +
 +Вам необходимы поля, которые отсутствуют в стандартном наборе полей? \\
 +Вы можете интегрировать свои собственные типы полей!
 +
 +Добавьте файл с именем **<​individual>​.inc.php** в папку **/​modules/​Workflow2/​extends/​fieldtypes/​**.
 +
 +Файл должен содержать класс (class ), который извлекается из **\Workflow\Fieldtype**.
 +Класс должен содержать следующую структуру:​
 +
 +<​Code>​
 +<?php
 +namespace Workflow\Plugins\Fieldtypes;​
 + 
 +class [IndividualNameA] extends \Workflow\Fieldtype
 +{
 +    /**
 +     * Должен вернуть каждое текстовое поле, которому присвоен этот класс
 +     *
 +     * @param $moduleName - Название модуля Бизнес-Процесса,​ где будет выводиться поле
 +     * @return array - Массив со следующей структурой
 +     ​* ​                 array(
 +     ​* ​                     array(
 +                                '​id'​ => '<​uniqueFieldTypeID>',​
 +                                '​title'​ => '<​NameOfFieldType>',​
 +                                '​config'​ => $config
 +     ​* ​                     ), ...
 +     ​* ​                 )
 +                    $config - массив полей конфигурации,​ которые необходимо настроить из бэкэнда
 +     ​* ​                     Структура следующая:​
 +     ​* ​                     array(
 +     ​* ​                         '<​configKey>'​ => array(
 +                                    '​type'​ => '​[templatefield,​templatearea,​picklist,​checkbox]',​
 +     ​* ​                             '​label'​ => '<​label Of Configuration Input>',​
 +                                     // if type = checkbox
 +                                     // '​value'​ => 1
 +                                     // if type = picklist
 +                                     // '​options'​ => array('​ID1'​ => '​value1',​ '​ID2'​ => '​value2',​ ...)
 +     ​* ​                         ), ...
 +     ​* ​                     )
 +     *
 +     */
 +    public function getFieldTypes($moduleName) {
 +        $fields = array();
 + 
 +/*
 +Example:
 +        $fields[] = array(
 +            '​id'​ => '​reference',​
 +            '​title'​ => '​Referenz',​
 +            '​config'​ => array(
 +                '​reference'​ => array(
 +                    '​type'​ => '​picklist',​
 +                    '​label'​ => '​Referenz',​
 +                    '​options'​ => $relmodules,​
 +                )
 +            )
 +        );
 +*/
 + 
 +        return $fields;
 +    }
 + 
 + 
 +    /**
 +     * @param $data     - Config Array of this Input with the following Structure
 +     ​* ​                     array(
 +     ​* ​                         '​label'​ => 'Label the Function should use',
 +     ​* ​                         '​name'​ => 'The Fieldname, which should used as name attribute',​
 +     ​* ​                         '​config'​ => Key-Value Array with all configurations,​ done by admin
 +     ​* ​                     )
 +     * @param \Workflow\VTEntity $context - Current Record, which is assigned to the Workflow
 +     * @return array - The rendered content, shown to the user with the following structure
 +     ​* ​                 array(
 +     ​* ​                     '​html'​ => '<​htmlContentOfThisInputField>',​
 +     ​* ​                     '​javascript'​ => 'A Javascript executed after html is shown'
 +     ​* ​                 )
 +     *
 +     */
 +    public function renderFrontend($data,​ $context) {
 +        $html = '';​
 +        $script = '';​
 + 
 +        return array('​html'​ => $html, '​javascript'​ => $script);
 +    }
 +}
 + 
 +// Класс необходимо зарегистрировать
 +\Workflow\Fieldtype::​register('​[IndividualNameA]',​ '​\Workflow\Plugins\Fieldtypes\[IndividualNameA]'​);​
 +</​Code>​
 +==== Использование настраиваемых полей инвентаризации use custom Inventory Fields ====
 +
 +Если вы используете настраиваемые поля в Задаче Inventory, такие как Счет, Коммерческое предложение,​ то значения этих полей будут очищены при выполнении любого другого Бизнес-Процесса и вы не сможете взаимодействовать с ними из Дизайнера Бизнес-Процессов,​ если версия вашего vTiger ниже 600.0825. \\
 +
 +С этой версией вы сможете создавать файлы с именем “InventoryFields.inc.php” прямо в директории “extends”. \\
 +Эти файлы не будут переписаны во время обновления.
 +
 +В этом файле вы можете настраивать создаваемые вами поля и сохранять их при выполнении Бизнес-Процессов. \\
 +Этот файл **ОБЯЗАТЕЛЬНО ДОЛЖЕН** иметь следующую структуру:​ \\
 +По той причине,​ что этот файл будет включен в каждое выполнение Бизнес-Процесса во всех модулях Inventory, вы должны вносить изменения осторожно. \\
 +Любая ошибка в этом файле сделает выполнение любого Бизнес-Процесса невозможным.
 +
 +<​Code>​
 +<?php
 +/**
 + * You need to enter the following php structure
 + *
 + * return array(
 + ​* ​   '​tableCol'​ => array('​inventoryField'​ => '​FieldNameWithoutProductIndex',​ '​label'​ => 'Label of this field'​),​
 + * );
 + */
 +// Example:
 + 
 +return array(
 +    '​test'​ => array('​inventoryField'​ => '​testCol',​ '​label'​ => '​Testvalue'​),​
 +);
 +</​Code>​
 +
 +<​html>​
 +<table width="​100%"​ border="​1">​
 +<tr>
 +<td style="​padding:​5px;​background-color:#​D8D8D8">​tableCol</​td>​
 +<td style="​padding:​5px;">​Это имя колонки в таблице vtiger_inventoryproductrel. Не используется для чтения из БД, но подходит для использования как уникальное имя</​td>​
 +</tr>
 +<tr>
 +<td style="​padding:​5px;​background-color:#​D8D8D8;">​FieldNameWithoutProductIndex</​td>​
 +<td style="​padding:​5px;">​Это код значения в ProductsArray. Вы используете это значение в функции “getAssociatedProducts”</​td>​
 +</tr>
 +<tr>
 +<td style="​padding:​5px;​background-color:#​D8D8D8;">​Testvalue</​td>​
 +<td style="​padding:​5px;">​Является названием этого поля, которое будет показано в настройках Задачи</​td>​
 +</tr>
 +</​table>​
 +</​html>​