I have build a custom relationship manually and once I install the package I see the error on sugarcrm.log, do you know why, I have follow the documentation, is there anything that I need to do ?
I have build a custom relationship manually and once I install the package I see the error on sugarcrm.log, do you know why, I have follow the documentation, is there anything that I need to do ?
Can you share the custom metadata you added into extended vardefs and relationship as well?
Thank you
Rodrigo Manara
Sr. Developer
Hi Rodrigo Manara , I know it's been a long time but, did you solve this issue? As of my upgrade to v12 I am getting a similar error in my log and a subpanel has disappeared as a result.
Thank you,
FrancescaS
Hi Francesca Shiekh . This error pretty much is due to wrong relationship defined inside the field def for the link.
Can you share the vardefs having such defintions as well as the relationship metadata?
Thank you André Lopes
This is code that we've been dragging with us since we started using sugar in 2011, so it's very likely that something got left behind that is no longer acceptable...
Tue Oct 15 15:39:20 2024 [19175][1][FATAL] failed to find link for role_contacroles_contacts
custom/Extension/modules/Contacts/Ext/Vardefs/role_contact_roles_contacts_Contacts.php
<?php
// created: 2011-06-05 20:15:42
$dictionary["Contact"]["fields"]["role_contacroles_contacts"] = array (
'name' => 'role_contacroles_contacts',
'type' => 'link',
'relationship' => 'role_contact_roles_contacts',
'source' => 'non-db',
'vname' => 'LBL_ROLE_CONTACT_ROLES_CONTACTS_FROM_ROLE_CONTACT_ROLES_TITLE',
);
custom/Extension/modules/Contacts/Ext/Layoutdefs/role_contact_roles_contacts_Contacts.php
<?php
// created: 2011-06-05 20:15:42
$layout_defs["Contacts"]["subpanel_setup"]["role_contacroles_contacts"] = array (
'order' => 100,
'module' => 'role_Contact_Roles',
'subpanel_name' => 'default',
'sort_order' => 'asc',
'sort_by' => 'id',
'title_key' => 'LBL_ROLE_CONTACT_ROLES_CONTACTS_FROM_ROLE_CONTACT_ROLES_TITLE',
'get_subpanel_data' => 'role_contacroles_contacts',
'top_buttons' =>
array (
0 =>
array (
'widget_class' => 'SubPanelTopButtonQuickCreate',
//'widget_class' => 'SubPanelTopCreateButton',
),
// 1 =>
// array (
// 'widget_class' => 'SubPanelTopSelectButton',
// 'mode' => 'MultiSelect',
// ),
1 =>
array (
'widget_class' => 'SubPanelTopFilterInputButton',
),
),
);
?>
custom/Extension/modules/Contacts/Ext/clients/base/layouts/subpanels/role_contact_roles_contacts_Contacts.php
<?php
$viewdefs['Contacts']['base']['layout']['subpanels']['components'][] = array (
'label' => 'LBL_ROLE_CONTACT_ROLES_CONTACTS_FROM_ROLE_CONTACT_ROLES_TITLE',
'context' =>
array (
'link' => 'role_contacroles_contacts',
),
'layout' => 'subpanel',
);
$viewdefs['Contacts']['base']['layout']['subpanels']['components'][] = array (
'override_subpanel_list_view' =>
array (
'view' => 'subpanel-for-contacts',
'link' => 'role_contacroles_contacts',
),
);
custom/Extension/modules/role_Contact_Roles/Ext/Vardefs/role_contact_roles_contacts_role_Contact_Roles.php
<?php
$dictionary['role_Contact_Roles']['fields']['role_contacroles_contacts']['name'] = 'role_contacroles_contacts';
$dictionary['role_Contact_Roles']['fields']['role_contacroles_contacts']['type'] = 'link';
$dictionary['role_Contact_Roles']['fields']['role_contacroles_contacts']['relationship'] = 'role_contact_roles_contacts';
$dictionary['role_Contact_Roles']['fields']['role_contacroles_contacts']['source'] = 'non-db';
$dictionary['role_Contact_Roles']['fields']['role_contacroles_contacts']['vname'] = 'LBL_ROLE_CONTACT_ROLES_CONTACTS_FROM_CONTACTS_TITLE';
$dictionary['role_Contact_Roles']['fields']['role_contac_contacts_name']['name'] = 'role_contac_contacts_name';
$dictionary['role_Contact_Roles']['fields']['role_contac_contacts_name']['type'] = 'relate';
$dictionary['role_Contact_Roles']['fields']['role_contac_contacts_name']['source'] = 'non-db';
$dictionary['role_Contact_Roles']['fields']['role_contac_contacts_name']['vname'] = 'LBL_ROLE_CONTACT_ROLES_CONTACTS_FROM_CONTACTS_TITLE';
$dictionary['role_Contact_Roles']['fields']['role_contac_contacts_name']['save'] = true;
$dictionary['role_Contact_Roles']['fields']['role_contac_contacts_name']['id_name'] = 'role_conta552dontacts_ida';
$dictionary['role_Contact_Roles']['fields']['role_contac_contacts_name']['link'] = 'role_contacroles_contacts';
$dictionary['role_Contact_Roles']['fields']['role_contac_contacts_name']['table'] = 'contacts';
$dictionary['role_Contact_Roles']['fields']['role_contac_contacts_name']['module'] = 'Contacts';
$dictionary['role_Contact_Roles']['fields']['role_contac_contacts_name']['rname'] = 'name';
$dictionary['role_Contact_Roles']['fields']['role_contac_contacts_name']['db_concat_fields'][0] = 'first_name';
$dictionary['role_Contact_Roles']['fields']['role_contac_contacts_name']['db_concat_fields'][1] = 'last_name';
$dictionary['role_Contact_Roles']['fields']['role_conta552dontacts_ida']['name'] = 'role_conta552dontacts_ida';
$dictionary['role_Contact_Roles']['fields']['role_conta552dontacts_ida']['type'] = 'id';
$dictionary['role_Contact_Roles']['fields']['role_conta552dontacts_ida']['relationship'] = 'role_contact_roles_contacts';
$dictionary['role_Contact_Roles']['fields']['role_conta552dontacts_ida']['source'] = 'non-db';
$dictionary['role_Contact_Roles']['fields']['role_conta552dontacts_ida']['reportable'] = false;
$dictionary['role_Contact_Roles']['fields']['role_conta552dontacts_ida']['side'] = 'right';
$dictionary['role_Contact_Roles']['fields']['role_conta552dontacts_ida']['vname'] = 'LBL_ROLE_CONTACT_ROLES_CONTACTS_FROM_ROLE_CONTACT_ROLES_TITLE';
$dictionary['role_Contact_Roles']['fields']['role_conta552dontacts_ida']['link'] = 'role_contacroles_contacts';
$dictionary['role_Contact_Roles']['fields']['role_conta552dontacts_ida']['rname'] = 'id';
Thank you Francesca. I don't see the relationship metadata itself.
Sorry André Lopes where would that be defined?
It should be defined inside custom/metadata/. The name of the file may follow the relationship name itself.
Thank you! I never messed with that directory before :)
custom/metadata/role_contact_roles_contactsMetaData.php<?php
$dictionary['role_contact_roles_contacts'] = array (
'true_relationship_type' => 'one-to-many',
'relationships' =>
array (
'role_contact_roles_contacts' =>
array (
'lhs_module' => 'Contacts',
'lhs_table' => 'contacts',
'lhs_key' => 'id',
'rhs_module' => 'role_Contact_Roles',
'rhs_table' => 'role_contact_roles',
'rhs_key' => 'id',
'relationship_type' => 'many-to-many',
'join_table' => 'role_contacles_contacts_c',
'join_key_lhs' => 'role_conta552dontacts_ida',
'join_key_rhs' => 'role_conta48dct_roles_idb',
),
),
'table' => 'role_contacles_contacts_c',
'fields' =>
array (
'id' =>
array (
'name' => 'id',
'type' => 'varchar',
'len' => 36,
),
'date_modified' =>
array (
'name' => 'date_modified',
'type' => 'datetime',
),
'deleted' =>
array (
'name' => 'deleted',
'type' => 'bool',
'len' => '1',
'default' => '0',
'required' => true,
),
'role_conta552dontacts_ida' =>
array (
'name' => 'role_conta552dontacts_ida',
'type' => 'varchar',
'len' => 36,
),
'role_conta48dct_roles_idb' =>
array (
'name' => 'role_conta48dct_roles_idb',
'type' => 'varchar',
'len' => 36,
),
),
'indices' =>
array (
0 =>
array (
'name' => 'role_contacroles_contactsspk',
'type' => 'primary',
'fields' =>
array (
0 => 'id',
),
),
1 =>
array (
'name' => 'role_contacroles_contacts_ida1',
'type' => 'index',
'fields' =>
array (
0 => 'role_conta552dontacts_ida',
),
),
2 =>
array (
'name' => 'role_contacroles_contacts_alt',
'type' => 'alternate_key',
'fields' =>
array (
0 => 'role_conta48dct_roles_idb',
),
),
),
);
Thank you Francesca Shiekh . Find an updated code for your relationship
$dictionary["Contact"]["fields"]["role_contacroles_contacts"] = array ( 'name' => 'role_contacroles_contacts', 'type' => 'link', 'relationship' => 'role_contact_roles_contacts', 'source' => 'non-db', 'module' => 'role_Contact_Roles', 'bean_name' => 'role_Contact_Roles', 'vname' => 'LBL_ROLE_CONTACT_ROLES_CONTACTS_FROM_ROLE_CONTACT_ROLES_TITLE', 'id_name' => 'role_conta552dontacts_ida', 'link-type' => 'many', 'side' => 'left', ); $dictionary["role_Contact_Roles"]["fields"]["role_contacroles_contacts"] = array ( 'name' => 'role_contacroles_contacts', 'type' => 'link', 'relationship' => 'role_contact_roles_contacts', 'source' => 'non-db', 'module' => 'Contacts', 'bean_name' => 'Contact', 'side' => 'right', 'vname' => 'LBL_ROLE_CONTACT_ROLES_CONTACTS_FROM_CONTACTS_TITLE', 'id_name' => 'role_conta552dontacts_ida', 'link-type' => 'one', ); $dictionary["role_Contact_Roles"]["fields"]["role_contac_contacts_name"] = array ( 'name' => 'role_contac_contacts_name', 'type' => 'relate', 'source' => 'non-db', 'vname' => 'LBL_ROLE_CONTACT_ROLES_CONTACTS_FROM_CONTACTS_TITLE', 'save' => true, 'id_name' => 'role_conta552dontacts_ida', 'link' => 'role_contacroles_contacts', 'table' => 'contacts', 'module' => 'Contacts', 'rname' => 'name', 'db_concat_fields' => array ( 'first_name', 'last_name' ), ); $dictionary["role_Contact_Roles"]["fields"]["role_conta552dontacts_ida"] = array ( 'name' => 'role_conta552dontacts_ida', 'type' => 'id', 'source' => 'non-db', 'vname' => 'LBL_ROLE_CONTACT_ROLES_CONTACTS_FROM_ROLE_CONTACT_ROLES_TITLE', 'id_name' => 'role_conta552dontacts_ida', 'link' => 'contacts', 'table' => 'contacts', 'module' => 'Contacts', 'rname' => 'id', 'reportable' => false, 'side' => 'right', 'massupdate' => false, 'duplicate_merge' => 'disabled', 'hideacl' => true, ); $dictionary['role_contact_roles_contacts'] = array ( 'true_relationship_type' => 'one-to-many', 'relationships' => array ( 'role_contact_roles_contacts' => array ( 'lhs_module' => 'Contacts', 'lhs_table' => 'contacts', 'lhs_key' => 'id', 'rhs_module' => 'role_Contact_Roles', 'rhs_table' => 'role_contact_roles', 'rhs_key' => 'id', 'relationship_type' => 'many-to-many', 'join_table' => 'role_contacles_contacts_c', 'join_key_lhs' => 'role_conta552dontacts_ida', 'join_key_rhs' => 'role_conta48dct_roles_idb', ), ), 'table' => 'role_contacles_contacts_c', 'fields' => array ( 'id' => array ( 'name' => 'id', 'type' => 'varchar', 'len' => 36, ), 'date_modified' => array ( 'name' => 'date_modified', 'type' => 'datetime', ), 'deleted' => array ( 'name' => 'deleted', 'type' => 'bool', 'len' => '1', 'default' => '0', 'required' => true, ), 'role_conta552dontacts_ida' => array ( 'name' => 'role_conta552dontacts_ida', 'type' => 'varchar', 'len' => 36, ), 'role_conta48dct_roles_idb' => array ( 'name' => 'role_conta48dct_roles_idb', 'type' => 'varchar', 'len' => 36, ), ), 'indices' => array ( 0 => array ( 'name' => 'role_contacroles_contactsspk', 'type' => 'primary', 'fields' => array ( 0 => 'id', ), ), 1 => array ( 'name' => 'role_contacroles_contacts_ida', 'type' => 'index', 'fields' => array ( 0 => 'role_conta552dontacts_ida', 1 => 'deleted', ), ), 2 => array ( 'name' => 'role_contacroles_contacts_idb', 'type' => 'index', 'fields' => array ( 0 => 'role_conta48dct_roles_idb', 1 => 'deleted', ), ), 3 => array ( 'name' => 'role_contacroles_contacts_alt', 'type' => 'alternate_key', 'fields' => array ( 0 => 'role_conta48dct_roles_idb', ), ), ), );