Отсутствует связь между кастомными таблицами.
Всем доброго времени суток! Давеча столкнулся с такой проблемой.
Не работает метод getMany(). Уже не знаю что и думать. Буду очень признателен за любую помощь. Спасибо!
xml базы:
Вызов метода getMany() осуществляется в preHook'е сниппета Formit. Сниппет создает плэйсхолдер со списком «Город -> Район города».
Код сниппета:
Не работает метод getMany(). Уже не знаю что и думать. Буду очень признателен за любую помощь. Спасибо!
xml базы:
<?xml version="1.0" encoding="UTF-8"?>
<model package="geolocation" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" version="1.1">
<object class="Areas" table="areas" extends="xPDOSimpleObject">
<field key="town_fk" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" />
<field key="title" dbtype="varchar" precision="255" phptype="string" null="false" />
<field key="is_default" dbtype="enum" precision="'1','0'" phptype="string" null="false" default="0" />
<aggregate alias="Towns" class="Towns" local="town_fk" foreign="id" cardinality="many" owner="foreign" />
<composite alias="Streets" class="Streets" local="id" foreign="area_fk" cardinality="one" owner="owner" />
</object>
<object class="Regions" table="regions" extends="xPDOSimpleObject">
<field key="title" dbtype="varchar" precision="255" phptype="string" null="false" />
<composite alias="Towns" class="Towns" local="id" foreign="region_fk" cardinality="one" owner="owner" />
</object>
<object class="Streets" table="streets" extends="xPDOSimpleObject">
<field key="area_fk" dbtype="int" precision="11" phptype="integer" null="false" />
<field key="title" dbtype="varchar" precision="255" phptype="string" null="false" />
<field key="adress" dbtype="varchar" precision="255" phptype="string" null="false" />
<field key="phonenumber" dbtype="char" precision="12" phptype="string" null="false" />
<field key="is_default" dbtype="enum" precision="'1','0'" phptype="string" null="false" default="0" />
<field key="in_map" dbtype="text" phptype="string" null="false" />
<aggregate alias="Areas" class="Areas" local="area_fk" foreign="id" cardinality="many" owner="foreign" />
</object>
<object class="Towns" table="towns" extends="xPDOSimpleObject">
<field key="title" dbtype="char" precision="20" phptype="string" null="false" />
<field key="region_fk" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" />
<composite alias="Areas" class="Areas" local="id" foreign="town_fk" cardinality="one" owner="owner" />
<aggregate alias="Regions" class="Regions" local="region_fk" foreign="id" cardinality="many" owner="foreign" />
</object>
</model>Вызов метода getMany() осуществляется в preHook'е сниппета Formit. Сниппет создает плэйсхолдер со списком «Город -> Район города».
Код сниппета:
$out = '';
$towns = $modx->getCollection('Towns',1);
if (!$towns) {
$hook->addError('areas','Не удалось получить список городов');
return false;
}
foreach($towns as $town){
$areas = $town->getMany('Areas');
if (!$areas) {
$hook->addError('areas','Не удалось получить список районов');
return false;
}
foreach($areas as $area){
$out .= '<li>'.$town->get('title').' -> '.$area->get('title').'</li>' ;
}
}
$hook->setValue('areas',$out);В журнале MODx такая запись:[2015-09-20 08:38:10] (ERROR @ /home/p26419/public_html/aversboden.ru/core/xpdo/om/xpdoobject.class.php: 2266) PHP warning: array_diff_key(): Argument #1 is not an array
Комментарии: 20
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Поменял в своей таблице owner=«owner» на owner=«local»- результат аналогичный…
Ставьте CMPGenerator. Открываете и создаете новый пакет «geolocation». Указываете таблицы, префикс, генерируете и схему и пакет, предварительно сохранив свою старую схему. Далее, в новой схеме прописываете связи aggregate и composite из своей схемы.
Опять открываете пакет в CMPGenerator, только теперь схему генерировать не надо (ставите Нет), только пакет. Сохраняйте. Все.
Вариант 2.
Или вручную — найти все map-файлы и у них поправить все что нужно. Как правило, они лежать в папочке mysql.
Первый вариант самый простой.
Использую вот такие настройки CMPgeneratora:
Код XML-схемы:
Судя по названию переменной $towns и методу getCollection запрашивается список городов. Т.е. городов, определенных условием, указанным во втором параметре метода getCollection. И что мы так видим? Единичку. Т.е. вы получаете всего один объект. Теперь читаем что должно быть
Т.е. или объект xPDOCriteria или массив или строка (для where).
П.С.
Попробуйте поэтапно.
1. Проверьте, если ли записи в таблице городов.
2. Если есть, вызов $modx->getCollection('Towns') что-нибудь возвращает?
3. Если да, есть ли запись с id=1
и т.д.
2) $modx->getCollection('Towns') возвращает массив обьектов Towns
3) Запись с id=1 есть
Спасибо за помощь. Буду пытаться дальше искать багу.
А вы запрашиваете getMany()
Код снипета:
Код схемы:
Записи в таблицах есть. Метод почему то не может получить их. Но по крайней мере критическую ошибку не выдает.
Убрал Спасибо вам огромное. Только вот не могу понять почему return срабатывал...?
Скорее всего, дело не в return, а в кэше. Думаю, если вернуть его обратно, то все будет работать и с ним.