Complex MIGXdb configuration query

This is a hideously long query and I’d appreciate any help. Also, the post body is limited to 32000 characters so I need to split this into sections.

I’m struggling to configure MIGXdb for 4 database tables and the relationships between them. The tables are

  • events
  • experiences
  • packages
  • package_components

Events are unique, Events can offer multiple experiences, many Events can offer the same Experiences, Experiences offer a core set packages (which can be overriden by individual Events) and Packages are made up of Components.

Visually the tables look like

I configured a Custom Manager Page for Experiences and their core Packages (via a nested MIGXdb configuration). Each Experience (eg. guest, member, vip) can offer a number of Packages (eg. Gold, Silver, Bronze) and each Package should have multiple components (eg. parking pass, food, drinks, after party).

There is a second Custom Manager Page for Events which in addition to the main Event information (event_family, event_parent, event_title, event_date related_experiences etc.) should have a nested MIGXdb configuration to allow custom Packages (each with specfic Components) to be set.

This is an indication of how the CMP looks.

I had elements of this working individually but have since messed with the Schema in an attempt to build the system described above and am now stuck.

Details are below however I know there are multiple errors and elements left over from trying different versions.

Also, this is a massive question and I appreciate beyond the scope of what can reasonably be asked in the Community but I have to try.

If anyone can suggest a commercial route or bounty program that could resolve this please let me know. I did call a MODX Professional today but there was no answer from the studio.

Any help appreciated.

Thanks,

Chris

schema.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- schema for the venue package
    - global schema
        contains all required objects relating to the events (calendar), hospitality (packages) and related asset pool
    - naming conventions
        - database tables
            - separate package tables from core modx and other package tables with the following naming convention
            - <package>__<object> eg. venue__events
        - objects
            - from Doodles schema: <object class="Doodle" table="doodles" 
            - object class is singular, db table is plural eg.
                - class="Doodle" table="doodles" 
                - class="event" table="events" 
                - class="event_family" table="event_families" 
                - class="package" table="packages" 
