магия class_key поражает, жаль только что это не документировано я подумал и склоняюсь больше к примеру с gxBox
Я честно скажу: как-то все очень сложно (во всяком случае при поверхностном осмотре). Вдаваться всерьез не стал, так как не вижу для себя практического применения. В тех схемах, которые я применяю и с теми SQL-запросами, которые в итоге формируются, у меня подобных ошибок не возникает.
схему залил на гитхаб
не совсем правильно вы меня поняли, 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
Объясню суть ошибки: msProduct расширяет класс modResource. Соответственно и запрос должен строиться с modResource: $o = $modx->getObject('modDocument'); Если в данном случае будет получен объект msProduct, то будет эта ошибка, так как msProduct не является наследником modDocument.
юзабельно :)
http://schemaviewer.dev.kenters.com в помощ неплохо сделано для тех кто как я пишет xml schema ))))
Добрый день. Есть небольшая проблема с работой фильтра по товарам, помогите пожалуйста разобраться. Во всех браузерах работает корректно, кроме internet explorer, что самое интересное в ie 9 версии фильтр работает, а в ie 11 уже не хочет, почему-то происходит дублирование в адресную строку и соотвественно 404 ошибка. Сама страница с фильтром: http://whitevann.ru/catalog/vannyi/
тоесть получается с class_key возможно решить такой вот нюанс с вторичными таблицами, но Instantiated a derived class msProduct that is not a subclass of the requested class modDocument меня убивает)
Хороший сайт, возьму на заметку), мне вручную писать больше нравиться нежели изучать готовое решение, зато там подглядеть можно, для спицифики думаю часто приходится вручную делать, все-таки с таблицами с этими головняк, можно просто без наследования Git как-то я выставил поле class_key(альтернатива class_alias в приведенном примере) у головной таблицы, так-вот все было супер выборка была сразу join`ом на указанную таблицу(класс) class_key, но были ошибки в логе, это и правильно т.к второстепенные классы не наследуются от головного, зато выбираются адекватно