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>