-->
<model package="venue" baseClass="xPDOObject" platform="mysql" defaultEngine="INNODB" version="1.1">
    <!--
         _______________________________________________________________________
                             CALENDAR RELATED OBJECTS
         ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
    -->

    <!--
        define event object
    -->
    <object class="event" table="venue__events" extends="xPDOSimpleObject" >
        <!-- database table fields
            - note do not define the id field, it is created automatically
        -->

        <!-- event object elements -->
        <field key="event_title"                 dbtype="varchar" precision="150" phptype="string"   null="false" default="" index="index" />
        <field key="event_date"                  dbtype="datetime"                phptype="datetime" null="true"  default="1000-01-01 00:00:00" />
        <field key="rel_family_id"               dbtype="varchar" precision="30"  phptype="string"   null="false" default="" />
        <field key="rel_parent_id"               dbtype="varchar" precision="30"  phptype="string"   null="false" default="" />
        <field key="event_host"                  dbtype="varchar" precision="150" phptype="string"   null="false" default="" />
        <field key="event_host_img"              dbtype="varchar" precision="255" phptype="string"   null="false" default="" />
        <field key="event_guest"                 dbtype="varchar" precision="150" phptype="string"   null="false" default="" />
        <field key="event_guest_img"             dbtype="varchar" precision="255" phptype="string"   null="false" default="" />
        <field key="event_general_admission_url" dbtype="varchar" precision="255" phptype="string"   null="false" default="" />

        <!-- used by MIGX -->        
        <field key="deleted"    dbtype="tinyint" precision="1"  phptype="integer"  null="false" default="0" attributes="unsigned" />
        <field key="published"  dbtype="tinyint" precision="1"  phptype="integer"  null="false" default="0" attributes="unsigned" />
        <field key="pos"        dbtype="int"     precision="10" phptype="integer"  null="false" default="0" />

        <!-- good practice for tracking -->       
        <field key="createdon"  dbtype="datetime"                phptype="datetime" null="true"/>
        <field key="createdby"  dbtype="int"      precision="10" phptype="integer"  null="false" default="0" attributes="unsigned" />
        <field key="editedon"   dbtype="datetime"                phptype="datetime" null="true"/>
        <field key="editedby"   dbtype="int"      precision="10" phptype="integer"  null="false" default="0" attributes="unsigned" />
        
        <!-- track createdby and editedby -->
        <aggregate alias="CreatedBy" class="modUser" local="createdby"  foreign="id" cardinality="one" owner="foreign"/>
        <aggregate alias="EditedBy"  class="modUser" local="editedby"   foreign="id" cardinality="one" owner="foreign"/>

        <!-- join the event_families and event_parents tables to the events table which is defined in the event class above -->
        <aggregate alias="event_family"      class="event_family"      local="rel_family_id" foreign="id"           cardinality="one"  owner="foreign" /> 
        <aggregate alias="event_parent"      class="event_parent"      local="rel_parent_id" foreign="id"           cardinality="one"  owner="foreign" />

        <!-- also join package and package_component tables which are required as packages are nested inside the events cmp -->
        <aggregate alias="package"           class="package"           local="id"            foreign="rel_event_id" cardinality="many" owner="local" /> 

        <!-- is  this required? components relate to packages, not events -->
        <composite alias="package_component" class="package_component" local="id"            foreign="rel_package_id" cardinality="many" owner="local" />
    </object>


    <!-- define family object
         - prefix tables with package name to group and separate them from MODX core tables or tables created by other packages
    -->
    <object class="event_family" table="venue__event_families" extends="xPDOSimpleObject">
        <!-- available fields
            event_families # category of indirectly related events of the same type (football, concert, special, queenspark)
            -
            id int FK >- events.rel_family_id
            family_name varchar(50) # eg. football, concert, special, queenspark, christmas)
        -->

        <!-- parent object elements -->
        <field key="family_name" dbtype="varchar" precision="100" phptype="string" null="false" default="" />

        <!-- used by MIGX -->        
        <field key="deleted" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" />
        <field key="published" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" />
        <field key="pos" dbtype="int" precision="10" phptype="integer" null="false" default="0" />

        <!-- good practice for tracking -->       
        <field key="createdon" dbtype="datetime" phptype="datetime" null="true"/>
        <field key="createdby" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="0" />
        <field key="editedon" dbtype="datetime" phptype="datetime" null="true"/>
        <field key="editedby" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="0" />
        
        <!-- track createdby and editedby -->
        <aggregate alias="CreatedBy" class="modUser" local="createdby" foreign="id" cardinality="one" owner="foreign"/>
        <aggregate alias="EditedBy" class="modUser" local="editedby" foreign="id" cardinality="one" owner="foreign"/>

        <!-- link related tables
             - subordinate table (event_families) back to base table (events)
             - note 'id' is created automatically
        -->
        <aggregate  alias="event" class="event" local="id" foreign="rel_family_id" cardinality="one" owner="foreign" />  
    </object>

    <!-- define parent object
         - prefix tables with package name to group and separate them from MODX core tables or tables created by other packages
    -->
    <object class="event_parent" table="venue__event_parents" extends="xPDOSimpleObject">
        <!-- available fields
            event_parents # league name, tour name  - groups directly related events eg. UEFA Champ.League, Scot.Prem.League, SheeranMathematicsTour
            -
            id int FK >- events.rel_parent_id
            parent_name varchar(50)
        -->

        <!-- parent object elements -->
        <field key="parent_name" dbtype="varchar" precision="100" phptype="string" null="false" default="" />

        <!-- used by MIGX -->        
        <field key="deleted" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" />
        <field key="published" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" />
        <field key="pos" dbtype="int" precision="10" phptype="integer" null="false" default="0" />

        <!-- good practice for tracking -->       
        <field key="createdon" dbtype="datetime" phptype="datetime" null="true"/>
        <field key="createdby" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="0" />
        <field key="editedon" dbtype="datetime" phptype="datetime" null="true"/>
        <field key="editedby" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="0" />
        
        <!-- track createdby and editedby -->
        <aggregate alias="CreatedBy" class="modUser" local="createdby" foreign="id" cardinality="one" owner="foreign"/>
        <aggregate alias="EditedBy" class="modUser" local="editedby" foreign="id" cardinality="one" owner="foreign"/>

        <!-- link related tables
             - subordinate table (event_parents) back to base table (events)
             - note 'id' is created automatically
        -->
        <aggregate  alias="event" class="event" local="id" foreign="rel_parent_id" cardinality="one" owner="foreign" />  
    </object>


    <!--
         _______________________________________________________________________
                             HOSPITALITY RELATED OBJECTS
         ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
    -->

    <!-- define package object
         - prefix tables with package name to group and separate them from MODX core tables or tables created by other packages
    -->
    <object class="package" table="venue__packages" extends="xPDOSimpleObject" >
        <!-- event package elements -->
        <field key="rel_event_id" dbtype="varchar" precision="30" phptype="string" null="false" default="" />
        <field key="rel_experience_id" dbtype="varchar" precision="30" phptype="string" null="false" default="" />
        <field key="package_title" dbtype="varchar" precision="150" phptype="string" null="false" default="" index="index" />
        <field key="package_introtext" dbtype="varchar" precision="150" phptype="string" null="false" default="" index="index" />
        <field key="package_content" dbtype="varchar" precision="150" phptype="string" null="false" default="" index="index" />
        <field key="package_superhero_video" dbtype="varchar" precision="150" phptype="string" null="false" default="" index="index" />
        <field key="package_superhero_img" dbtype="varchar" precision="150" phptype="string" null="false" default="" index="index" />
        <field key="package_superhero_img_alt" dbtype="varchar" precision="150" phptype="string" null="false" default="" index="index" />
        <!-- not required going by funeral catalog options config
        <field key="package_components" dbtype="varchar" precision="150" phptype="string" null="false" default="" /> -->
        <field key="package_price" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
        <field key="package_booking_url" dbtype="varchar" precision="150" phptype="string" null="false" default="" />
        <field key="package_status" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
        <field key="package_data_capture" dbtype="varchar" precision="255" phptype="string" null="false" default="" />

        <!-- used by MIGX -->        
        <field key="deleted" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" />
        <field key="published" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" />
        <field key="pos" dbtype="int" precision="10" phptype="integer" null="false" default="0" />

        <!-- good practice for tracking -->       
        <field key="createdon" dbtype="datetime" phptype="datetime" null="true"/>
        <field key="createdby" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="0" />
        <field key="editedon" dbtype="datetime" phptype="datetime" null="true"/>
        <field key="editedby" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="0" />
        
        <!-- track createdby and editedby -->
        <aggregate alias="CreatedBy" class="modUser" local="createdby" foreign="id" cardinality="one" owner="foreign"/>
        <aggregate alias="EditedBy" class="modUser" local="editedby" foreign="id" cardinality="one" owner="foreign"/>

        <!-- link related tables
             - subordinate tables (venue__events and venue__experiences) back to base table (venue__packages)
        -->
        <aggregate alias="event"      class="event"      local="rel_event_id"      foreign="id" cardinality="one" owner="foreign" /> 
        <aggregate alias="experience" class="experience" local="rel_experience_id" foreign="id" cardinality="one" owner="foreign" /> 

        <!-- link related tables - is this required?
             - subordinate tables (venue__packages and venue__package_components) back to base table (venue__packages)
        -->
        <aggregate alias="package"    class="package"    local="rel_event_id"      foreign="id" cardinality="many" owner="local" /> 
        
        <!-- is this required? packages relate to events, not package components -->
        <aggregate alias="package_component" class="package_component" local="id" foreign="rel_package_id" cardinality="many" owner="local" /> 
    </object>


    <!-- define components object
         - prefix tables with package name to group and separate them from MODX core tables or tables created by other packages
    -->
    <object class="package_component" table="venue__package_components" extends="xPDOSimpleObject">
        <!-- parent object elements -->
        <field key="rel_package_id" dbtype="int" precision="11" phptype="integer" null="false" default=""/>
        <field key="component_name" dbtype="varchar" precision="100" phptype="string" null="false" default="" />
        <field key="component_introtext" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
        <field key="component_icon" dbtype="varchar" precision="150" phptype="string" null="false" default="" />
        <field key="component_icon_hex" dbtype="varchar" precision="6" phptype="string" null="false" default="" />

        <!-- used by MIGX -->        
        <field key="deleted" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" />
        <field key="published" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" />
        <field key="pos" dbtype="int" precision="10" phptype="integer" null="false" default="0" />

        <!-- good practice for tracking -->       
        <field key="createdon" dbtype="datetime" phptype="datetime" null="true"/>
        <field key="createdby" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="0" />
        <field key="editedon" dbtype="datetime" phptype="datetime" null="true"/>
        <field key="editedby" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="0" />
        
        <!-- track createdby and editedby -->
        <aggregate alias="CreatedBy" class="modUser" local="createdby" foreign="id" cardinality="one" owner="foreign"/>
        <aggregate alias="EditedBy" class="modUser" local="editedby" foreign="id" cardinality="one" owner="foreign"/>

        <!-- link related tables
             - subordinate table (package_components) back to base table (packages)
        -->
        <aggregate alias="package_component" class="package_component" local="rel_package_id" foreign="id" cardinality="one" owner="foreign" /> 
    </object>

    <!-- define experience object
         - prefix tables with package name to group and separate them from MODX core tables or tables created by other packages
    -->
    <object class="experience" table="venue__experiences" extends="xPDOSimpleObject" >
        <!-- event object elements -->
        <field key="experience_superhero_video"   dbtype="varchar" precision="150" phptype="string"  null="false" default="" index="index" />
        <field key="experience_superhero_img"     dbtype="varchar" precision="150" phptype="string"  null="false" default="" />
        <field key="experience_superhero_img_alt" dbtype="varchar" precision="150" phptype="string"  null="false" default="" />
        <field key="experience_title"             dbtype="varchar" precision="150" phptype="string"  null="false" default="" />
        <field key="experience_introtext"         dbtype="varchar" precision="255" phptype="string"  null="false" default="" />
        <!-- migx_experience_components are the default components for each experience, they can be overridden at the package level by package_component's -->
        <field key="migx_experience_components"   dbtype="varchar" precision="150" phptype="string"  null="false" default="" />
        <field key="experience_price"             dbtype="varchar" precision="10"  phptype="string"  null="false" default="" />
        <field key="experience_booking_url"       dbtype="varchar" precision="150" phptype="string"  null="false" default="" />
        <field key="experience_data_capture"      dbtype="varchar" precision="150" phptype="string"  null="false" default="" />
        <field key="rel_event_id"                 dbtype="int"     precision="10"  phptype="integer" null="false" default="" />
        <field key="rel_faq_id"                   dbtype="int"     precision="10"  phptype="integer" null="false" default="" />
        <field key="rel_testimonial_id"           dbtype="int"     precision="10"  phptype="integer" null="false" default="" />
        <field key="rel_gallery_id"               dbtype="int"     precision="10"  phptype="integer" null="false" default="" />
        <field key="rel_tour_id"                  dbtype="int"     precision="10"  phptype="integer" null="false" default="" />

        <!-- used by MIGX -->        
        <field key="deleted"   dbtype="tinyint" precision="1"  phptype="integer" attributes="unsigned" null="false" default="0" />
        <field key="published" dbtype="tinyint" precision="1"  phptype="integer" attributes="unsigned" null="false" default="0" />
        <field key="pos"       dbtype="int"     precision="10" phptype="integer" null="false" default="0" />

        <!-- good practice for tracking -->       
        <field key="createdon" dbtype="datetime"                phptype="datetime" null="true"/>
        <field key="createdby" dbtype="int"      precision="10" phptype="integer" attributes="unsigned" null="false" default="0" />
        <field key="editedon"  dbtype="datetime"                phptype="datetime" null="true"/>
        <field key="editedby"  dbtype="int"      precision="10" phptype="integer" attributes="unsigned" null="false" default="0" />
        
        <!-- track createdby and editedby -->
        <aggregate alias="CreatedBy" class="modUser" local="createdby" foreign="id" cardinality="one" owner="foreign"/>
        <aggregate alias="EditedBy"  class="modUser" local="editedby"  foreign="id" cardinality="one" owner="foreign"/>

        <!--
        <composite alias="event_family" class="event_family" local="rel_family_id" foreign="id" cardinality="many" owner="local" /> 
        <composite alias="event_parent" class="event_parent" local="rel_parent_id" foreign="id" cardinality="many" owner="local" />
        -->
    </object>
