Предположим, что вы хотите получить значение одного поля из какого-то объекта MODX (чаще всего ресурса, пользователя или профиля пользователя). Давайте используем ресурс. Обычно для получения значения поля ресурса сначала получают сам объект $doc = $modx->getObject(), а затем значение любого поля $doc->get('fieldName'). При использовании данного способа необходимо проверить, что объект $doc существует. Иначе вызов с помощью метода $doc->get() выдаст ошибку PHP.

Кроме того, этот способ довольно медленный и очень ресурсоемкий. Вам нужно получить значение только одного поля, а получаете весь объект в памяти. Есть другой способ. Он более быстрый и менее затратный.

Получить значение поля объекта

Воспользуемся методом xPDO::newQuery(), который позволяет получать значения из базы данных напрямую, минуя сложные проверки и создание объектов.

$query = $modx->newQuery('modResource', array(
  'pagetitle' => 'Products',
));
$query->select('introtext');
$intro = $modx->getValue($query->prepare());

Этот метод работает с любыми объектами MODX. Если что-то пойдет не так (или объект не найден, или значение поля не установлено), $modx->getValue() вернет false.

Получение поля объекта типа Boolean

Для того, чтобы отличить ошибку от значения «0», нужно использовать сравнение по типам (===).

$query = $modx->newQuery('modResource', array(
  'pagetitle' => 'Products',
));
$query->select('published');
$isPublished = $modx->getValue($query->prepare());
 
if ($isPublished === false) {
   /* Ошибка. Возможно ресурс не найден */
} else {
   return $isPublished;
}

Необходимо помнить, что тип возвращаемого значения будет string. Поэтому правильно сравнивать нужно так

if ($isPublished === '1')
if ($isPublished == 1)
if ($isPublished)

Получение значения TV

Обычно пользуются стандартными методами.

/* Объект TV получен и нужно получить необработанное значение TV */
$val = $tvObj->getValue($resourceId);
 
/* Получаем обработанное значение TV */
$val = $tvObj->renderOutput($resourceId);
 
/* Используя объект ресурса можно получить обработанное значение TV */
$val = $resource->getTVValue($tvId);

Попробуем вышеописанный метод. Значения TV хранятся в объекте modTemplateVarResource (таблица modx_site_tmplvar_contentvalues). Но у TV еще есть значение по-умолчанию. Поэтому учтем этот вариант.

$resourceId = 23;
$tvId = 12;
 
/* Получаем значение объекта modTemplateVarResource  */
$query = $modx->newQuery('modTemplateVarResource', array(
    'contentid' => $resourceId,
    'tmplvarid' => $tvId,
));
$query->select('value');
$val = $modx->getValue($query->prepare());
 
/* Получаем значение TV по-умолчанию если запись не найдена */
if ($val === false) {
    $query2 = $modx->newQuery('modTemplateVar', array(
        'id' => $tvId,
    ));
    $query2->select('default_text');
    $val = $modx->getValue($query2->prepare());
}

Необходимо помнить, что этот метод возвращает необработанное значение. Например, для Image TV вы получите не картинку, а путь к ней. А вместо даты, только строковое значение timestamp.

Получение значения даты

Метод getValue() всегда возвращает необработанное значение в отличие от get(). Поэтому для вывода значения в формате даты нужно использовать функцию strftime()

$query = $modx->newQuery('modResource', array(
    'pagetitle' => 'Products',
));
$query->select('editedon');
$editedOn = $modx->getValue($query->prepare());
 
if ($editedOn === false) {
   /* Запрос не выполнен */
   $output = 'Ресурс не найден';
} elseif (empty($editedOn)) {
    $output = 'Ресурс не редактировался';
} else {
    $output = strftime('%m, %d, %Y', $editedOn);
}
return $output;

Оригинальная статья

17 декабря 2015, 16:16   2538     1

Комментарии ()

  1. arkadyexp 02 февраля 2017, 17:31 # 0
    Подскажите пожалуйста, как реализовать подобное:
    Есть магазин на шопкипере, и есть задача отказаться там от встроенного плагина мультвалютности, а реализовать простое умножение поля price с ценой на значение другого tv (назовем его курс валюты).
    Вся эта затея нужна чтобы кнопочкой в товаре переключать тип валюты, которая используется для добавления товара, простым языком сделать кнопку при перекл. которой цена будет умножаться на курс, или не будет т.е. своего рода-вводим цену конкретного товара в рублях или евро.
    Во фронте отображение цены планирую сделать тупо модификаторами, естественно такая цена, улетая в корзину, не умножится на значение поля курса. Поэтому я нашел кусочек кода в shopkeeper.class.php с формированием цены:
    $purchaseOutput = array(
                'id' => $p_id,
                'count' => $p_count,
                'price' => $p_price*(Это значение нужно умножить на значение TV)
                'name' => htmlspecialchars( $this->purchase->get($this->config['fieldName']) ),
                'className' => $packageData['className'],
                'packageName' => $packageData['packageName'],
                'options' => $p_options,
                'url' => $linkUrl
            );
    price мне просто нужно умножить на значение дополнительного поля. Как это можно сделать?
    Я понимаю что все чуть сложней мне сначала нужно вывести условие в настройке товара (кнопочку умножается цена или нет на курс) и если умножается, то это значение price умножить на значение tv в отдельном документе (назовем его настройки сайта) или же прям напрямую на число в БД курса. Все что касается modx модульно реализуемо, а вот в php вообще никак не выходит.
    Ну или если «это долго рассказывать», то хоть напишите как получить в php значение tv поля и присвоить его например $kurs, чтобы хотябы просто умножить))). Аминь

    Вы должны авторизоваться, чтобы оставлять комментарии.

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.