За обновлениями можно следить в telegram-канале https://t.me/quasiart

Перевод статьи «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());

Замечания

Помните, что при получении содержимого таких объектов как ресурс, чанк, шаблон, сниппет или плагин, их содержимое не будет обработано парсером.