</model>

migxdb_events

{
  "formtabs":[
    {
      "MIGX_id":2,
      "caption":"Event data",
      "print_before_tabs":"0",
      "fields":[
        {
          "MIGX_id":17,
          "field":"rel_family_id",
          "caption":"Family",
          "description":"groups child events by family eg. football, concert, special, queenspark",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"listbox",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"@EVAL return 'select==||'.$modx->runSnippet('migxLoopCollection',array('packageName'=>'events','classname'=>'event_family','tpl'=>'@CODE:[[+family_name]]==[[+id]]','outputSeparator'=>'||','sortConfig'=>'[{\"sortby\":\"family_name\"}]'));",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":1
        },
        {
          "MIGX_id":14,
          "field":"rel_parent_id",
          "caption":"Parent",
          "description":"groups directly related events eg. UEFA Champ.League, Scot.Prem.League, SheeranMathematicsTour",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"listbox",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"@EVAL return 'select==||'.$modx->runSnippet('migxLoopCollection',array('packageName'=>'events','classname'=>'event_parent','tpl'=>'@CODE:[[+parent_name]]==[[+id]]','outputSeparator'=>'||','sortConfig'=>'[{\"sortby\":\"parent_name\"}]'));",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":2
        },
        {
          "MIGX_id":5,
          "field":"event_title",
          "caption":"Title",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":3
        },
        {
          "MIGX_id":6,
          "field":"event_date",
          "caption":"Date",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"date",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":4
        },
        {
          "MIGX_id":7,
          "field":"published",
          "caption":"Published",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"checkbox",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"yes==1",
          "default":"0",
          "useDefaultIfEmpty":"0",
          "pos":5
        },
        {
          "MIGX_id":8,
          "field":"event_host",
          "caption":"Host",
          "description":"If football enter the home team otherwise enter eg. artist name",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":6
        },
        {
          "MIGX_id":9,
          "field":"event_host_img",
          "caption":"Host image",
          "description":"If football enter the home team crest otherwise enter eg. artist logo",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"file",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":7
        },
        {
          "MIGX_id":10,
          "field":"event_guest",
          "caption":"Guest",
          "description":"If sports event enter the visiting team otherwise leave blank",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":8
        },
        {
          "MIGX_id":11,
          "field":"event_guest_img",
          "caption":"Guest image",
          "description":"If sports event enter the visiting team crest otherwise leave blank",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"file",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":9
        },
        {
          "MIGX_id":12,
          "field":"event_general_admission_url",
          "caption":"Ticket url",
          "description":"url of website to purchase tickets",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"url",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":10
        },
        {
          "MIGX_id":73,
          "field":"event_family_family_nameXXX <--- added XXX to original name",
          "caption":"Family Name (from event_family_family_name) XXX",
          "description":"this should be hidden, required to map family_name to rel_family_id?",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":11
        }
      ],
      "pos":1
    },
    {
      "MIGX_id":10,
      "caption":"(Tab) Caption - Packages",
      "print_before_tabs":"0",
      "fields":[
        {
          "MIGX_id":100,
          "field":"packages",
          "caption":"packages",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"migxdb",
          "validation":"",
          "configs":"migxdb_packages",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":1
        }
      ],
      "pos":2
    }
  ],
  "contextmenus":"update||duplicate||publish||unpublish||remove",
  "actionbuttons":"addItem",
  "columnbuttons":"",
  "filters":"",
  "extended":{
    "migx_add":"",
    "disable_add_item":"",
    "add_items_directly":"",
    "formcaption":"form caption - eeevents",
    "update_win_title":"Events | Hospitality Management",
    "win_id":"event",
    "maxRecords":"",
    "addNewItemAt":"top",
    "media_source_id":"",
    "multiple_formtabs":"",
    "multiple_formtabs_label":"",
    "multiple_formtabs_field":"",
    "multiple_formtabs_optionstext":"",
    "multiple_formtabs_optionsvalue":"",
    "actionbuttonsperrow":4,
    "winbuttonslist":"",
    "extrahandlers":"",
    "filtersperrow":4,
    "packageName":"venue",
    "classname":"event",
    "task":"",
    "getlistsort":"",
    "getlistsortdir":"",
    "sortconfig":[
      {
        "sortby":"event_date",
        "sortdir":"ASC"
      }
    ],
    "gridpagesize":"",
    "use_custom_prefix":"0",
    "prefix":"",
    "grid":"dragdrop",
    "gridload_mode":2,
    "check_resid":1,
    "check_resid_TV":"",
    "join_alias":"",
    "has_jointable":"yes",
    "getlistwhere":"",
    "joins":[
      {
        "alias":"event_family"
      },
      {
        "alias":"event_parent"
      },
      {
        "alias":"package"
      },
      {
        "alias":"package_component"
      }
    ],
    "hooksnippets":"",
    "cmpmaincaption":"Events",
    "cmptabcaption":"All events",
    "cmptabdescription":"create\/update\/delete",
    "cmptabcontroller":"",
    "winbuttons":"",
    "onsubmitsuccess":"",
    "submitparams":""
  },
  "permissions":{
    "apiaccess":"",
    "view":"",
    "list":"",
    "save":"",
    "create":"",
    "remove":"",
    "delete":"",
    "publish":"",
    "unpublish":"",
    "viewdeleted":"",
    "viewunpublished":""
  },
  "fieldpermissions":"",
  "columns":[
    {
      "MIGX_id":3,
      "header":"id",
      "dataIndex":"id",
      "width":20,
      "sortable":"false",
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":""
    },
    {
      "MIGX_id":8,
      "header":"Family (joined)",
      "dataIndex":"event_family_family_name",
      "width":"",
      "sortable":"false",
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":""
    },
    {
      "MIGX_id":9,
      "header":"Parent (joined)",
      "dataIndex":"event_parent_parent_name",
      "width":"",
      "sortable":"false",
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":""
    },
    {
      "MIGX_id":1,
      "header":"Title",
      "dataIndex":"event_title",
      "width":150,
      "sortable":true,
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":"this.textEditor"
    },
    {
      "MIGX_id":4,
      "header":"Date + Time",
      "dataIndex":"event_date",
      "width":"",
      "sortable":true,
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"this.renderDate",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":""
    },
    {
      "MIGX_id":2,
      "header":"Published",
      "dataIndex":"published",
      "width":"",
      "sortable":"false",
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"this.renderClickCrossTick",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":""
    },
    {
      "MIGX_id":6,
      "header":"Family (rel_family_id) (hideme)",
      "dataIndex":"rel_family_id",
      "width":"",
      "sortable":true,
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"this.get_family_name",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":"this.listboxEditor"
    },
    {
      "MIGX_id":7,
      "header":"Parent (rel_parent_id)  (hideme)",
      "dataIndex":"rel_parent_id",
      "width":"",
      "sortable":true,
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"this.get_parent_name",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":"this.listboxEditor"
    }
  ],
  "category":""
}

