Nik_ADA 04 февраля 2014 0 6
Добрый день, помогите решить проблему. Не знаю с чем связана.
Создал дополнительную таблицу, создал пакет для MODx и добавил в систему. Добавил классы расширяющий modUser до extUser.
Пользователь создается заполняются поля, все классно. Но пытаюсь обновить поля, в дополнительной таблице ничего не происходит, в основной таблице modx_users поля обновляются.

В чем может быть проблема?

Процедура выполнения.

Сперва выбираю пользователя:
1. $user = $modx->getObject('extUser', array('username:=' => $nickname));
выбираю дополнительные поля: (проверял поля выводятся коректно)
2. $data = $user->getOne('Data');

ну и процедура обновления, пробовал варианты
a. $data->set('access_token', $_GET['access_token']);
b. $data->fromArray(array('access_token' => $_GET['access_token']));

3. ну и концовка: тоже пробовал по разному
a. $user->save();
b. $user->addOne($data, 'Data'); $user->save();
c. $data->save();
6 комментариев
Fi1osof1
Fi1osof 04 февраля 2014г в 21:11 #
Здравствуйте!

Сорри, только добрался к компу нормально.
Видел, вы на modxим написали, что вопрос решен, тем не менее я не увидел, чтобы кто-то расписал решение, и вы тоже не написали в чем именно проблема была. Немного напишу по этому поводу.

Итак, есть предположение, что пользователь, которого вы получаете, в таблице имеет class_key = 'modUser', а по этой причине даже если вы в запросе указываете $user = $modx->getObject('extUser', array('username:=' => $nickname)), вы все равно в итоге получите объект от класса modUser, а не extUser. И таблица для этого объекта будет родная, а не расширенная. Почему? Потому что инстанс конечного объекта зависит от того, какой class_key прописан в получаемой записи. Очень подробно про это писал здесь: modxclub.ru/blog/166.html

Резюмирую: для того, чтобы у вас работало как положено, у вас записи в вашей таблице должны в колонке class_key содержать имя вашего класса. Только тогда, при сохранении объекта, если это будет инстанс вашего класса, будет запись выполнена в вашу таблицу. А так получается, что запрос на селект выполнен корректно с учетом вашей таблицы, но в полученных записях class_key = 'modUser', хоть и с данными из вашей таблицы. Конечный объект — modUser, его таблица по мап-файлу — site_users, и при сохранении туда данные и пишутся.

Попробуйте в консоли так сделать:
print $modx->getObject('extUser', array('username' => $nickname))->get('class_key');

Что напишет?

И тут же попутно:
a. $user->save();
b. $user->addOne($data, 'Data'); $user->save();
c. $data->save();
Лишний раз сохраняете. Это ни к чему. Достаточно так: $user->addOne($data, 'Data');
Если связь прописана в мап-файле корректно, то $data сохранится автоматически при сохранении объекта юзера.
Fi1osof1
Fi1osof 04 февраля 2014г в 21:20 #
И еще добавлю: по опыту, расширять modUser — не удачная идея. Я уже пробовал, и с этим связано очень много проблем, особенно ввиду того, что в классе modX жестко прописано при инициализации пользователя получать именно modUser. Сами понимаете какие из-за этого вытекают проблемы.
Вот поэтому я не расширяю modUser, а добавляю класс связанного объекта, и просто добавляю эту связь базовому классу. Пример добавления таких связей. На выходе вы получаете новые связанные объекты с базовым юзером без лишних заморочек (только пропишите extendedPackage и все). И в любом месте сможете работать с $modx->user->addOne(), $modx->user->getOne() и т.п. Это гораздо практичней.
Nik_ADA1
Nik_ADA 05 февраля 2014г в 13:23 #
Николай спасибо за ответ.
Решения я так и не понял, заработало самостоятельно. Хотя я догадываюсь, почистил папку и пересоздал компонент. Думаю что там были ошибки.

Насчет связи. думаю что это хорошая идея. Ну тут Вы лучше знаете систему и где есть подводные камни. За совет спасибо, буду побывать.

Еще вопрос, где можно почитать про связи с базовым классом
Fi1osof1
Fi1osof 05 февраля 2014г в 13:58 #
Пожалуйста.

Еще вопрос, где можно почитать про связи с базовым классом
Я не знаю что именно вас по этому вопросу интересует, но советую к детальному изучению вот эту статью: community.modx-cms.ru/blog/research/10291.html
Там очень подробно изучался вопрос самого механизма этих связей, и как раз этот материал и лег в основу описанного выше методе добавления связей базовым классам.
Nik_ADA1
Nik_ADA 05 февраля 2014г в 14:08 #
Я про это имел в виду. Спасибо еще раз.
Fi1osof1
Fi1osof 05 февраля 2014г в 15:44 #
Пожалуйста.
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.