не совсем правильно вы меня поняли, 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