migxdb_packages

{
  "formtabs":[
    {
      "MIGX_id":8,
      "caption":"(Tab) Caption - Package",
      "print_before_tabs":"0",
      "fields":[
        {
          "MIGX_id":43,
          "field":"rel_event_id",
          "caption":"rel_event_id",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"listbox",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"@EVAL return 'select==||'.$modx->runSnippet('migxLoopCollection',array('packageName'=>'events','classname'=>'event','tpl'=>'@CODE:[[+event_title]]==[[+id]]','outputSeparator'=>'||','sortConfig'=>'[{\"sortby\":\"event_title\"}]'));",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":1
        },
        {
          "MIGX_id":44,
          "field":"rel_experience_id",
          "caption":"rel_experience_id",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"listbox",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"@EVAL return 'select==||'.$modx->runSnippet('migxLoopCollection',array('packageName'=>'experiences','classname'=>'experience','tpl'=>'@CODE:[[+experience_title]]==[[+id]]','outputSeparator'=>'||','sortConfig'=>'[{\"sortby\":\"experience_title\"}]'));",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":2
        },
        {
          "MIGX_id":22,
          "field":"package_package_title",
          "caption":"package_title",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":3
        },
        {
          "MIGX_id":23,
          "field":"package_introtext",
          "caption":"package_introtext",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"textarea",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":4
        },
        {
          "MIGX_id":24,
          "field":"package_content",
          "caption":"package_content",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"richtext",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":5
        },
        {
          "MIGX_id":25,
          "field":"package_components",
          "caption":"package_components",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"migxdb",
          "validation":"",
          "configs":"migxdb_package_components",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":6
        },
        {
          "MIGX_id":26,
          "field":"package_booking_url",
          "caption":"package_booking_url",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"url",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":7
        },
        {
          "MIGX_id":27,
          "field":"package_data_capture",
          "caption":"package_data_capture",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"url",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":8
        },
        {
          "MIGX_id":28,
          "field":"package_price",
          "caption":"package_price",
          "pos":9
        },
        {
          "MIGX_id":29,
          "field":"package_status",
          "caption":"package_status",
          "description":"",
          "description_is_code":"0",
          "inputTV":"migx_package_status",
          "inputTVtype":"",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":10
        },
        {
          "MIGX_id":30,
          "field":"package_superhero_img",
          "caption":"package_superhero_img",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"file",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":11
        },
        {
          "MIGX_id":31,
          "field":"package_superhero_img_alt",
          "caption":"package_superhero_img_alt",
          "pos":12
        },
        {
          "MIGX_id":32,
          "field":"package_superhero_video",
          "caption":"package_superhero_video",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"file",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":13
        }
      ],
      "pos":1
    }
  ],
  "contextmenus":"update||duplicate||publish||unpublish||remove",
  "actionbuttons":"addItem",
  "columnbuttons":"",
  "filters":"",
  "extended":{
    "migx_add":"",
    "disable_add_item":"",
    "add_items_directly":"",
    "formcaption":"packages form caption",
    "update_win_title":"Packages | Hospitality Management",
    "win_id":"migxdb_packages",
    "maxRecords":"",
    "addNewItemAt":"bottom",
    "media_source_id":"",
    "multiple_formtabs":"",
    "multiple_formtabs_label":"",
    "multiple_formtabs_field":"",
    "multiple_formtabs_optionstext":"",
    "multiple_formtabs_optionsvalue":"",
    "actionbuttonsperrow":4,
    "winbuttonslist":"",
    "extrahandlers":"",
    "filtersperrow":4,
    "packageName":"venue",
    "classname":"package",
    "task":"",
    "getlistsort":"",
    "getlistsortdir":"",
    "sortconfig":[
      {
        "sortby":"package_title",
        "sortdir":"ASC"
      }
    ],
    "gridpagesize":"",
    "use_custom_prefix":"0",
    "prefix":"",
    "grid":"dragdrop",
    "gridload_mode":2,
    "check_resid":1,
    "check_resid_TV":"",
    "join_alias":"",
    "has_jointable":"yes",
    "getlistwhere":"",
    "joins":[
      {
        "alias":"package"
      }
    ],
    "hooksnippets":"",
    "cmpmaincaption":"Packages (main caption)",
    "cmptabcaption":"All packages (tab caption)",
    "cmptabdescription":"create\/update\/delete",
    "cmptabcontroller":"",
    "winbuttons":"",
    "onsubmitsuccess":"",
    "submitparams":""
  },
  "permissions":{
    "apiaccess":"",
    "view":"",
    "list":"",
    "save":"",
    "create":"",
    "remove":"",
    "delete":"",
    "publish":"",
    "unpublish":"",
    "viewdeleted":"",
    "viewunpublished":""
  },
  "fieldpermissions":"",
  "columns":[
    {
      "MIGX_id":2,
      "header":"id",
      "dataIndex":"id",
      "width":20,
      "sortable":true,
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":"this.listboxEditor"
    },
    {
      "MIGX_id":9,
      "header":"Experience (joined)",
      "dataIndex":"experience_experience_title",
      "width":"",
      "sortable":"false",
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":""
    },
    {
      "MIGX_id":10,
      "header":"Event (joined)",
      "dataIndex":"event_event_title",
      "width":"",
      "sortable":"false",
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":""
    },
    {
      "MIGX_id":3,
      "header":"package_package_title",
      "dataIndex":"package_title",
      "width":"",
      "sortable":true,
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":""
    },
    {
      "MIGX_id":5,
      "header":"published",
      "dataIndex":"published",
      "width":"",
      "sortable":true,
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"this.renderClickCrossTick",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":""
    },
    {
      "MIGX_id":8,
      "header":"rel_experience_id",
      "dataIndex":"rel_experience_id",
      "width":"",
      "sortable":true,
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"this.get_experience_name",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":"this.listboxEditor"
    },
    {
      "MIGX_id":7,
      "header":"rel_event_id",
      "dataIndex":"rel_event_id",
      "width":"",
      "sortable":true,
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"this.get_event_name",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":"this.listboxEditor"
    }
  ],
  "category":""
}

