3

I'm running 6.5.8 Enterprise, and have been struggling with this.

I need to create a Many to Many relationship with Campaigns and Product Templates. However, studio can only seem to manage a One to One. I seem to have the relationship in okay, but cannot seem to get the subpanels working.

I have done the following:

1: Put a reference in custom/extension.application/ext/tabledictionary/campaigns_producttemplates.php:

include('custom/metadata/campaigns_producttemplatesMetaData.php');

2: Put the following in the above referenced file:

<?php// created: 2015-04-10 14:19:05
$dictionary["campaigns_producttemplates"] = array ( //The table name
  //'true_relationship_type' => 'many-to-many', //Relationship type
  'relationships' => 
  array (
    'campaigns_producttemplates' =>  //table name
    array (
      'lhs_module' => 'Campaigns', //Module name as per directory
      'lhs_table' => 'campaigns', //Table Name
      'lhs_key' => 'id', //should be id
      'rhs_module' => 'ProductTemplates', //Module name as per directory
      'rhs_table' => 'product_templates', //Table Name
      'rhs_key' => 'id', //should be id
      'relationship_type' => 'many-to-many', //Relationship type
      'join_table' => 'campaigns_producttemplates',//Table name
      'join_key_lhs' => 'campaign_id', //ID reference of the left side module 
      'join_key_rhs' => 'product_template_id', //ID reference of the right side module
    ),
  ),
  'table' => 'campaigns_producttemplates', //table name
  'fields' => 
  array (
    0 => 
    array (
      'name' => 'id', //ID is needed as a unique id
      'type' => 'varchar',
      'len' => 36,
    ),
    1 => 
    array (
      'name' => 'date_modified', //Required
      'type' => 'datetime',
    ),
    2 => 
    array (
      'name' => 'deleted', //Required
      'type' => 'bool',
      'len' => '1',
      'default' => '0',
      'required' => true,
    ),
    3 => 
    array (
      'name' => 'campaign_id', //Referenced as the above left key
      'type' => 'varchar',
      'len' => 36,
    ),
    4 => 
    array (
      'name' => 'product_template_id', //Referenced as the above right key
      'type' => 'varchar',
      'len' => 36,
    ),
  ),
  'indices' => 
  array (
    0 => 
    array (
      'name' => 'campaigns_producttemplatesspk', //Index for the primary key
      'type' => 'primary',
      'fields' => 
      array (
        0 => 'id',
      ),
    ),
    1 => 
    array (
      'name' => 'campaigns_producttemplates_alt', //Index for the foreign keys
      'type' => 'alternate_key',
      'fields' => 
      array (
        0 => 'campaign_id', //Change this to the left side key
        1 => 'product_template_id', //Change this to the right side key
      ),
    ),
  ),
);

3: Put the following in custom/extension/modules/campaigns/ProductTemplatesRelate.php

$dictionary['Campaign']['relationships']['producttemplates'] = array(    
'name'         => 'producttemplates',
'type'         => 'link', //Keep as this
'relationship' => 'campaigns_producttemplates', //Many to Many relationship table
'module'       => 'ProductTemplates',
'bean_name'    => 'ProductTemplates',
    'source'       => 'non-db', //Leave as is
    'vname'        => 'LBL_PRODUCTTEMPLATES',
);

4: Put the following in custom/extension/modules/campaigns/ext/layoutdefs/product_templates_subpanel.php

<?php 
$layout_defs['Campaigns']['subpanel_setup']['producttemplates'] = array(
    'order'             => 100,
    'module'            => 'ProductTemplates', //I believe this is the name of Subpanel Module's directory
    'get_subpanel_data' => 'product_templates', 
    'sort_order'        => 'asc',
    'sort_by'           => 'name',
    'subpanel_name'     => 'default',
    'title_key'         => 'LBL_PRODUCTTEMPLATES',
    'top_buttons'       => array (
        0 => array (
            'widget_class' => 'SubPanelTopSelectButton',
            'mode'         => 'MultiSelect',
        ),
    ),
);

5: Stuck the below in custom/modules/ProductTemplates/metadata/subpanels/default.php

<?php// created: 2013-11-07 08:42:31
$subpanel_layout['list_fields'] = array (
  'name' => 
  array (
    'type' => 'name',
    'link' => true,
    'vname' => 'LBL_NAME',
    'width' => '10%',
    'default' => true,
    'widget_class' => 'SubPanelDetailViewLink',
    'target_module' => NULL,
    'target_record_key' => NULL,
  ),
);

I've gotten this far by trial and error, and trying to piece stuff together from other posts and help articles, but can't get it any further.

I can confirm the following:

  • A relationship displays in studio

  • The subpanel displays with fields in Studio

  • My campaigns_producttemplates table exists in the database

  • A row exists in the relationships table in the database

The only log entry I can see is:

05/05/15 12:54:30 [1604][1][FATAL] Bad subpanel definition, it has incorrect value for get_subpanel_data property producttemplates

Any help would be greatly appreciated!

Star
  • 3,222
  • 5
  • 32
  • 48
Reisclef
  • 2,056
  • 1
  • 22
  • 25

1 Answers1

3

I figured out what my problem was after a lot of searching and testing:

Item 3:

<?php

$dictionary['Campaign']['fields']['campaigns_producttemplates'] = array(
    'name'         => 'campaigns_producttemplates',
    'type'         => 'link', //Keep as this
    'relationship' => 'campaigns_producttemplates', //Many to Many relationship table
    //'module'     => 'ProductTemplates',
    //'bean_name'      => 'ProductTemplate',
    'source'       => 'non-db', //Leave as is
    'vname'        => 'LBL_CAMPAIGN_PRODUCT_TEMPLATES_FROM_CAMPAIGNS_TITLE',
);

This needed to be 'fields', rather than 'relationships'.

And 4:

<?php

$layout_defs['Campaigns']['subpanel_setup']['campaigns_producttemplates'] = array(
    'order'             => 100,
    'module'            => 'ProductTemplates', //I believe this is the name of Subpanel Module's directory
    'get_subpanel_data' => 'campaigns_producttemplates', 
    'sort_order'        => 'asc',
    'sort_by'           => 'id',
    'subpanel_name'     => 'default',
    'title_key'         => 'LBL_PRODUCTTEMPLATES',
    'top_buttons'       => array (
        0 => array (
            'widget_class' => 'SubPanelTopSelectButton',
            'mode'         => 'MultiSelect',
        ),
    ),
);

I needed to ensure that I used the custom relationship to grab the data for the subpanel.

All working now.

Reisclef
  • 2,056
  • 1
  • 22
  • 25