Skip to content

Instantly share code, notes, and snippets.

@dimaqw
Last active October 26, 2015 16:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dimaqw/922c6201e1788cafcef0 to your computer and use it in GitHub Desktop.
Save dimaqw/922c6201e1788cafcef0 to your computer and use it in GitHub Desktop.
Как добавить отношение между модулями
<?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