Подскажите пожалуйста, какой метод можно переопределить, чтобы после того как данные были прочтены из базы дописать в текущий объект ещё параметры взятые их другого места ( к примеру из файла ). Постановка задачи именно такая - связи не подходят, нужно чтобы именно этот объект брал дополнительные данные из другого места и добавлял их к тем что были получены из таблицы.
Вопрос: это ваш собственный класс, расширяющий xPDOObject, или вы хотите в родной класс добавить плюшек?
Значит задача стоит так: Есть всем известный MIGXdb, он умеет в беке создавать таблички связанные с базой данных, что позволяет добавлять/редактировать записи таблицы без программирования собственной CMP и контроллеров. Но данный компонент работает только с одной таблицей - для этого в его параметры нужно указать класс прописанный в схеме базы данных. Вся загвоздка в том что хотелось бы добавляя данные в одну таблицу одно передаваемое поле парсить (банальный explode) и записывать как строки в связанную таблицу - с этим проблем нет, я переопределил в моём классе метод save и отслеживаю передачу этого поля, затем сохраняю и запускаю parent::save();
Теперь обратная задача - при редактировании загрузить в поле данные из связанной таблицы предварительно собрав их в одну строку. Я вижу такую логику: в классе прописанном в схеме данных переопределить метод который достаёт дынные из базы и записывает их в массив, добавив туда извлечение нужных мне данных.
Сейчас я обнаружил что можно переопределить процессор с которым будет работать MIGXdb, возможно это лучшее решение или быть может проще расширить класс? Что скажите?
Нет, к сожалению процессор это не то о чём я подумал - не подходят.
Ну собственно был переопределён метод toArray, данный случай удовлетворяет, но если знаете лучшее место для добавления произвольных дынных - буду признателен если расскажите.
Хорошо, это "ваш" класс, раз вы ему переопределили метод save(). Так что вам мешает тогда, к примеру, переопределить метод _loadInstance()? Типа так:
public static function _loadInstance(& $xpdo, $className, $criteria, $row) { $instance = parent::_loadInstance($xpdo, $className, $criteria, $row); /* some code, for example $instance->set('foo', $foo); */ return $instance; }
Да, собственно вопрос и был в том КАКОЙ метод лучше переопределить )
Ну, я думаю, что этот - самый подходящий. Он именно тогда, когда объект (его данные) берется из БД, а не когда новый создается или типа того.
Расширяй процессор MIGXbd это делается не сложно и не к чему трогать объекты xpdo
Ну вообще это распространённая практика переопределять методы в классах работы с базой данных, даже тот же migxdb использует этот подход.
Хотя да, в данном случае логичнее было бы просто накидать процессор.
Человек спросил что переопределить, я ответил :)
А переопределять класс или процессор писать - это уже другой вопрос, и он совершенно имеет место быть. На усмотрение человека.
Накостылял?
Не факт. Все зависит от задачи. К примеру, если задача четко локальная, и точно известно что только с такими классами надо выполнить данную функцию, то с классом получится предпочтительней. Предпочтительней в том плане, что где бы вы ни выполнили инициализацию объекта $modx->getObject() или $som_object->getOne('MyClass'), у вас всегда будет выполнен этот метод и будут получены данные.
А вот если задача именно в данном месте получить сопутствующие данные, то процессор может оказаться предпочтительнее, так как в таком случае вы не завязаны на конкретном классе, и даже если там будут данные другого касса, то процессор все равно их получит.
Резюме: все зависит от задачи.
Спасибо. Большая честь поучиться у грамотного человека. Завтра буду разбирать как настроить процессор.
Не стоит. Мы не в 16-ом веке :)
Предлагаю создать отдельный болог по MIGX
Здорово! Я думаю, многим интересна эта тема, а документацию приходится по крохам собирать.
Думаю, Алексей мог бы большой вклад в его копилку сделать.
Очень на это надеюсь :)
Оффтоп: Саш, по возможности пиши ответом, чтобы структуру комментов было видно.
Мог бы но не сейчас, много работы. Александр вы бы могли пока начать а там глядишь и я присоединюсь.
Да, какие-то темы в беседе могут проясниться.
Постараюсь :)