I have a Database Schema for a basic Product Catalog and 6 CMPs used to manage data.
The CMPs should allow Add Items Directly ie. selecting Add Item button adds a new row to the grid.
This works for 3 of the 6 CMPs:
Working
- Brochures
- Products
- Content Blocks
Not Working
- Brands
- Categories
- Subcategories
Opening the Brands CMP logs the following error in the modx error log.
[2025-09-25 13:08:07] (ERROR @ /home/runcloud/webapps/dev_website_com/httpdocs/core/cache/mgr/smarty/default/d304d7c24d4d66df3bb18044c10cce45df1ab45b_0.file.dragdrop.grid.tpl.php : 37) PHP warning: Undefined array key "gridpagesize"
[2025-09-25 13:08:07] (ERROR @ /home/runcloud/webapps/dev_website_com/httpdocs/core/cache/mgr/smarty/default/d304d7c24d4d66df3bb18044c10cce45df1ab45b_0.file.dragdrop.grid.tpl.php : 290) PHP warning: Undefined array key "autoResourceFolders"
[2025-09-25 13:08:07] (ERROR @ /home/runcloud/webapps/dev_website_com/httpdocs/core/cache/mgr/smarty/default/d304d7c24d4d66df3bb18044c10cce45df1ab45b_0.file.dragdrop.grid.tpl.php : 376) PHP warning: Undefined array key "jsonvarkey"
[2025-09-25 13:08:07] (ERROR @ /home/runcloud/webapps/dev_website_com/httpdocs/core/cache/mgr/smarty/default/d304d7c24d4d66df3bb18044c10cce45df1ab45b_0.file.dragdrop.grid.tpl.php : 432) PHP warning: Undefined array key "iframeWindowTitle"
[2025-09-25 13:08:07] (ERROR @ /home/runcloud/webapps/dev_website_com/httpdocs/core/cache/mgr/smarty/default/eb4cb204a3bdaefeeca3355ab5036698039bd9ca_0.file.gridpanel.tpl.php : 69) PHP warning: Undefined array key "customHandlers"
[2025-09-25 13:08:07] (ERROR @ /home/runcloud/webapps/dev_website_com/httpdocs/core/cache/mgr/smarty/default/eb4cb204a3bdaefeeca3355ab5036698039bd9ca_0.file.gridpanel.tpl.php : 69) PHP warning: Attempt to read property "value" on null
Can anyone help me figure the cause of the issue please?
I’ve compared the working configs to the non-working ones but can’t see a critical difference.
catalog.schema.xml
``
<?xml version="1.0" encoding="UTF-8"?><!-- 1. Brands table -->
<object class="CatalogBrand" table="catalog__brand" extends="xPDOSimpleObject">
<field key="name" dbtype="varchar" precision="155" phptype="string" null="false" default="" index="index" />
<field key="logo" 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="1" />
<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" />
<!-- relationships -->
<composite alias="CatalogProduct" class="CatalogProduct" local="id" foreign="brand_id" cardinality="many" owner="local" />
<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"/>
</object>
<!-- 2. Product Categories table -->
<object class="CatalogCategory" table="catalog__category" extends="xPDOSimpleObject">
<field key="title" dbtype="varchar" precision="155" phptype="string" null="false" default="" index="index" />
<field key="introtext" dbtype="text" phptype="string" null="false" default="" />
<field key="image" 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="1" />
<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" />
<!-- relationships -->
<composite alias="CatalogSubcategory" class="CatalogSubcategory" local="id" foreign="category_id" cardinality="many" owner="local" />
<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"/>
</object>
<!-- 3. Product Subcategories table -->
<object class="CatalogSubcategory" table="catalog__subcategory" extends="xPDOSimpleObject">
<field key="category_id" dbtype="int" precision="11" phptype="integer" null="false" default="" index="index" />
<field key="title" dbtype="varchar" precision="155" phptype="string" null="false" default="" index="index" />
<field key="introtext" dbtype="text" phptype="string" null="false" default="" />
<field key="image" 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="1" />
<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" />
<!-- relationships -->
<composite alias="CatalogProduct" class="CatalogProduct" local="id" foreign="subcategory_id" cardinality="many" owner="local" />
<aggregate alias="CatalogCategory" class="CatalogCategory" local="category_id" foreign="id" cardinality="one" owner="foreign" />
<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"/>
</object>
<!-- 4. Brochures table -->
<object class="CatalogBrochure" table="catalog__brochure" extends="xPDOSimpleObject">
<field key="title" dbtype="varchar" precision="155" phptype="string" null="false" default="" index="index" />
<field key="introtext" dbtype="text" phptype="string" null="false" default="" />
<field key="image" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
<field key="image_alt" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
<field key="brochure_file" 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="1" />
<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" />
<!-- relationships -->
<composite alias="CatalogProduct" class="CatalogProduct" local="id" foreign="brochure_id" cardinality="many" owner="local" />
<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"/>
</object>
<!-- 5. Products table -->
<object class="CatalogProduct" table="catalog__product" extends="xPDOSimpleObject">
<field key="subcategory_id" dbtype="int" precision="11" phptype="integer" null="false" default="" index="index" />
<field key="brand_id" dbtype="int" precision="11" phptype="integer" null="false" default="" index="index" />
<field key="brochure_id" dbtype="int" precision="11" phptype="integer" null="true" default="" index="index" />
<field key="title" dbtype="varchar" precision="155" phptype="string" null="false" default="" index="index" />
<field key="subtitle" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
<field key="introtext_main" dbtype="text" phptype="string" null="false" default="" />
<field key="introtext_more" dbtype="text" phptype="string" null="false" default="" />
<field key="is_in_showroom" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" />
<field key="price" dbtype="decimal" precision="10,2" phptype="float" null="false" default="0.00" />
<field key="main_image" 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="1" />
<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" />
<!-- relationships -->
<composite alias="CatalogProductSpecification" class="CatalogProductSpecification" local="id" foreign="product_id" cardinality="many" owner="local" />
<composite alias="CatalogProductGallery" class="CatalogProductGallery" local="id" foreign="product_id" cardinality="many" owner="local" />
<aggregate alias="CatalogSubcategory" class="CatalogSubcategory" local="subcategory_id" foreign="id" cardinality="one" owner="foreign" />
<aggregate alias="CatalogBrand" class="CatalogBrand" local="brand_id" foreign="id" cardinality="one" owner="foreign" />
<aggregate alias="CatalogBrochure" class="CatalogBrochure" local="brochure_id" foreign="id" cardinality="one" owner="foreign" />
<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"/>
</object>
<!-- Product Specifications nested table -->
<object class="CatalogProductSpecification" table="catalog__product_specification" extends="xPDOSimpleObject">
<field key="product_id" dbtype="int" precision="11" phptype="integer" null="false" default="" index="index" />
<field key="spec_name" dbtype="varchar" precision="155" phptype="string" null="false" default="" />
<field key="spec_value" 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="1" />
<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" />
<!-- relationships -->
<aggregate alias="CatalogProduct" class="CatalogProduct" local="product_id" foreign="id" cardinality="one" owner="foreign" />
<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"/>
</object>
<!-- Product Gallery nested table -->
<object class="CatalogProductGallery" table="catalog__product_gallery" extends="xPDOSimpleObject">
<field key="product_id" dbtype="int" precision="11" phptype="integer" null="false" default="" index="index" />
<field key="gallery_image" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
<field key="gallery_alt_text" 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="1" />
<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" />
<!-- relationships -->
<aggregate alias="CatalogProduct" class="CatalogProduct" local="product_id" foreign="id" cardinality="one" owner="foreign" />
<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"/>
</object>
<!-- 6. Content Blocks table -->
<object class="CatalogContentBlock" table="catalog__content_block" extends="xPDOSimpleObject">
<field key="title" dbtype="varchar" precision="155" phptype="string" null="false" default="" index="index" />
<field key="subtitle" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
<field key="introtext" dbtype="text" phptype="string" null="false" default="" />
<field key="image" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
<field key="image_alt" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
<field key="content" dbtype="mediumtext" 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="1" />
<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" />
<!-- relationships -->
<composite alias="CatalogContentBlockImageRow" class="CatalogContentBlockImageRow" local="id" foreign="content_block_id" cardinality="many" owner="local" />
<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"/>
</object>
<!-- Content Block Image Row nested table -->
<object class="CatalogContentBlockImageRow" table="catalog__content_block_image_row" extends="xPDOSimpleObject">
<field key="content_block_id" dbtype="int" precision="11" phptype="integer" null="false" default="" index="index" />
<field key="row_image" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
<field key="row_image_alt" 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="1" />
<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" />
<!-- relationships -->
<aggregate alias="CatalogContentBlock" class="CatalogContentBlock" local="content_block_id" foreign="id" cardinality="one" owner="foreign" />
<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"/>
</object>
MIGX configs to follow…
``