migxdb_package_components

{
  "formtabs":[
    {
      "MIGX_id":9,
      "caption":"(Tab) Caption - Component",
      "print_before_tabs":"0",
      "fields":[
        {
          "MIGX_id":36,
          "field":"package_component_component_name",
          "caption":"component_name",
          "description":"from package_component_name",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":1
        },
        {
          "MIGX_id":37,
          "field":"component_introtext",
          "caption":"component_introtext",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"textarea",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":2
        },
        {
          "MIGX_id":38,
          "field":"component_icon",
          "caption":"component_icon",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"file",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":3
        },
        {
          "MIGX_id":39,
          "field":"component_icon_hex",
          "caption":"component_icon_hex",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"text",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":4
        },
        {
          "MIGX_id":40,
          "field":"published",
          "caption":"published",
          "pos":5
        },
        {
          "MIGX_id":41,
          "field":"rel_package_id",
          "caption":"rel_package_id",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"listbox",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"@EVAL return 'select==||'.$modx->runSnippet('migxLoopCollection',array('packageName'=>'packages','classname'=>'package_component','tpl'=>'@CODE:[[+component_name]]==[[+id]]','outputSeparator'=>'||','sortConfig'=>'[{\"sortby\":\"component_name\"}]'));",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":6
        }
      ],
      "pos":1
    }
  ],
  "contextmenus":"update||duplicate||publish||unpublish||remove",
  "actionbuttons":"addItem",
  "columnbuttons":"",
  "filters":"",
  "extended":{
    "migx_add":"Add Component",
    "disable_add_item":"",
    "add_items_directly":1,
    "formcaption":"Form Caption - package components",
    "update_win_title":"Window Title - package components",
    "win_id":"package_component",
    "maxRecords":"",
    "addNewItemAt":"bottom",
    "media_source_id":"",
    "multiple_formtabs":"",
    "multiple_formtabs_label":"",
    "multiple_formtabs_field":"",
    "multiple_formtabs_optionstext":"",
    "multiple_formtabs_optionsvalue":"",
    "actionbuttonsperrow":4,
    "winbuttonslist":"",
    "extrahandlers":"",
    "filtersperrow":4,
    "packageName":"venue",
    "classname":"package_component",
    "task":"",
    "getlistsort":"",
    "getlistsortdir":"",
    "sortconfig":"",
    "gridpagesize":"",
    "use_custom_prefix":"0",
    "prefix":"",
    "grid":"dragdrop",
    "gridload_mode":2,
    "check_resid":1,
    "check_resid_TV":"",
    "join_alias":"",
    "has_jointable":"yes",
    "getlistwhere":"",
    "joins":[
      {
        "alias":"package"
      }
    ],
    "hooksnippets":"",
    "cmpmaincaption":"",
    "cmptabcaption":"",
    "cmptabdescription":"",
    "cmptabcontroller":"",
    "winbuttons":"",
    "onsubmitsuccess":"",
    "submitparams":""
  },
  "permissions":{
    "apiaccess":"",
    "view":"",
    "list":"",
    "save":"",
    "create":"",
    "remove":"",
    "delete":"",
    "publish":"",
    "unpublish":"",
    "viewdeleted":"",
    "viewunpublished":""
  },
  "fieldpermissions":"",
  "columns":[
    {
      "MIGX_id":8,
      "header":"id",
      "dataIndex":"id",
      "width":"",
      "sortable":true,
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":""
    },
    {
      "MIGX_id":2,
      "header":"component_name",
      "dataIndex":"component_name",
      "width":"",
      "sortable":true,
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":"this.textEditor"
    },
    {
      "MIGX_id":3,
      "dataIndex":"component_introtext",
      "header":"component_introtext"
    },
    {
      "MIGX_id":4,
      "header":"component_icon",
      "dataIndex":"component_icon",
      "width":"",
      "sortable":true,
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"this.renderImage",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":""
    },
    {
      "MIGX_id":5,
      "header":"component_icon_hex",
      "dataIndex":"component_icon_hex",
      "width":"",
      "sortable":true,
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":"this.textEditor"
    },
    {
      "MIGX_id":6,
      "header":"published",
      "dataIndex":"published",
      "width":"",
      "sortable":true,
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"this.renderClickCrossTick",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":""
    }
  ],
  "category":""
}

