[Решено] Подмена данных при формировании запросов xPDOQuery?
Пытаюсь из поля products взять массив со списком id и получить их pagetitle и добавить в Grid таблицу. Отдельно этот код работает в консоли:
Выводит список через запятую:
Возможно ли в процессоре getlist.class.php подменять вывод select на отформатированный свой?
$item = $this->modx->getObject('modExtraItem', 'modExtraItem.id');
$productsList = $item->get('products');
foreach($productsList as $product) {
$p = $this->modx->getObject('modResource', $product);
$id = $p->get('id');
$c->innerJoin('modResource', 'modResource');
$c->where(array(
'modResource.id' => $id,
));
$c->select(array($this->modx->getSelectColumns('modExtraItem', 'modExtraItem')));
$c->select(array('modExtraItem.products as products_name'));
}
Выводит список через запятую:
Заголовок 1, Заголовок 3, Заголовок 7
Возможно ли в процессоре getlist.class.php подменять вывод select на отформатированный свой?
/**
* @param xPDOQuery $c
*
* @return xPDOQuery
*/
public function prepareQueryBeforeCount(xPDOQuery $c)
{
$query = trim($this->getProperty('query'));
// Подмена результата
$item = $this->modx->getObject('modExtraItem', 'modExtraItem.id');
$productsList = $item->get('products');
foreach($productsList as $product) {
$p = $this->modx->getObject('modResource', $product);
$id = $p->get('id');
$c->innerJoin('modResource', 'modResource');
$c->where(array(
'modResource.id' => $id,
));
$c->select(array($this->modx->getSelectColumns('modExtraItem', 'modExtraItem')));
$c->select(array('modExtraItem.products as products_name'));
}
// Подмена результата
if ($query) {
$c->where([
'name:LIKE' => "%{$query}%",
'OR:category_id:LIKE' => "%{$query}%"
]);
}
return $c;
}
Мне нужно в таблице вместо id'шников выводить их заголовки из таблицы modResource. Комментарии: 11
Посмотри вот здесь пример: modx.pro/howto/9135-object-relations-in-customextra/
Не нашёл =( Нужно массив из поля одной таблицы связать с таблицей modResource и вывести их pagetitle через запятую. Массив в таблице имеет вот такую структуру:
["2","4","6"]
$p = $this->modx->getObject('modResource', $product);
$id = $p->get('id');
Я правильно понимаю, что $product и $id будут идентичны? Вот думаю, удивляться или уже пора перестать.
Да, я распечатываю массив с id и через цикл получаю id ресурсов по одному.
Вопрос в том, зачем получать id, если оно уже получено? ($product)
Я не совсем понял задачи, например, зачем выводить заголовки через запятую, может для вывода в селект.
Можно так:
1. Создаем переменную
2. Получаем список id товаров и заголовки
3. Выводим нужный массив
P.S. Код, не проверял, в комментах набросал, возможно есть ошибки.
Я не совсем понял задачи, например, зачем выводить заголовки через запятую, может для вывода в селект.
Можно так:
1. Создаем переменную
protected $productsList = [];
2. Получаем список id товаров и заголовки
public function prepareQueryBeforeCount(xPDOQuery $c)
{
$item = $this->modx->getObject('modExtraItem', 'modExtraItem.id');
$products= $item->get('products');
$q = $this->modx->newQuery('modResource');
$q->where(array('id:IN' => $products));
$q->select(array('id','pagetitle'));
if($q->prepare() && $q->stmt->execute()) {
$this->productsList = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
}
return $c;
}
3. Выводим нужный массив
public function outputArray(array $array, $count = false)
{
return parent::outputArray($this->productsList, $count);
}
P.S. Код, не проверял, в комментах набросал, возможно есть ошибки.
Эта задача перекликается с этой modx.pro/help/20443
После того как вывели массив, как его добавить в dataIndex Grid таблицы? Нужно что еще прописывать? Или оставить там 'products'?
Должно быть доступно 2 поля, которые мы выбрали: id и pagetitle. Если для комбо, то оставляем как есть.
Что-то я въехать не могу, добавил код:
Вот это поле нужно подменять, но оставить id'шники в таблице. Таблица имеет название products.
<?php
class modExtraItemGetListProcessor extends modObjectGetListProcessor
{
public $objectType = 'modExtraItem';
public $classKey = 'modExtraItem';
public $defaultSortField = 'id';
public $defaultSortDirection = 'DESC';
protected $productsList = [];
//public $permission = 'list';
/**
* @return bool
*/
public function initialize()
{
if ($this->getProperty('combo') && !$this->getProperty('limit') && $id = (int)$this->getProperty('id')) {
$this->item_id = $id;
}
return true;
}
/**
* We do a special check of permissions
* because our objects is not an instances of modAccessibleObject
*
* @return boolean|string
*/
public function beforeQuery()
{
if (!$this->checkPermissions()) {
return $this->modx->lexicon('access_denied');
}
return true;
}
/**
* @param xPDOQuery $c
*
* @return xPDOQuery
*/
public function prepareQueryBeforeCount(xPDOQuery $c)
{
$query = trim($this->getProperty('query'));
$c->leftJoin('modExtraCategory', 'modExtraCategory', 'modExtraCategory.id = modExtraItem.category_id');
$c->select(array($this->modx->getSelectColumns('modExtraItem', 'modExtraItem')));
$c->select(array('modExtraCategory.name as category_name'));
$c->leftJoin('modUser', 'modUser', 'modUser.id = modExtraItem.createdby');
$c->select(array($this->modx->getSelectColumns('modExtraItem', 'modExtraItem')));
$c->select(array('modUser.username as createdby_name'));
$item = $this->modx->getObject('modExtraItem', 'modExtraItem.id');
$products = $item->get('products');
$q = $this->modx->newQuery('modResource');
$q->where(array('id:IN' => $products));
$q->select(array('id','pagetitle'));
if($q->prepare() && $q->stmt->execute()) {
$this->productsList = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
}
if ($query) {
$c->where([
'name:LIKE' => "%{$query}%",
'OR:category_id:LIKE' => "%{$query}%"
]);
}
return $c;
}
/**
* @param xPDOObject $object
*
* @return array
*/
public function prepareRow(xPDOObject $object)
{
$array = $object->toArray();
$array['actions'] = [];
// Edit
$array['actions'][] = [
'cls' => '',
'icon' => 'icon icon-edit',
'title' => $this->modx->lexicon('modextra_item_update'),
//'multiple' => $this->modx->lexicon('modextra_items_update'),
'action' => 'updateItem',
'button' => true,
'menu' => true,
];
if (!$array['active']) {
$array['actions'][] = [
'cls' => '',
'icon' => 'icon icon-power-off action-green',
'title' => $this->modx->lexicon('modextra_item_enable'),
'multiple' => $this->modx->lexicon('modextra_items_enable'),
'action' => 'enableItem',
'button' => true,
'menu' => true,
];
} else {
$array['actions'][] = [
'cls' => '',
'icon' => 'icon icon-power-off action-gray',
'title' => $this->modx->lexicon('modextra_item_disable'),
'multiple' => $this->modx->lexicon('modextra_items_disable'),
'action' => 'disableItem',
'button' => true,
'menu' => true,
];
}
// Remove
$array['actions'][] = [
'cls' => '',
'icon' => 'icon icon-trash-o action-red',
'title' => $this->modx->lexicon('modextra_item_remove'),
'multiple' => $this->modx->lexicon('modextra_items_remove'),
'action' => 'removeItem',
'button' => true,
'menu' => true,
];
return $array;
}
public function outputArray(array $array, $count = false)
{
return parent::outputArray($this->productsList, $count);
}
}
return 'modExtraItemGetListProcessor';
В items.grid.js прописано{
header: _('modextra_products'),
dataIndex: 'products',
sortable: false,
width: 150,
},
Не отображается ничегоВот это поле нужно подменять, но оставить id'шники в таблице. Таблица имеет название products.
Теперь понятно. Значит нам в массив нужно добавить поле с заголовками товаров.
Примерно, так:
Удаляем ненужный код:
функцию — outputArray
и вот эти строчки тоже ни к чему
Примерно, так:
public function prepareRow(xPDOObject $object)
{
$array = $object->toArray();
$q = $this->modx->newQuery('modResource');
if(!is_array($array['products'])) {
$array['products'] = explode(',', $array['products']);
}
$q->where(array('id:IN' => $array['products']));
$q->select(array('pagetitle'));
if($q->prepare() && $q->stmt->execute()) {
$resources = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
$array['productsTitle'] = array_map(function($res){
return $res['pagetitle'];
},$resources);
$array['productsTitle'] = implode(',', $array['productsTitle']);
}
$array['actions'] = [];
....
}
Теперь в место products подставляем productsTitleУдаляем ненужный код:
функцию — outputArray
и вот эти строчки тоже ни к чему
$item = $this->modx->getObject('modExtraItem', 'modExtraItem.id');
$products = $item->get('products');
Круто! Огромное спасибо, работает! А вот по этому https://modx.pro/help/20443 тикетсу не подскажите как настроить вывод значений в окне редактирования?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.