Création de liaison entre plusieurs objets sous SugarCRM 4.2
La création d’une liaison au travers d’une nouvelle table de liaisons au sein de SugarCRM nécessite quelques modifications au cœur du code source, cette opération ne pouvant être faite directement au travers de l’interface.
L’exemple suivant permet de créer une liaison entre une affaire (opportunity) et une autre affaire (opportunity).
1/ Création du fichier de MetaData
Un fichier de MetaData « opportunities_opportunitiesMetaData.php » doit être créé dans le répertoire /metadata/ afin de déclarer la table de liaison.
La déclaration se fait sous forme de tableau associatif contenant l’ensemble de la description de la liaision : son nom, ses champs (avec le type) et ses index.
Cette déclaration permet aussi de définir la façon dont la liaison fonctionne.
Ci-dessous la déclaration de la liaison « opportunities_opportunities » :
$dictionary[’opportunities_opportunities’] = array ( ‘table’ => ‘opportunities_opportunities’
, ‘fields’ => array (
array(’name’ =>’id’, ‘type’ =>’varchar’, ‘len’=>’36′)
, array(’name’ =>’opportunities_id’, ‘type’ =>’varchar’, ‘len’=>’36′, )
, array(’name’ =>’opportunities1_id’, ‘type’ =>’varchar’, ‘len’=>’36′,)
, array (’name’ => ‘date_modified’,'type’ => ‘datetime’)
, array(’name’ =>’deleted’, ‘type’ =>’bool’, ‘len’=>’1′, ‘default’=>’0′, ‘required’=>true)
) , ‘indices’ => array (
array(’name’ =>’opportunities_opportunitiespk’, ‘type’ =>’primary’, ‘fields’=>array(’id’))
, array(’name’ =>’opportunities1_idx’, ‘type’ =>’index’, ‘fields’=>array(’opportunities_id’))
, array(’name’ =>’opportunities2_idx’, ‘type’ =>’index’, ‘fields’=>array(’opportunities1_id’))
, array(’name’ => ‘opp1_opp2′, ‘type’=>’alternate_key’, ‘fields’=>array(’opportunities1_id’,'opportunities_id’))
)
, ‘relationships’ => array (’opportunities_opportunities’ => array(’lhs_module’=> ‘Opportunities’, ‘lhs_table’=> ‘opportunities’, ‘lhs_key’ => ‘id’,
‘rhs_module’=> ‘Opportunities’, ‘rhs_table’=> ‘opportunities’, ‘rhs_key’ => ‘id’,
‘relationship_type’=>’many-to-many’,
‘join_table’=> ‘opportunities_opportunities’, ‘join_key_lhs’=>’opportunities_id’, ‘join_key_rhs’=>’opportunities1_id’,
))
)
Si les deux cotés de la relation doivent être stockés en base de données, il suffit de remplacer dans le code ci-dessus :
‘join_table’=> ‘opportunities_opportunities’, ‘join_key_lhs’=>’opportunities_id’, ‘join_key_rhs’=>’opportunities1_id’,
par
‘join_table’=> ‘opportunities_opportunities’, ‘join_key_lhs’=>’opportunities_id’, ‘join_key_rhs’=>’opportunities1_id’, ‘reverse’=>’1′,
La structure « relationship » permet de spécifier d’où viennent les informations de liaisons :
Lhs_module : nom du module pour la partie gauche de la liaison
Lhs_table : nom de la table pour la partie gauche de la liaison
Lhs_key : nom de la clé pour la partie gauche de la liaison
Rhs_module : nom du module pour la partie droite de la liaison
Rhs_table : nom de la table pour la partie droite de la liaison
Rhs_key : nom de la clé pour la partie droite de la liaison
Relationship_type : type de relation, les valeurs possibles sont many-to-many, one-to-many…
Join_table : nom de la table de jointure, partie gauche et droite la clé de jointure
2/ Création de la table de jointure en base de données
La table de jointure doit être créée en base de données grâce à un script SQL de la forme :
DROP TABLE IF EXISTS `sugar42`.`opportunities_opportunities`;
CREATE TABLE `sugar42`.`opportunities_opportunities` (
`id` varchar(36) NOT NULL,
`opportunities_id` varchar(36) NOT NULL,
`opportunities1_id` varchar(36) NOT NULL,
`date_modified` datetime NOT NULL,
`deleted` tinyint(1) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `opportunities1_idx` (`opportunities_id`),
KEY `opportunities2_idx` (`opportunities1_id`),
KEY `opp1_opp2` (`opportunities1_id`,`opportunities_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
3/ Déclaration dans le dictionnaire de table
Afin que le fichier que nous venons de créer soit pris en compte, celui-ci doit être ajouter au fichier modules/TableDictionary.php sous la forme de l’instruction suivante :
include_once(”metadata/opportunities_opportunitiesMetaData.php”);
4/ Déclaration de la liaison possible dans vardefs.php du module concerné
Une nouvelle entrée dans le tableau associatif de description de dictionnaire du module concerné doit être ajoutée afin de rendre possible la liaison défini au préalable.
Cette modification s’effectue dans le fichier vardefs.php du module concerné (modules/Opportunities/vardefs.php pour notre exemple).
La modification est de la forme :
‘opportunities’ =>
array (
‘name’ => ‘opportunities_opportunities’,
‘type’ => ‘link’,
‘relationship’ => ‘opportunities_opportunities’,
’source’=>’non-db’,
‘module’=>’Opportunities’,
‘bean_name’=>’Opportunity’,
‘vname’=>’LBL_OPPORTUNITY’,
),
5/ Affichage du SubPanel dans le module souhaité
Afin de rendre possible la liaison, il est nécessaire d’afficher un nouveau SubPanel dans l’écran de List du module concerné.
Cet ajout s’effectue au travers d’un complément au tableau associatif $layout_defs[« Opportunities »] dans le fichier layout_defs.php du module.
Il est de la forme :
‘opportunities’ => array(
‘order’ => 50,
‘module’ => ‘Opportunities’,
’subpanel_name’ => ‘default’,
‘get_subpanel_data’ => ‘opportunities’,
‘add_subpanel_data’ => ‘opportunity_id’,
‘title_key’ => ‘LBL_OPPORTUNITIES_SUBPANEL_TITLE’,
‘top_buttons’ => array(
array(’widget_class’ => ‘SubPanelTopCreateButton’),
array(’widget_class’ => ‘SubPanelTopSelectButton’, ‘mode’=>’MultiSelect’)
),
‘refresh_page’=>1,
),
Le paramètre ‘refresh_page’ autorise le rafraichissement de la page appelante.
Il est également nécessaire de définir le titre du SubPanel dans le fichier de langue du module.
‘LBL_OPPORTUNITIES_SUBPANEL_TITLE’ => ‘Affaires’
Dans le fichier /modules/Opportunities/language/fr_FR.lang.php
6/ Avant d’exécuter les scripts de SugarCRM
Afin d’éviter tout plantage du au système de cache, il est nécessaire de reconstruire l’ensemble des relations.
Pour cela, sous SugarCRM, dans la partie Admin, cliquer sur le menu « réparations » et choisir « Reconstruire les relations ».
1 Comment so far
Leave a reply
Tout le monde a compris
?
Exercice à la prochaine (et première) soirée technique !!!
Merci vincent.