Однако многих отпугивают такие заголовки, как, например
$this->_lazy и повторные запросы к БД при $object->toArray() и ->get();
или
xPDO::addDerivativeCriteria(), class_key, CRC и прочие связанные друг с другом тонкости
потому что начинать, конечно, надо с простого.
Вот в этой статье я и попытаюсь сделать введение в xPDO для тех, кто просто хочет понять, что это такое.
Для начала разверните где-нибудь тестовый пустой сайт (проще всего будет зарегистрироваться на https://modhost.pro/, создать бесплатный аккаунт и на нем развернуть один сайт). После чего поставьте себе компонент Console и создайте пару-тройку страниц с разными названиями.
Для начала научимся получать любые поля документов в нашем скрипте. Открываем «Компоненты -> Console» и пишем туда такой код и нажимаем «Выполнить»:
$res = $modx->getObject('modResource',1); $output = $res->get('pagetitle'); print $output;После выполнения этого кода вы увидите внизу pagetitle главной страницы. Поздравляю! Вы только что получили данные страницы с помощью xPDO!
Давайте, разберемся, что мы такого тут написали.
Ресурсы (на самом деле, не только ресурсы, а вообще всё в MODX) являются объектами (это термин из ООП, но если вы не знакомы с ООП, просто представляйте, что «объект» — это другими словами «сущность»). И чтобы что-то сделать с ресурсом (например, получить его свойства), нам этот объект надо сначала найти и «взять» — это мы делаем в первой строке getObject.
$modx->getObject() — дословно «получить объект». В скобках через запятую написано два параметра.
Первый параметр — это класс. Для ресурсов классом является modResource (на самом деле, не для всех, но пока нам это не важно). Благодаря указанию класса, MODX «понимает», что мы хотим работать именно с ресурсом, а не с чанком, пользователем или каким-то другим типом объектов.
Второй параметр — это id объекта (в дереве ресурсов все id прописаны в скобках). Меняя этот параметр можно получать данные любого ресурса. Попробуйте поменять его на 2 или 3, и вы увидите, что нам каждый раз показывается pagetitle того ресурса, который мы указали.
Таким образом, в переменной $res у нас находится объект, соответственно мы можем получить его свойства. Для этого мы использовали метод get:
->get() — дословно «получить». А что именно мы хотим получить, мы указываем в скобках. В данном случае мы хотим получить pagetitle, и мы это указали.
Ну и в последней строчке мы просто выводим содержимое переменной $output на экран.
Мы можем получить не только pagetitle, но и longtitle, content, publishedon и все остальные поля ресурса. А хотите увидеть все поля ресурсов? Тогда несколько меняем наш код:
$res = $modx->getObject('modResource',1); $output = $res->toArray(); print "<pre>"; print_r($output);
->toArray() — возвращает все поля объекта в виде массива
Видите, сколько у ресурса полей? И значение каждого этого поля мы можем получить с помощью $res->get();
Думаю, на сегодня хватит, в следующей статье попробуем получить данные сразу нескольких объектов с помощью getCollection() и, возможно, попробуем отредактировать объект с помощью xPDO. G+
Оригинал статьи community.modx-cms.ru/blog/modx-xpdo/10247.html
но ничего не выводится, а так же некоторые другие параметры, к примеру parent. Так и должно быть?
Попробуйте вместо
написать
или вызвать этот код на пустой странице с пустым шаблоном.
то есть зарезервированные слова, конструкции, методы, действия ( или как это называется...)
прочитал 3 урока, все понятно, и получается на практике повторить.
Не понятно только одно, где можно посмотреть откуда берутся эти
и так далее…
и что обозначает "->" ??? :-) как ее словесно описать можно ?)
Логически, то понятно, что они все делают, но вот где найти описание этих конструкций???
дает возможность работать только с id = 1, а как быть если мне надо выбрать pagetitle для объектов при выборке?
Т.е, код немного поменяется, но чему будем равен $id?
Заранее спасибо за ответ.
Написано на уровне хорошо проработанного, качественного учебника для начинающих: грамотно и понятно! Просто замечательно, что существуют такие русскоязычные ресурсы по MODX.
Думал все просто:
но не тут-то было.
В общем-то разобрался. Я пытался это сделать через Console, а он почему-то ничего не выводил. Может это только у меня такой глюк.
В сниппете все нормально работает.
Часто нахожусь на твоем сайте и тут увидел, что как-то странно у тебя стал отображаться код
joxi.ru/Dr8ojJDSBPDPA6
Раньше было все ОК
Поправь, пожалуйста
А можно ли как-то получить поле из базы данных и после чего изменить какое-то значение и сохранить?
Проверка зависит от способа прикрепления файла. Есть стандартный функционал PHP — тогда надо проверять массив $_FILES
Файл прикреплен стандартно, через input=file. Пытаюсь написать хук для formit, который будет проверять — если аттач есть, то выполняется определенное действие (в моем случае, отправляет юзеру письмо — «спасибо за аттач!»). Но не получается проверку сделать, блин…
Пробовал на php проверку поставить if(isset($_FILES['file'])){… }. но тоже не работает. так вообще можно? часть хука на php, часть на xPDO?
id ресурсов выбирает отлично, а как получить значение TV параметра? пробовал tv.name — не работает
Или вот так, если TV-шек много
как кстати и в случае если бы я использовал функцию get для получения значения вот здесь
не знаю почему…
а во втором случае я не понял — я получаю все значения TV что есть в базе? а как мне потом выбрать, то, которое соответствует выбранному мне ресурсу?
ну и опять же на get будет выдавать ошибку.
Ну а фатальная ошибка скорее всего из-за того, что вы просто скопировали код, не изменив единичку на тот id, который вам нужно получить.
по мне отличается от моего только наличием условия и объявлением переменной, но этот код работает. Пробовал в своем объявлять переменную — все равно не работает(
В общем, проблема решена, только я не понял как и в чем она была))
Если вопрос решили, это хорошо. Но разобраться и понять все же будет не лишним.
На мой взгляд если использовать запрос newQuery, то писать весь код таким образом, чтобы уже в нем получать все то, что нужно и с чем предстоит работать.
Тогда я бы написал так
ОшибкаCall to a member function… on a non-object говорит о том, что ресурс не найден. Поэтому перед тем, как что-то делать с ресурсом, нужно проверить, получен ли вообще этот ресурс.
таких проблем не было и условия тоже не было
И еще вопрос — в процессе эксплуатация сниппета выяснилось, что данному запросу
может удовлетворять не одна запись, а несколько. В основном одна, но иногда может быть несколько. getObject как я понимаю берет первую из них работает с ней. А как быть когда нужно из этой выборки проверить условие tv_name == $idpm2 и уже в случае выполнения этого условия брать TV параметр
2. Нужно использовать метод getCollection и в цикле проверять все полученные ресурсы.
А с getCollection такая же история, нужно проверять или может еще какие тонкости есть?
Потому что с getObject читал много уроков, да и эту статью, но нигде нет об этой проверке, в итоге случайно нашел рабочий код и благодаря Ваши пояснениям разобрался в чем дело.