не совсем правильно вы меня поняли, msProduct не причем и вообще компонент minishop не причем то что вы пишете было всегда ясно , "откуда в контейнере содержимое если его туда не положили" 'modDocument' 'msProduct' я про то что добавляя поле class_key ,при получении объекта GetObject(target_class) xpdo найдя этот class_key независимо наследуется таблица или ни наследуется - без разницы , возьмет то что там написано и постарается join`ить автоматом этот класс если он сущевствует и дополнит набор полей в target_class с class_key класса, по target_class.id = class_key.id(в противном случае вообще выдаст фатал еррор о том что класса не сущевствует) обратите внимание на схему: <model package="gxTest" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" version="1.1">
<object class="gxBox" table="gx_box" extends="xPDOSimpleObject">
<field key="title" dbtype="varchar" precision="255" phptype="string" null="false"/>
<field key="properties" dbtype="text" phptype="string" null="false"/>
<field key="class_alias" dbtype="varchar" precision="255" phptype="string" null="false"/>
<composite alias="gxBoxWater" class="gxBoxWater" local="id" foreign="id" cardinality="one" owner="local"/>
<composite alias="gxBoxAutomobil" class="gxBoxAutomobil" local="id" foreign="id" cardinality="one" owner="local"/>
</object>
<object class="gxBoxWater" table="gx_box_water" extends="xPDOSimpleObject">
<field key="pressure" dbtype="int" precision="11" phptype="integer" null="false"/>
<field key="speed" dbtype="int" precision="11" phptype="integer" null="false"/>
<field key="beasts" dbtype="varchar" precision="255" phptype="string" null="false"/>
<aggregate alias="gxBox" class="gxBox" local="id" foreign="id" cardinality="one" owner="foreign"/>
</object>
<object class="gxBoxAutomobil" table="gx_box_automobil" extends="xPDOSimpleObject">
<field key="wheels" dbtype="int" precision="11" phptype="integer" null="false"/>
<field key="has_truck" dbtype="tinyint" precision="1" phptype="boolean" null="false"/>
<field key="truck_volume" dbtype="int" precision="11" phptype="integer" null="false"/>
<aggregate alias="gxBox" class="gxBox" local="id" foreign="id" cardinality="one" owner="foreign"/>
</object>
<object class="gdBox" table="gd_box" extends="xPDOSimpleObject">
<field key="title" dbtype="varchar" precision="255" phptype="string" null="false"/>
<field key="properties" dbtype="text" phptype="string" null="false"/>
<field key="class_key" dbtype="varchar" precision="255" phptype="string" null="false"/>
<composite alias="gdBoxWater" class="gdBoxWater" local="id" foreign="id" cardinality="one" owner="local"/>
<composite alias="gdBoxAutomobil" class="gdBoxAutomobil" local="id" foreign="id" cardinality="one" owner="local"/>
</object>
<object class="gdBoxWater" table="gd_box_water" extends="xPDOSimpleObject">
<field key="pressure" dbtype="int" precision="11" phptype="integer" null="false"/>
<field key="speed" dbtype="int" precision="11" phptype="integer" null="false"/>
<field key="beasts" dbtype="varchar" precision="255" phptype="string" null="false"/>
<aggregate alias="gdBox" class="gdBox" local="id" foreign="id" cardinality="one" owner="foreign"/>
</object>
<object class="gdBoxAutomobil" table="gd_box_automobil" extends="xPDOSimpleObject">
<field key="wheels" dbtype="int" precision="11" phptype="integer" null="false"/>
<field key="has_truck" dbtype="tinyint" precision="1" phptype="boolean" null="false"/>
<field key="truck_volume" dbtype="int" precision="11" phptype="integer" null="false"/>
<aggregate alias="gdBox" class="gdBox" local="id" foreign="id" cardinality="one" owner="foreign"/>
</object>
</model> в ней есть 6 классов по 3 , и того 2 варианта исполнения(gx/gd) такой структуры при запросе: $modx->getObject('gxBox') мы получим только набор полей этой таблицы gx_box для joina надо проделать: $modx->getObjectGraph('gxBox','{gxBoxWater:{},gxBoxAutomobil:{}}') тоесть присоединить к gxBox можно и water и automobil ,потому-что class_alias не имеет магии при запросе: $modx->getObject('gdBox') нам вернется набор полей: Array
(
[id] => 2
[wheels] =>
[has_truck] =>
[truck_volume] =>
[title] => Auto
[properties] =>
[class_key] => gdBoxAutomobil
) обратите внимание на то что они спарены в месте, связи aggregate и Composite здесь ни при чем они просто помогают нам при добавлении addOne(), class_key - только это поле (правильно заполненное) повлияло на слияние, значит в нем есть магия и пофигу что выборка происходит не от наследников и вообще здесь этого нет , но всеравно все ок Instantiated a derived class gdBoxAutomobil that is not a subclass of the requested class gdBox