Быстрый способ получить значение объекта
Предположим, что вы хотите получить значение одного поля из какого-то объекта 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;
Оригинальная статья
Комментарии ()
Вы должны авторизоваться, чтобы оставлять комментарии.
Есть магазин на шопкипере, и есть задача отказаться там от встроенного плагина мультвалютности, а реализовать простое умножение поля price с ценой на значение другого tv (назовем его курс валюты).
Вся эта затея нужна чтобы кнопочкой в товаре переключать тип валюты, которая используется для добавления товара, простым языком сделать кнопку при перекл. которой цена будет умножаться на курс, или не будет т.е. своего рода-вводим цену конкретного товара в рублях или евро.
Во фронте отображение цены планирую сделать тупо модификаторами, естественно такая цена, улетая в корзину, не умножится на значение поля курса. Поэтому я нашел кусочек кода в shopkeeper.class.php с формированием цены: price мне просто нужно умножить на значение дополнительного поля. Как это можно сделать?
Я понимаю что все чуть сложней мне сначала нужно вывести условие в настройке товара (кнопочку умножается цена или нет на курс) и если умножается, то это значение price умножить на значение tv в отдельном документе (назовем его настройки сайта) или же прям напрямую на число в БД курса. Все что касается modx модульно реализуемо, а вот в php вообще никак не выходит.
Ну или если «это долго рассказывать», то хоть напишите как получить в php значение tv поля и присвоить его например $kurs, чтобы хотябы просто умножить))). Аминь