Last active
October 26, 2015 16:04
-
-
Save dimaqw/922c6201e1788cafcef0 to your computer and use it in GitHub Desktop.
Как добавить отношение между модулями
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// Чтобы добавить отношение между двумя модулями в sugarcrm нужно описать это отношение в сооствествующем файле. | |
// Например что бы добавить связь между мудулями Звонки и Проекты заявок, нужно совершить следующие действия. | |
// | |
//Создать файл custom/Extension/modules/Calls/Ext/Vardefs/sl_<module_name>.php если его еще нет. | |
// на самом деле название файла может быть любое, но рекомендуется называть его таким образом, | |
// что бы было понятно что он создан не через студию и его можно править. | |
// В даном конкретном случае название файла может быть | |
// custom/Extension/modules/Calls/Ext/Vardefs/sl_calls.php либо sl_Сalls.php либо просто sl_vardefs.php | |
// в файле описать метаданные | |
//описать поле id | |
$dictionary['Call']['fields']['sl_req_project_id'] = array( | |
'type' => 'id', | |
'required' => false, | |
'name' => 'sl_req_project_id', | |
'vname' => 'LBL_SL_REQUEST_PROJECT', | |
'massupdate' => 0, | |
'comments' => '', | |
'help' => '', | |
'importable' => 'true', | |
'duplicate_merge' => 'disabled', | |
'duplicate_merge_dom_value' => 0, | |
'audited' => 0, | |
'reportable' => 0, | |
'len' => 36, | |
); | |
//Call - имя объекта (единственное число Call), а не модуля(множественное Calls) , для своих новых модулей рекомендуется назвать объекты и модули одинаково, | |
//во избежание путаници. | |
//то есть для модуля SL_Request_projects пишем | |
$dictionary['SL_Request_projects']['fields']['my_fild_name']; | |
//sl_req_project_id поле типа id которое будет хранится в таблице calls, | |
// обычно <module>_id, но так как oracle дает ограничение на количесво символов в названии объекта то можно указать другое, более-менее информативное название | |
//описать поле link | |
$dictionary['Call']['fields']['sl_req_project'] = array( | |
'name' => 'sl_req_project', | |
'type' => 'link', | |
'relationship' => 'sl_req_project_calls', | |
'source' => 'non-db', | |
'side' => 'right', | |
); | |
//sl_req_project обчно <object_name> то есть в единственном числе | |
// 'relationship' => 'sl_req_project_calls', <object_name>_<relate_module> | |
// обычно <object_name> в единственном числе, что подразумевает отношение один ко многим | |
// то есть один sl_req_project ко многим calls | |
// описать поле realte_name | |
$dictionary['Call']['fields']['sl_req_project_name'] = array( | |
'type' => 'relate', | |
'required' => false, | |
'name' => 'sl_req_project_name', | |
'source' => 'non-db', | |
'vname' => 'LBL_SL_REQUEST_PROJECT', | |
'save' => true, | |
'massupdate' => 0, | |
'comments' => '', | |
'help' => '', | |
'importable' => 'true', | |
'duplicate_merge' => 'disabled', | |
'duplicate_merge_dom_value' => '0', | |
'audited' => 1, | |
'reportable' => 0, | |
'len' => '255', | |
'quicksearch' => 'enabled', | |
'id_name' => 'sl_req_project_id', | |
'link' => 'sl_req_project', | |
'table' => 'sl_request_projects', | |
'module' => 'SL_Request_projects', | |
'join_name' => 'sl_req_project', | |
'rname' => 'name', | |
); | |
// sl_req_project_name название поля которое будет использоватся на формах, правки, просмотра и др. | |
// 'id_name' => 'sl_req_project_id', указываем id созданый ранее | |
// 'link' => 'sl_req_project', обычно <object_name> в единственном числе, что подразумевает отношение один ко многим | |
// то есть в модуле Calls хранится один sl_req_project | |
// 'table' => 'sl_request_projects', имя таблици связанного модуля | |
// 'join_name' => 'sl_req_project', будет исользоватся при построении запросов, важно что бы этот параметр тоже был меньше 30 символов | |
// если в модуле описано более одной связи на один и тот же связанный модуль, то параметр 'join_name' должен быть уникален для модуля | |
// например в модуле Платежное требование описано две ссылки на модуль Контрагенты - Заказчик и Плательщик, | |
// поэтому объявлно два разных параметра | |
... | |
'link' => 'payer', | |
'table' => 'accounts', | |
'module' => 'Accounts', | |
'join_name' => 'fin_payment_request_payer', | |
... | |
'link' => 'supplier', | |
'table' => 'accounts', | |
'module' => 'Accounts', | |
'join_name' => 'fin_payment_request_supplier', | |
... | |
//описать само отношение relationship | |
$dictionary['Call']['relationships']['sl_req_project_calls'] = array( | |
'lhs_module' => 'SL_Request_projects', //left ship module | |
'lhs_table' => 'SL_Request_projects', //left ship table | |
'lhs_key' => 'id', | |
'rhs_module' => 'Calls', //right ship module | |
'rhs_table' => 'calls', //right ship table | |
'rhs_key' => 'sl_req_project_id', // id который мы описали выше | |
'relationship_type' => 'one-to-many', | |
); | |
// 'sl_req_project_calls' то название которое мы указали выше, когда описывали поле link | |
//в другой модуль достаточно поместить толко link | |
$dictionary['SL_Request_projects']['fields']['calls'] = array( | |
'name' => 'calls', // здесь calls во множественном, так как у одного проекта их много | |
'type' => 'link', | |
'relationship' => 'sl_req_project_calls', // название связи такое же | |
'source' => 'non-db', | |
'side' => 'left', | |
); | |
// полсе выполненых действий сделать quick repair | |
// в результате sugar предложит выполнить инструкцию в базу данных для добавление нового столбца в таблицу calls | |
// также в таблицу relationships будет добавлена новая запись realtionship_name = 'sl_req_project_calls' | |
// В дальнейшем что бы обращатся к этому полю можно использовать методы класса Link | |
// предварительно подключив отношение | |
$sl_req_project->load_relationship('calls'); | |
$sl_req_project->calls->getBeans(); // Массив {SugarBean} Объектов Call связанных с данным проектом | |
$sl_req_project->calls->get(); // массив строк {string} id, занимает меньше места в памяти. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment