Получить и посчитать все заполненные поля из MIGX
Прошу помощи в решении задачи: есть готовый сниппет, который считает заполненные TV-поля и затем выводит их в указанное кол-во столбцов. Необходимо переделать его под работу с MIGX.
должно быть что-то вроде
<?php
//передаваемые в сниппет параметры
//id - id ресурса с которого берем нужные поля
//tvInput - id полей для проверки, через запятую
//cols_count - количество выводимых колонок
//tpl - шаблон вывода
$id = $id;
$tvInput = explode(',',$tvs);
$cols_count = $cols;
$tpl = $tpl;
if (!isset($tvInput)) { return false; } // Если не указаны TV, прекращаем выполнение кода
if (!isset($id)) { $id = $modx->resource->get('id'); } // По-умолчанию текущий ресурс
if (!isset($cols_count)) { $cols_count = 2; } // Количество колонок по-умолчанию
if (!isset($tpl)) { $tpl = 'object_params'; } // Шаблон по-умолчанию
$criteria = $modx->newQuery('modTemplateVarResource', [
'contentid' => $id,
'tmplvarid:IN' => $tvInput,
'value:!=' => ''
]);
$docs = $modx->getCollection('modTemplateVarResource', $criteria);
//выводим по колонкам
//default_elems_at_col - количество элементов в колонке
$output = '';
$count = count($docs);
$default_elems_at_col = floor($count / $cols_count);
$continue_default = false;
/*
как работает:
например: 52 элемента на 5 колонок
$default_elems_at_col - количество элементов в колонке по умолчанию floor(52 / 5) = 10
остается 2 элемента (52 - 50), которые необходимо распределить по колонкам, т.е.
$real_default_elems_at_col = 11 (для первых двух колонок)
$continue_default - переменная, чтобы прекратить лишние вычисления на итерациях, когда лишних элементов не осталось
*/
$output .= '<div class="params params_cols-' . $cols_count . '">';
for ($i = 0; $i < $cols_count; $i++) {
if (!$continue_default) {
$real_default_elems_at_col = $default_elems_at_col + 1;
if ( ($real_default_elems_at_col * ($i + 1) + ($cols_count - $i - 1) * $default_elems_at_col) > $count ) {
$real_default_elems_at_col = $default_elems_at_col;
$continue_default = true;
}
}
$output .= '<div class="params__column">';
for ($j = 0; $j < $real_default_elems_at_col; $j++) {
$current_doc = current($docs)->toArray();
$tvId = $current_doc["tmplvarid"];
$value = $current_doc["value"];
$output .= $modx->getChunk($tpl, [
'tvId' => $tvId,
'value' => $value
]);
//если следующего элемента нет - выходим из цикла
if (!next($docs)) {
break;
}
}
$output .= '</div>';
}
$output .= '</div>';
return $output;
Т.е. вместо$criteria = $modx->newQuery('modTemplateVarResource', [
'contentid' => $id,
'tmplvarid:IN' => $tvInput,
'value:!=' => ''
]);
$docs = $modx->getCollection('modTemplateVarResource', $criteria);
нужно получить и посчитать непустые поля MIGX, думаю в этом направлении:$criteria = $modx->runSnippet('getImageList',array(
'tvname'=> $tvInput,
'tpl'=>'@CODE: [[+name]]==[[+value]]',
'outputSeparator'=>'||',
'docid' => $id
));
а вместо$tvId = $current_doc["tmplvarid"];
$value = $current_doc["value"];
$output .= $modx->getChunk($tpl, [
'tvId' => $tvId,
'value' => $value
]);
должно быть что-то вроде
$tvName = $current_doc["name"];
$value = $current_doc["value"];
$output .= $modx->getChunk($tpl, [
'tvName' => $tvName,
'value' => $value
]);
Спасибо.