Перевод статьи «Get a Field Value — Fast»
Очень быстрый и эффективный способ получения значения поля в MODX Revolution от Джейсона Коварда.
Предположим, необходимо получить значение поля какого-нибудь объекта (ресурс, пользователь и пр.). Давайте рассмотрим типичный пример решения этой простой задачи.
$resource = $modx->getObject('modResource', ['id' => 1]);
return $resource->get('pagetitle');
Пока всё просто: происходит выборка ресурса с id=1 из базы данных, а затем возвращается его заголовок.
Но этот способ очень ресурсоёмкий, так как полученный объект занимает непозволительно много памяти, если необходимо получить лишь значение одного поля.
Но стоит добавить немного магии и всё станет работать чуточку быстрее.
Конкретный пример
Давайте улучшим последний пример.
$query = $modx->newQuery('modResource', array('id' => 1));
$query->select('pagetitle');
return $modx->getValue($query->prepare());
Объяснение
Данный метод работает для любого объекта MODX. Первый аргумент $modx->newQuery() — это имя класса объекта, значение поля которого нужно получить (modUser, modResource, modUserProfile и т.д.). Второй аргумент является ассоциативным массивом и содержит ту информацию, которая уже известна об объекте. Затем в методе select указывается поле, значение которого требуется получить, в данном случае — pagetitle. Если что-то пойдёт не так (не найден объект или поле), то метод getValue вернёт false.
Примеры
Теперь рассмотрим несколько примеров получения информации о пользователе. Предположим, требуется получить адрес электронной почты пользователя. Данное поле находится в объекте профиля пользователя, а не в объекте самого пользователя. В объекте профиля пользователя (modUserProfile) поле internalKey содержит идентификатор пользователя (modUser), к которому относится.
Пример №1
Если известен идентификатор пользователя, то всё замечательно.
$userId = 1;
$query = $modx->newQuery('modUserProfile', [
'internalKey' => $userId,
]);
$query->select('email');
$email = $modx->getValue($query->prepare());
Пример №2
Что делать, если известен только username пользователя? Главное — не паниковать.
Поле username хранится не в modUserProfile, а в modUser, поэтому придётся совершить дополнительное действие.
/* Получение идентификатора пользователя */
$username = 'root';
$query1 = $modx->newQuery('modUser', [
'username' => $username,
]);
$query1->select('id');
$userId = $modx->getValue($query1->prepare());
/* Если пользователь существует */
if ($userId) {
/* Получение email */
$query2 = $modx->newQuery('modUserProfile', [
'internalKey' => $userId,
]);
$query2->select('email');
$email = $modx->getValue($query2->prepare());
}
Пример №3
Такие поля ресурсов, как createdby, editedby, publishedby и deletedby содержат идентификатор пользователя. Получение имени пользователя может выглядеть следующим образом:
$userId = $modx->resource->get('createdby');
$query = $modx->newQuery('modUser', [
'id' => $userId,
]);
$query->select('username');
$userName = $modx->getValue($query->prepare());
А как же получить значение поля профиля?
$userId = $modx->resource->get('createdby');
$query = $modx->newQuery('modUserProfile', [
'internalKey' => $userId,
]);
$query->select('fullname');
$fullName = $modx->getValue($query->prepare());
Замечания
Помните, что при получении содержимого таких объектов как ресурс, чанк, шаблон, сниппет или плагин, их содержимое не будет обработано парсером.