In Sugar CRM If you want to create one to many relatinship like in studio
then the following steps can be used.
Here there are 12 parts of code.
This will generate the relationship between passed modules and create subpanel of related module under the primary module
The All Parts are used like :
Part 1:
Here Accounts and PMX_ProcessTask are two modules
We are going to create one to many relationship from account to pmx_process task
so in this part two modules are passed in varibales as up $primarymodule & $secondarymodule
Part 2:
The variables created in first part will be used in part 2 and
This part will create the code for relationship file.
Part 3:
This part will format the php code.
Then this part will create the relationship file in custom/metadata directory of sugarcrm
Then this code will be written to relationship file.
Part 4:
This part will create one relationship file in custom/Extension/application/Ext/TableDictionary/
and then add one line of code in this file.
Part 5:
This part will create the php vardef code for primary module.
Then create a vardef file in custom/Extension/primarymodule/Ext/vardefs/.
Then the php code will be written to this file.
Part 6:
This part will create the php vardef code for secodary module.
Then create a vardef file in custom/Extension/secondarymodule/Ext/vardefs/.
Then the php code will be written to this file.
Part 7:
This part will create the code for creating subpanel of secodary module under the primary module.
Part 8:
This part will create one file in custom/Extension/primarymodule/Ext/Layoutdefs/ directory
Then The code generated for subpanel in part 8 will be added in created php file.
Part 9:
This part will create the one file in custom/Extension/primarymodule/Ext/Language/
Then this will add language variable code in this file.
Part 10:
This part will create the one file in custom/Extension/secondarymodule/Ext/Language/
Then this will add language variables code in this file.
Part 11:
This part will make relationship entry in relatinship table of sugarcrm.
Part 12:
All the files and its code is created in this 11 steps one by one.
Now this part will Repair and Rebuild the sugar crm so code will make changes to create the relationship and relationship will be
generated.
Then this part will rebuild the relationship in sugar crm.So the subpanel os secondary module is seen under the Primary Module.
Part 1:
$obj1 = new $beanList['Accounts']();
$primarymoduleLower = strtolower($obj1->module_name);
$primarymoduleUpper = $obj1->module_name;
$primarymoduletable = $obj1->table_name;
$obj2 = new $beanList['PMX_ProcessTask']();
$secondarymoduleLower = strtolower($obj2->module_name);
$secondarymoduleUpper = $obj2->module_name;
$secondarymoduletable = $obj2->table_name;
$relationshipName = $primarymoduleLower . "_" . $secondarymoduleLower;
$relationshipNameQuoted = "'" . $relationshipName . "'";
Part 2:
$relarray = array(
"'true_relationship_type'" => "'one-to-many',",
"'from_studio'" => true,
",'relationships'" =>
array(
"'" . $primarymoduleLower . "_" . $secondarymoduleLower . "'" =>
array(
"'lhs_module'" => "'" . $primarymoduleUpper . "',",
"'lhs_table'" => "'" . $primarymoduletable . "',",
"'lhs_key'" => "'id',",
"'rhs_module'" => "'" . $secondarymoduleUpper . "',",
"'rhs_table'" => "'" . $secondarymoduletable . "',",
"'rhs_key'" => "'id',",
"'relationship_type'" => "'many-to-many',",
"'join_table'" => "'" . $primarymoduleLower . "_" . $secondarymoduleLower . "',",
"'join_key_lhs'" => "'" . $primarymoduleLower . "_" . $secondarymoduleLower . $primarymoduleLower . "_ida',",
"'join_key_rhs'" => "'" . $primarymoduleLower . "_" . $secondarymoduleLower . $secondarymoduleLower . "_idb'",
),
),
"'table'" => "'" . $primarymoduleLower . "_" . $secondarymoduleLower . "',",
"'fields'" =>
array(
0 =>
array(
"'name'" => "'id',",
"'type'" => "'varchar',",
"'len'" => 36,
),
1 =>
array(
"'name'" => "'date_modified',",
"'type'" => "'datetime'",
),
2 =>
array(
"'name'" => "'deleted',",
"'type'" => "'bool',",
"'len'" => "'1',",
"'default'" => "'0',",
"'required'" => true,
),
3 =>
array(
"'name'" => "'" . $primarymoduleLower . "_" . $secondarymoduleLower . $primarymoduleLower . "_ida',",
"'type'" => "'varchar',",
"'len'" => 36,
),
4 =>
array(
"'name'" => "'" . $primarymoduleLower . "_" . $secondarymoduleLower . $secondarymoduleLower . "_idb',",
"'type'" => "'varchar',",
"'len'" => 36,
),
),
"'indices'" =>
array(
0 =>
array(
"'name'" => "'" . $primarymoduleLower . "_" . $secondarymoduleLower . "spk',",
"'type'" => "'primary',",
"'fields'" =>
array(
0 => "'id'",
),
),
1 =>
array(
"'name'" => "'" . $primarymoduleLower . "_" . $secondarymoduleLower . "_ida1',",
"'type'" => "'index',",
"'fields'" =>
array(
0 => "'" . $primarymoduleLower . "_" . $secondarymoduleLower . $primarymoduleLower . "_ida'",
),
),
2 =>
array(
"'name'" => "'" . $primarymoduleLower . "_" . $secondarymoduleLower . "_alt',",
"'type'" => "'alternate_key',",
"'fields'" =>
array(
0 => "'" . $primarymoduleLower . "_" . $secondarymoduleLower . $secondarymoduleLower . "_idb'",
),
),
),
);
Part 3:
copy the array in txt file and remove [ and ] start
$ftext = fopen('test.txt', 'w');
fwrite($ftext, print_r($relarray, true));
$metadataString = file_get_contents('test.txt');
$metadataString = str_replace('[', '', $metadataString);
$metadataString = str_replace(']', '', $metadataString);
$metadataString = str_replace(')', '),', $metadataString);
$metadataStringToArray = substr(trim($metadataString), 0, -1);
fclose($ftext);
//copy the array in txt file and remove [ and ] End
$metadataFilename = $relationshipName . "MetaData.php";
$metadataString = "<?php $" . "dictionary[$relationshipNameQuoted]=";
$RelationshipMetadataFile = fopen('custom/metadata/' . $metadataFilename, 'w');
fwrite($RelationshipMetadataFile, $metadataString);
fwrite($RelationshipMetadataFile, $metadataStringToArray);
fwrite($RelationshipMetadataFile, ";");
fclose($RelationshipMetadataFile);
Part 4:
Add the metadata file include string to tabledictionary start
$tabledictionaryFileName = $relationshipName . ".php";
$RelationshipMetadataFile = fopen('custom/Extension/application/Ext/TableDictionary/' . $tabledictionaryFileName, 'w');
fwrite($RelationshipMetadataFile, " ");
fclose($RelationshipMetadataFile);
Part 5:
Primary module vardef file generation Start
$primaryModulevardefString = " '" . $relationshipName . "',
'type' => 'link',
'relationship' => '" . $relationshipName . "',
'source' => 'non-db',
'side' => 'right',
'vname' => 'LBL_" . strtoupper($relationshipName) . "_FROM_" . strtoupper($secondarymoduleUpper) . "_TITLE',
);";
$primarymodulevardefFile = 'custom/Extension/modules/' . $primarymoduleUpper . '/Ext/Vardefs/' . $relationshipName . '_' . $primarymoduleUpper . '.php';
$primarymodulevardefFile = fopen($primarymodulevardefFile, 'w');
fwrite($primarymodulevardefFile, $primaryModulevardefString);
fclose($primarymodulevardefFile);
Part 6:
Secondary module vardef file generation Start
$vardefStringSecondaryModule = " '" . $relationshipName . "',
'type' => 'link',
'relationship' => '" . $relationshipName . "',
'source' => 'non-db',
'vname' => 'LBL_" . strtoupper($relationshipName) . "_FROM_" . strtoupper($primarymoduleUpper) . "_TITLE',
'id_name' => '" . $relationshipName . $primarymoduleLower . "_ida',
);";
$vardefStringSecondaryModule.='$dictionary["' . $beanList[$secondarymoduleUpper] . '"]["fields"]["' . $relationshipName . '_name"] = ';
$vardefStringSecondaryModule .="array (
'name' => '" . $relationshipName . "_name',
'type' => 'relate',
'source' => 'non-db',
'vname' => 'LBL_" . strtoupper($relationshipName) . "_FROM_" . strtoupper($primarymoduleUpper) . "_TITLE',
'save' => true,
'id_name' => '" . $relationshipName . $primarymoduleLower . "_ida',
'link' => '" . $relationshipName . "',
'table' => '" . $primarymoduletable . "',
'module' => '" . $primarymoduleUpper . "',
'rname' => 'name',
);";
$vardefStringSecondaryModule.='$dictionary["' . $beanList[$secondarymoduleUpper] . '"]["fields"]["' . $relationshipName . $primarymoduleLower . '_ida"] = ';
$vardefStringSecondaryModule.="array (
'name' => '" . $relationshipName . $primarymoduleLower . "_ida',
'type' => 'link',
'relationship' => '" . $relationshipName . "',
'source' => 'non-db',
'reportable' => false,
'side' => 'right',
'vname' => 'LBL_" . strtoupper($relationshipName) . "_FROM_" . strtoupper($secondarymoduleUpper) . "_TITLE',
);";
//Secondary module vardef file generation Start
$secondarymodulevardefFile = 'custom/Extension/modules/' . $secondarymoduleUpper . '/Ext/Vardefs/' . $relationshipName . '_' . $secondarymoduleUpper . '.php';
$secondarymodulevardefFile = fopen($secondarymodulevardefFile, 'w');
fwrite($secondarymodulevardefFile, $vardefStringSecondaryModule);
fclose($secondarymodulevardefFile);
Part 7:
subpanel under the primary module start
$primaryModuleSubpanelString = " 100,
'module' => '" . $secondarymoduleUpper . "',
'subpanel_name' => 'default',
'sort_order' => 'asc',
'sort_by' => 'id',
'title_key' => 'LBL_" . strtoupper($relationshipName) . "_FROM_" . strtoupper($secondarymoduleUpper) . "_TITLE',
'get_subpanel_data' => '" . $relationshipName . "',
'top_buttons' =>
array (
0 =>
array (
'widget_class' => 'SubPanelTopButtonQuickCreate',
),
1 =>
array (
'widget_class' => 'SubPanelTopSelectButton',
'mode' => 'MultiSelect',
),
),
);";
Part 8:
$primarymoduleLayoutdefsFile = 'custom/Extension/modules/' . $primarymoduleUpper . '/Ext/Layoutdefs/' . $relationshipName . '_' . $primarymoduleUpper . '.php';
$primarymoduleLayoutdefsFile = fopen($primarymoduleLayoutdefsFile, 'w');
fwrite($primarymoduleLayoutdefsFile, $primaryModuleSubpanelString);
fclose($primarymoduleLayoutdefsFile);
Part 9:
Primary module langugar file start
$primaryymoduleLanguageFile = 'custom/Extension/modules/' . $primarymoduleUpper . '/Ext/Language/en_us.custom' . $relationshipName . '.php';
$primaryymoduleLanguageFile = fopen($primaryymoduleLanguageFile, 'w');
fwrite($primaryymoduleLanguageFile, "<?php ");
$languagestring1 = "$" . "mod_strings['LBL_" . strtoupper($relationshipName) . "_FROM_" . strtoupper($secondarymoduleUpper) . "_TITLE'] = '" . $secondarymoduleUpper . "';";
fwrite($primaryymoduleLanguageFile, $languagestring1);
fclose($primaryymoduleLanguageFile);
Part 10:
Secondary module langugar file start
$secondarymoduleLanguageFile = 'custom/Extension/modules/' . $secondarymoduleUpper . '/Ext/Language/en_us.custom' . $relationshipName . '.php';
$secondarymoduleLanguageFile = fopen($secondarymoduleLanguageFile, 'w');
fwrite($secondarymoduleLanguageFile, "<?php ");
$languagestring2 = "$" . "mod_strings['LBL_" . strtoupper($relationshipName) . "_FROM_" . strtoupper($primarymoduleUpper) . "_TITLE'] = '" . $primarymoduleUpper . "';";
fwrite($secondarymoduleLanguageFile, $languagestring2);
fclose($secondarymoduleLanguageFile);
Part 11:
Insert the record in the relationship table Start
$rid = create_guid();
$ida = $primarymoduleLower . "_" . $secondarymoduleLower . $primarymoduleLower . "_ida";
$idb = $primarymoduleLower . "_" . $secondarymoduleLower . $secondarymoduleLower . "_idb";
$relatioshipQueary = "INSERT INTO `relationships`
(`id`, `relationship_name`, `lhs_module`, `lhs_table`, `lhs_key`, `rhs_module`, `rhs_table`, `rhs_key`, `join_table`, `join_key_lhs`, `join_key_rhs`, `relationship_type`, `relationship_role_column`, `relationship_role_column_value`, `reverse`, `deleted`)
VALUES('$rid', '$relationshipName', '$primarymoduleUpper', '$primarymoduleLower', 'id', '$secondarymoduleUpper', '$secondarymoduleLower', 'id', '$relationshipName', '$ida', '$idb', 'many-to-many', NULL, NULL, 0, 0)";
$db->query($relatioshipQueary);
Part 12:
Repair and Rebuild Relationship after all files are added Start
require_once("modules/Administration/QuickRepairAndRebuild.php");
$rac = new RepairAndClear();
$rac->repairAndClearAll(array('clearAll'), $moduleList, true, false);
$mod_strings = array_merge($mod_strings, return_module_language('en_us', 'Administration'));
include('modules/Administration/RebuildRelationship.php');