migxdb_experiences

{
  "formtabs":[
    {
      "MIGX_id":11,
      "caption":"experiences fields caption",
      "print_before_tabs":"0",
      "fields":[
        {
          "MIGX_id":46,
          "field":"experience_title",
          "caption":"Title",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":1
        },
        {
          "MIGX_id":47,
          "field":"experience_introtext",
          "caption":"Introtetx",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"textarea",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":2
        },
        {
          "MIGX_id":48,
          "field":"experience_superhero_video",
          "caption":"Superhero video",
          "description":"prioritised over Superhero Img if both are set",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"file",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":3
        },
        {
          "MIGX_id":49,
          "field":"experience_superhero_img",
          "caption":"Superhero image",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"file",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":4
        },
        {
          "MIGX_id":50,
          "field":"experience_superhero_img_alt",
          "caption":"Superhero Img Alt",
          "description":"alt tag for superhero image",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":5
        },
        {
          "MIGX_id":51,
          "field":"migx_experience_components",
          "caption":"Components (embeded MIGX)",
          "description":"Core experience components - can be overridden if package sets specific componentst",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":6
        },
        {
          "MIGX_id":52,
          "field":"experience_price",
          "caption":"Price",
          "description":"Is Price From entered here or does it look up the cheapest Package?",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":7
        },
        {
          "MIGX_id":53,
          "field":"experience_booking_url",
          "caption":"Booking URL",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"url",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":8
        },
        {
          "MIGX_id":54,
          "field":"experience_status",
          "caption":"Status",
          "description":"should be dropdown",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":9
        },
        {
          "MIGX_id":55,
          "field":"experience_data_capture",
          "caption":"Data capture",
          "description":"should be URL?",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":10
        },
        {
          "MIGX_id":56,
          "field":"rel_event_id",
          "caption":"Related event",
          "description":"should be dropdown",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":11
        },
        {
          "MIGX_id":57,
          "field":"rel_faq_id",
          "caption":"Relted FAQ",
          "description":"should be dropdown",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":12
        },
        {
          "MIGX_id":58,
          "field":"rel_testimonial_id",
          "caption":"Related testimonials",
          "description":"should be dropdown",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":13
        },
        {
          "MIGX_id":59,
          "field":"rel_gallery_id",
          "caption":"Related gallery",
          "description":"should be dropdown",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":14
        },
        {
          "MIGX_id":60,
          "field":"rel_tour_id",
          "caption":"Related tour",
          "description":"is redundant? or is tour an event parent eg, SheeranMathematicsTour?",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":15
        }
      ],
      "pos":1
    }
  ],
  "contextmenus":"update||duplicate||publish||unpublish||remove",
  "actionbuttons":"addItem",
  "columnbuttons":"",
  "filters":"",
  "extended":{
    "migx_add":"",
    "disable_add_item":"",
    "add_items_directly":"",
    "formcaption":"form caption - experiences",
    "update_win_title":"Experiences | Hospitality Management",
    "win_id":"migxdb_experiences",
    "maxRecords":"",
    "addNewItemAt":"bottom",
    "media_source_id":"",
    "multiple_formtabs":"",
    "multiple_formtabs_label":"",
    "multiple_formtabs_field":"",
    "multiple_formtabs_optionstext":"",
    "multiple_formtabs_optionsvalue":"",
    "actionbuttonsperrow":4,
    "winbuttonslist":"",
    "extrahandlers":"",
    "filtersperrow":4,
    "packageName":"venue",
    "classname":"experience",
    "task":"",
    "getlistsort":"",
    "getlistsortdir":"",
    "sortconfig":[
      {
        "sortby":"experience_title",
        "sortdir":"ASC"
      }
    ],
    "gridpagesize":"",
    "use_custom_prefix":"0",
    "prefix":"",
    "grid":"",
    "gridload_mode":1,
    "check_resid":1,
    "check_resid_TV":"",
    "join_alias":"",
    "has_jointable":"yes",
    "getlistwhere":"",
    "joins":"",
    "hooksnippets":"",
    "cmpmaincaption":"Experiences CMP Main Caption",
    "cmptabcaption":"Experiences CMP Tab Caption",
    "cmptabdescription":"Experiences CMP Tab Description",
    "cmptabcontroller":"",
    "winbuttons":"",
    "onsubmitsuccess":"",
    "submitparams":""
  },
  "permissions":{
    "apiaccess":"",
    "view":"",
    "list":"",
    "save":"",
    "create":"",
    "remove":"",
    "delete":"",
    "publish":"",
    "unpublish":"",
    "viewdeleted":"",
    "viewunpublished":""
  },
  "fieldpermissions":"",
  "columns":[
    {
      "MIGX_id":2,
      "dataIndex":"id",
      "header":"id"
    },
    {
      "MIGX_id":3,
      "header":"experience_title",
      "dataIndex":"experience_title",
      "width":"",
      "sortable":true,
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":"this.textEditor"
    },
    {
      "MIGX_id":5,
      "header":"price - freeform or cheapest package lookup?",
      "dataIndex":"experience_price",
      "width":"",
      "sortable":true,
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":"this.textEditor"
    },
    {
      "MIGX_id":6,
      "header":"published",
      "dataIndex":"published",
      "width":"",
      "sortable":true,
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"this.renderClickCrossTick",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":""
    }
  ],
  "category":""
}

