Различия
Здесь показаны различия между двумя версиями данной страницы.
| — |
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> | ||