Связать кастомную таблицу с modUsers
Связать пользовательскую таблицу с modUser. Требуются расширить данные о пользователе, поле extended в modx_user_attributes не подходит из за json, поля будут активно участвовать в поиске.
в пакете modExtra-master(MyExtUser) создаю простейшую схему:
1.
3. В резолвере прописываю объекты
Ключ: myextuser_assets_url Знаачение: {assets_path}components/myextuser/
Ключ: myextuser_core_path Значение: {core_path}components/myextuser/
5. Собираю пакет, устанавливаю. Создаю сниппет
6.
[2015-06-09 13:17:38] (ERROR @ /index.php) No foreign key definition for parentClass: modUser using relation alias: Data
в пакете modExtra-master(MyExtUser) создаю простейшую схему:
1.
<?xml version="1.0" encoding="UTF-8"?>
<model package="myextuser" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" phpdoc-package="myextuser"
version="1.1">
<object class="extUser" extends="modUser">
<composite alias="Data" local="id" class="Userdata" foreign="userdata_id" cardinality="one" owner="local" />
</object>
<object class="Userdata" table="data" extends="xPDOSimpleObject">
<field key="userdata_id" dbtype="int" precision="11" phptype="integer" null="false" attributes="unsigned"/>
<field key="anyfield" dbtype="varchar" precision="100" phptype="string" null="true" />
<aggregate alias="extUser" local="userdata_id" foreign="id" cardinality="one" owner="foreign" />
</object>
</model>2. Генерирую модель, синхронизирую, делаю все как тут: bezumkin.ru/training/course1/2136/3. В резолвере прописываю объекты
$objects = array(
/*'MyExtUserItem',*/
'extUser',
'Userdata'
);4. Прописываю системные настройки:Ключ: myextuser_assets_url Знаачение: {assets_path}components/myextuser/
Ключ: myextuser_core_path Значение: {core_path}components/myextuser/
5. Собираю пакет, устанавливаю. Создаю сниппет
6.
if (!$MyExtUser = $modx->getService('myextuser', 'MyExtUser', $modx->getOption('myextuser_core_path', null, $modx->getOption('core_path') . 'components/myextuser/') . 'model/myextuser/', $scriptProperties)) {
return 'Could not load MyExtUser class!';
}
$User = $modx->getObject('modUser', $modx->user->get('id'));
$Data = $User->getOne('Data');
$Data->set('anyfield','any text');Итог: ошибка в логе[2015-06-09 13:17:38] (ERROR @ /index.php) No foreign key definition for parentClass: modUser using relation alias: Data
Комментарии: 27
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
А у modUser, как не было связи с твоим новым объектом, так и нет. Нужно где-то её прописать, например вот так, только тебе нужно заменить ключ массива Services на Data.
прописываю в файле MyExtUser/core/components/myextuser/model/myextuser/metadata.mysql.php
Но при генерации пакета удаляется добавленная связь…
Придётся прописывать заново каждый раз. Других способов не знаю, извини.
А у modUser не было связи и нет… меня смутило. Как же, я же расширяю объект modUser и прописываю связь. Разве не такой принцип? При генерации модели, разве это связь не должна учитываться?
Ты работаешь со своими объектами и к чужим отношения не имеешь. Модель MODX уже сгенерирована и лежит в отдельной директории. Как ты думаешь, она должна перегенерироваться в зависимости от твоих действий?
Верно, никак. Она о твоих действиях вообще не в курсе.
и прописать
Создаю схему:
Генерирую модель как описано у вас bezumkin.ru/training/course1/2136/
Добавил системные настройки с ключем со значением Ключ: myextuser_assets_url Значение: {assets_path}components/myextuser/
Ключ: myextuser_core_path Значение: {core_path}components/myextuser/
Собрал и установил пакет myextuser.
Добавил в файл /public_html/core/components/myextuser/model/myextuser/metadata.mysql.php
Создал сниппет:
Выдает 500 ошибку… что я не так делаю?
Иной вариант — расширение пользователей с указанием нового класса.
Связь Data — по аналогии с msProduct, очень сильно упрощает работу с полями в дополнительной таблице.
Класс chGuestData — стандартный класс, расширяющий xPDOSimpleObject.
chGuest содержит методы прозрачного подтягивания полей из chGuestData: github.com/bezumkin/miniShop2/blob/master/core/components/minishop2/model/minishop2/msproduct.class.php
Необходимо смотреть, что удобнее для конкретной задачи.
gist.github.com/antixrist/be29c8381214654af04e
Вам нужны вот эти строчки:
gist.github.com/antixrist/be29c8381214654af04e#file-resolve-tables-php-L38-L57
Подставьте вместо вот этого вашу связь:
Ну и при копипасте не забудьте подставить свои пути/настройки.
Смысл в том, чтобы автоматически добавлять нужную связь к системному классу при пере-/установке своего компонента.
Если что-то не понятно — спрашивайте)
Создаю схему:
Генерирую модель как описано у вас bezumkin.ru/training/course1/2136/
Добавил системные настройки с ключем
extension_packages со значением
[{«myextuser»:{«path»:"[[++core_path]]components/myextuser/model/"}}]Ключ: myextuser_assets_url Значение: {assets_path}components/myextuser/
Ключ: myextuser_core_path Значение: {core_path}components/myextuser/
Собрал и установил пакет myextuser.
Добавил в файл /public_html/core/components/myextuser/model/myextuser/metadata.mysql.php
Создал сниппет:
500 ошибка
Дальше смотрите ошибку. А пока не охота медитировать над кодо-текстом)
p.s. не забудьте на рабочем сайте удалить эти строки. Это только для отладки
Не нравится ему метод set. Весь вопрос почему?
Т.е. вам обязательно в коде нужно делать проверку типа такой:
Другой вопрос — почему в этой переменной ничего нет? Есть ли в вашей таблице получаемый объект? Рискну предположить, что нет)
Сперва создайте объект (либо через $User->addOne('MyExtUser', array(/*...*/)), либо $modx->newObject('MyExtUser')), а уж потом получайте его.
Т.е. создать связь user и моя таблица. И записывать туда специфичные данные юзера. Т.е. с профайлом modx работает так (но меня таблица не устраивает):
Поэтому я хотел создать свою таблицу, со своими полями и работать так (создать связь с базовым класом)
А вот вы, похоже, не совсем понимаете как работают табличные объекты и связи между ними.
Изучайте документацию:
rtfm.modx.com/xpdo/2.x/getting-started/using-your-xpdo-model/creating-objects
rtfm.modx.com/xpdo/2.x/getting-started/using-your-xpdo-model/setting-object-fields
rtfm.modx.com/xpdo/2.x/getting-started/using-your-xpdo-model/working-with-related-objects
Так работает, я честно говоря думал, что объект уже создан… вернее создается экземпляр класса при обращении по алиасу т.е. в этой строке
где то глубоко в недрах modx
Поэтому, нужен объект — извольте его сперва создать)
вопрос еще, скорей всего его уже обсуждали. Глядя на резольвер, на первые две строчки,
логичней заменить? на ?
Поэтому сперва addPackage, создаём/удаляем/обновляем таблицы, потом removeExtensionPackage, а потом addExtensionPackage.
Вот только в этом порядке при сборке пакета исчезли эти странные ошибки.
С тех пор эта копипаста у меня так и гуляет из компонента в компонент)
$modx->addExtensionPackage, срабатывает при второй сборке пакета. В общем пока так пойдет.
Возник вопрос. Есть какой нибудь инструмент переводящий структуру таблиц на mysql в xml schema xpdo modx.......?