If you can provide a sample of the errors/issues you’re having, that would help looking at the relevant pieces. Perhaps something stands out if we know what to look for.

For a project of this complexity, I would personally be inclined to recommend building the package from scratch. MIGX does a bunch of magic under the hood for you, which is awesome, but it also hides away how things work that way. Building your own components gives you the full picture and control.

Having a full understanding of what’s going on is pretty important once projects reach a certain complexity, and it makes future changes easier.

If you want to stay with MIGX, @bruno17 is definitely the person to pay. :wink:

I also offer premium MODX support through modmore. MIGX is not my specialty, but I know enough of it to track down issues. We could schedule a video call to go through your project to try and sort them out, but we could also start on a component of your own (based on your existing schema) so you can see how that would work. Drop me an email (support@modmore.com) if you want to explore that. Earliest availability for a call would be Tuesday.

I understand and agree this is ultimately the correct approach. Limitations of my knowledge led me to stick with MIGXdb however with the increased complexity I am stuck in the middle - don’t know enough to push MIGXdb or write a custom CMP.

One error from yesterday was

No foreign key definition for parentClass: event using relation alias: package_component

I updated the MIGX Package Schema but didn’t record the exact change, I’m sure it was attempting to join on a relationship that did not exist. Looking at the error again package_component is not directly related to event. package_component is a child of package and the package is a child of event.

