Программисты и разработчики задаются вопросом: "Как связать модули в Vtiger CRM между собой?". При этом, самая распространённая связь между модулями - это 1 ко многим.
Эта связь означает, что в карточке родительского (или основного) модуля присутствует поле, в котором вы можете выбрать нужную запись дочернего модуля. А в карточке дочернего модуля есть вкладка, при клике на которую вы можете увидеть все связанные с этой карточкой записи.
Таким образом, чтобы правильно организовать связь один ко многим в Vtiger CRM, нам надо проделать следующее действия:
- в первом модуле мы создаём поле, которое связывает нас с записью дочернего модуля;
- во втором модуле мы создаём связанный список, который позволит нам просматривать те записи, которые были выбраны через данное поле.
Иными словами, нам потребуются две функции. Их можно использовать в работе, например, когда вы пишете пользовательские функции или скрипты по созданию модуля. Их использование позволит вам быстро организовать связь "один ко многим" между двумя модулями.
public function createRelationship($module1, $module2, $fieldLabel)
{
include_once "vtlib/Vtiger/Module.php";
$block = 'LBL_CUSTOM_INFORMATION';
$module = Vtiger_Module::getInstance($module1);
$module1Class = Vtiger_Module::getClassInstance($module1);
$block1 = Vtiger_Block::getInstance($block, $module);
$columnName = "";
if ($actionRelatedList == true) {
$columnName = "cf_nrl_" . strtolower($module2) . rand(1, 1000) . "_id";
} else {
$columnName = "cf_" . strtolower($module2) . "_id";
}
$fieldName = $columnName;
$field1 = new Vtiger_Field();
$field1->label = $fieldLabel;
$field1->name = $fieldName;
$field1->table = $module1Class->table_name;
$field1->column = $fieldName;
$field1->generatedtype = 2;
$field1->columntype = "INT(10)";
$field1->uitype = 10;
$field1->typeofdata = "I~O";
$field1->quickcreate = 2;
$field1->sequence = 7;
$block1->addField($field1);
$field1->setRelatedModules(array($module2));
$block1->save($module);
return $field1->id;
}
Функция createRelationship позволяет нам создать в первом модуле (module1) поле, связанное со вторым модулем (module2), которое нам позволит выбирать нужные записи из второго модуля и связывать их с первым. Функция создаст поле в формате cf_potentials_id, где potentials - название связанного модуля. Поле будет создано в блоке LBL_CUSTOM_INFORMATION.
Функция принимает следующие параметры:
- module1 - главный модуль, в который будет добавлено поле со связанным модулем,
- module2 - модуль, с которым мы планируем сделать связь через данное поле,
- fieldLabel - как мы планируем назвать наше новое поле. Желательно название полей делать на английском и затем переводить его через файлы переводов.
После того, как мы сделали в нашем главном модуле связь со вторым модулем, то теперь во втором модуле мы должны видеть все записи, которые на данный момент к нему привязаны. Для этого нам потребуется вывести вкладку связанных списков, при клике на которую будут выведены нужные нам связанные записи. Сделать это можно через другую функцию:
/**
* @param $module1
* @param $module2
* @param $relListLabel
*/
public function addRelatedList($module1, $module2, $relListLabel, $actions)
{
include_once "vtlib/Vtiger/Module.php";
$module = Vtiger_Module::getInstance($module2);
$module->setRelatedList(Vtiger_Module::getInstance($module1), $relListLabel, $actions, "get_dependents_list");
}
Функция принимает в себя следующие параметры:
- module1 - модуль, в котором мы планируем вывести связанный список,
- module2 - модуль, в котором мы ранее создавали поле и который будет выводить связанные записи,
- relListLabel - заголовок списка, обычно оно совпадает с module2,
- actions - принимает массив действий, которые можно делать в списке. Например: array('add', 'select') - данный массив позволит добавлять новые и выбирать существующие записи в связанном списке.
Внимание! Используйте данные функции на свой страх и риск. И не забывайте делать бекапы данных перед их использованием. Изменения необратимы.
Если у вас остались вопросы, с удовольствием на них отвечу через форму обратной связи.