Following the change the error became

No foreign key definition for parentClass: package using relation alias: package_component

I will revisit this today to see if I can make progress.

In terms of the commercial route it makes sense to speak to both yourself and Bruno to find the best route forwards.

Email on it’s way to you shortly.

That means a relation is requested on the event respectively package class, using the relation alias package_component, however that doesn’t exist in the aggregates or composites. So that would indicate an issue in your schema.

Could get triggered by getOne/getMany/graph methods

I do see a package->package_component relation in the schema you posted though :thinking:

You should definitely check the relationships in your schema again.

For example the class “package” has two relationships for the same field “rel_event_id” to two different classes. That doesn’t make any sense.

<aggregate alias="event" class="event" local="rel_event_id" foreign="id" cardinality="one" owner="foreign" />
...
<aggregate alias="package" class="package" local="rel_event_id" foreign="id" cardinality="many" owner="local" /> 

Yeah I definitely need to look at it again with a clear head.

Packages should be related to Experiences, and Experience related to Events.

Thanks

Quick update in case search leads anyone here in future.

I got some help with the database schema and now have several elements hooked up through MIGXdb CMPs.

As was pointed out in this and another related thread, there is a point at which MIGXdb adds more overhead than it’s worth and a custom package is a better solution. Not sure it’s reached that stage yet and will persevere on the current route.

Thanks all.