* @copyright Copyright © 2009-2014
* @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU General Public License
* version 2 or (at your option) any later version.
* @package migx
*/
/*example: [[!getImageList? &tvname=`myTV`&tpl=`@CODE:- [[+idx]]

[[+imageAlt]]
`]]
*/
/* get default properties */
$allow_request = (bool)$modx->getOption('allowRequest', $scriptProperties, false);
$tvname = $modx->getOption('tvname', $scriptProperties, '');
$inherit_children_tvname = $modx->getOption('inherit_children_tvname', $scriptProperties, '');
$tpl = $modx->getOption('tpl', $scriptProperties, '');
$wrapperTpl = $modx->getOption('wrapperTpl', $scriptProperties, '');
$emptyTpl = $modx->getOption('emptyTpl', $scriptProperties, '');
$limit = $modx->getOption('limit', $scriptProperties, '0');
$offset = $modx->getOption('offset', $scriptProperties, 0);
$totalVar = $modx->getOption('totalVar', $scriptProperties, 'total');
$randomize = $modx->getOption('randomize', $scriptProperties, false);
$preselectLimit = $modx->getOption('preselectLimit', $scriptProperties, 0); // when random preselect important images
$where = $modx->getOption('where', $scriptProperties, '');
$where = !empty($where) ? $modx->fromJSON($where) : array();
$sort = $modx->getOption('sort', $scriptProperties, '');
$sort = !empty($sort) ? $modx->fromJSON($sort) : array();
$toSeparatePlaceholders = $modx->getOption('toSeparatePlaceholders', $scriptProperties, false);
$toPlaceholder = $modx->getOption('toPlaceholder', $scriptProperties, false);
$outputSeparator = $modx->getOption('outputSeparator', $scriptProperties, '');
$splitSeparator = $modx->getOption('splitSeparator', $scriptProperties, '');
$placeholdersKeyField = $modx->getOption('placeholdersKeyField', $scriptProperties, 'MIGX_id');
$toJsonPlaceholder = $modx->getOption('toJsonPlaceholder', $scriptProperties, false);
$jsonVarKey = $modx->getOption('jsonVarKey', $scriptProperties, 'migx_outputvalue');
$outputvalue = $modx->getOption('value', $scriptProperties, '');
if ($allow_request) {
$outputvalue = isset($_REQUEST[$jsonVarKey]) ? $_REQUEST[$jsonVarKey] : $outputvalue;
}
$docidVarKey = $modx->getOption('docidVarKey', $scriptProperties, 'migx_docid');
$docid = $modx->getOption('docid', $scriptProperties, (isset($modx->resource) ? $modx->resource->get('id') : 1));
if ($allow_request) {
$docid = isset($_REQUEST[$docidVarKey]) ? $_REQUEST[$docidVarKey] : $docid;
}
$processTVs = $modx->getOption('processTVs', $scriptProperties, '1');
$reverse = $modx->getOption('reverse', $scriptProperties, '0');
$sumFields = $modx->getOption('sumFields', $scriptProperties, '');
$sumPrefix = $modx->getOption('sumPrefix', $scriptProperties, 'summary_');
$addfields = $modx->getOption('addfields', $scriptProperties, '');
$addfields = !empty($addfields) ? explode(',', $addfields) : null;
//split json into parts
$splits = $modx->fromJson($modx->getOption('splits', $scriptProperties, 0));
$splitTpl = $modx->getOption('splitTpl', $scriptProperties, '');
$splitSeparator = $modx->getOption('splitSeparator', $scriptProperties, '');
$inheritFrom = $modx->getOption('inheritFrom', $scriptProperties, ''); //commaseparated list of resource-ids or/and the keyword 'parents' where to inherit from
$inheritFrom = !empty($inheritFrom) ? explode(',', $inheritFrom) : '';
$modx->setPlaceholder('docid', $docid);
$base_path = $modx->getOption('base_path', null, MODX_BASE_PATH);
$base_url = $modx->getOption('base_url', null, MODX_BASE_URL);
$migx = $modx->getService('migx', 'Migx', $modx->getOption('migx.core_path', null, $modx->getOption('core_path') . 'components/migx/') . 'model/migx/', $scriptProperties);
if (!($migx instanceof Migx))
return '';
$migx->working_context = isset($modx->resource) ? $modx->resource->get('context_key') : 'web';
if (!empty($tvname)) {
if ($tv = $modx->getObject('modTemplateVar', array('name' => $tvname))) {
/*
* get inputProperties
*/
$properties = $tv->get('input_properties');
$properties = isset($properties['formtabs']) ? $properties : $tv->getProperties();
$migx->config['configs'] = $modx->getOption('configs', $properties, '');
if (!empty($migx->config['configs'])) {
$migx->loadConfigs();
// get tabs from file or migx-config-table
$formtabs = $migx->getTabs();
}
if (empty($formtabs) && isset($properties['formtabs'])) {
//try to get formtabs and its fields from properties
$formtabs = $modx->fromJSON($properties['formtabs']);
}
if (!empty($properties['basePath'])) {
if ($properties['autoResourceFolders'] == 'true') {
$scriptProperties['base_path'] = $base_path . $properties['basePath'] . $docid . '/';
$scriptProperties['base_url'] = $base_url . $properties['basePath'] . $docid . '/';
} else {
$scriptProperties['base_path'] = $base_path . $properties['base_path'];
$scriptProperties['base_url'] = $base_url . $properties['basePath'];
}
}
if ($jsonVarKey == 'migx_outputvalue' && !empty($properties['jsonvarkey'])) {
$jsonVarKey = $properties['jsonvarkey'];
$outputvalue = $allow_request && isset($_REQUEST[$jsonVarKey]) ? $_REQUEST[$jsonVarKey] : $outputvalue;
}
if (empty($outputvalue)) {
$outputvalue = $tv->renderOutput($docid);
if (empty($outputvalue) && !empty($inheritFrom)) {
foreach ($inheritFrom as $from) {
if ($from == 'parents') {
if (!empty($inherit_children_tvname)){
//try to get items from optional MIGX-TV for children
if ($inh_tv = $modx->getObject('modTemplateVar', array('name' => $inherit_children_tvname))) {
$outputvalue = $inh_tv->processInheritBinding('', $docid);
}
}
$outputvalue = empty($outputvalue) ? $tv->processInheritBinding('', $docid) : $outputvalue;
} else {
$outputvalue = $tv->renderOutput($from);
}
if (!empty($outputvalue)) {
break;
}
}
}
}
/*
* get inputTvs
*/
$inputTvs = array();
if (is_array($formtabs)) {
//multiple different Forms
// Note: use same field-names and inputTVs in all forms
$inputTvs = $migx->extractInputTvs($formtabs);
}
if ($migx->source = $tv->getSource($migx->working_context, false)) {
$migx->source->initialize();
}
}
}
if (empty($outputvalue)) {
$modx->setPlaceholder($totalVar, 0);
return '';
}
//echo $outputvalue.'
';
$items = $modx->fromJSON($outputvalue);
// where filter
if (is_array($where) && count($where) > 0) {
$items = $migx->filterItems($where, $items);
}
$modx->setPlaceholder($totalVar, count($items));
if (!empty($reverse)) {
$items = array_reverse($items);
}
// sort items
if (is_array($sort) && count($sort) > 0) {
$items = $migx->sortDbResult($items, $sort);
}
$summaries = array();
$output = '';
$items = $offset > 0 ? array_slice($items, $offset) : $items;
$count = count($items);
if ($count > 0) {
$limit = $limit == 0 || $limit > $count ? $count : $limit;
$preselectLimit = $preselectLimit > $count ? $count : $preselectLimit;
//preselect important items
$preitems = array();
if ($randomize && $preselectLimit > 0) {
for ($i = 0; $i < $preselectLimit; $i++) {
$preitems[] = $items[$i];
unset($items[$i]);
}
$limit = $limit - count($preitems);
}
//shuffle items
if ($randomize) {
shuffle($items);
}
//limit items
$count = count($items);
$tempitems = array();
for ($i = 0; $i < $limit; $i++) {
if ($i >= $count) {
break;
}
$tempitems[] = $items[$i];
}
$items = $tempitems;
//add preselected items and schuffle again
if ($randomize && $preselectLimit > 0) {
$items = array_merge($preitems, $items);
shuffle($items);
}
$properties = array();
foreach ($scriptProperties as $property => $value) {
$properties['property.' . $property] = $value;
}
$idx = 0;
$output = array();
$template = array();
$count = count($items);
foreach ($items as $key => $item) {
$formname = isset($item['MIGX_formname']) ? $item['MIGX_formname'] . '_' : '';
$fields = array();
foreach ($item as $field => $value) {
if (is_array($value)) {
if (is_array($value[0])) {
//nested array - convert to json
$value = $modx->toJson($value);
} else {
$value = implode('||', $value); //handle arrays (checkboxes, multiselects)
}
}
$inputTVkey = $formname . $field;
if ($processTVs && isset($inputTvs[$inputTVkey])) {
if (isset($inputTvs[$inputTVkey]['inputTV']) && $tv = $modx->getObject('modTemplateVar', array('name' => $inputTvs[$inputTVkey]['inputTV']))) {
} else {
$tv = $modx->newObject('modTemplateVar');
$tv->set('type', $inputTvs[$inputTVkey]['inputTVtype']);
}
$inputTV = $inputTvs[$inputTVkey];
$mTypes = $modx->getOption('manipulatable_url_tv_output_types', null, 'image,file');
//don't manipulate any urls here
$modx->setOption('manipulatable_url_tv_output_types', '');
$tv->set('default_text', $value);
// $value = $tv->renderOutput($docid); breaks if the TV used in MIGX is also assigned to this Template,
// example tv: imageLogo is assigned to the template and imageLogo is assigned to the MIGX TV as a result
// only the value of the imageLogo is returned for the MIGX TV instance
// need to override default MODX method: $value = $tv->renderOutput($docid);
/* process any TV commands in value */
$tv_value = $tv->processBindings($value, $docid);
$params = $tv->get('output_properties');
if (empty($params) || $params === null) {
$params = [];
}
/* run prepareOutput to allow for custom overriding */
$tv_value = $tv->prepareOutput($tv_value, $docid);
/* find the render */
$outputRenderPaths = $tv->getRenderDirectories('OnTVOutputRenderList','output');
$value = $tv->getRender($params, $tv_value, $outputRenderPaths, 'output', $docid, $tv->get('display'));
// End override of $value = $tv->renderOutput($docid);
//set option back
$modx->setOption('manipulatable_url_tv_output_types', $mTypes);
//now manipulate urls
if ($mediasource = $migx->getFieldSource($inputTV, $tv)) {
$mTypes = explode(',', $mTypes);
if (!empty($value) && in_array($tv->get('type'), $mTypes)) {
//$value = $mediasource->prepareOutputUrl($value);
$value = str_replace('/./', '/', $mediasource->prepareOutputUrl($value));
}
}
}
$fields[$field] = $value;
}
if (!empty($addfields)) {
foreach ($addfields as $addfield) {
$addfield = explode(':', $addfield);
$addname = $addfield[0];
$adddefault = isset($addfield[1]) ? $addfield[1] : '';
$fields[$addname] = $adddefault;
}
}
if (!empty($sumFields)) {
$sumFields = is_array($sumFields) ? $sumFields : explode(',', $sumFields);
foreach ($sumFields as $sumField) {
if (isset($fields[$sumField])) {
$summaries[$sumPrefix . $sumField] = $summaries[$sumPrefix . $sumField] + $fields[$sumField];
$fields[$sumPrefix . $sumField] = $summaries[$sumPrefix . $sumField];
}
}
}
if ($toJsonPlaceholder) {
$output[] = $fields;
} else {
$fields['_alt'] = $idx % 2;
$idx++;
$fields['_first'] = $idx == 1 ? true : '';
$fields['_last'] = $idx == $limit ? true : '';
$fields['idx'] = $idx;
$rowtpl = '';
//get changing tpls from field
if (substr($tpl, 0, 7) == "@FIELD:") {
$tplField = substr($tpl, 7);
$rowtpl = $fields[$tplField];
}
if ($fields['_first'] && !empty($tplFirst)) {
$rowtpl = $tplFirst;
}
if ($fields['_last'] && empty($rowtpl) && !empty($tplLast)) {
$rowtpl = $tplLast;
}
$tplidx = 'tpl_' . $idx;
if (empty($rowtpl) && !empty($$tplidx)) {
$rowtpl = $$tplidx;
}
if ($idx > 1 && empty($rowtpl)) {
$divisors = $migx->getDivisors($idx);
if (!empty($divisors)) {
foreach ($divisors as $divisor) {
$tplnth = 'tpl_n' . $divisor;
if (!empty($$tplnth)) {
$rowtpl = $$tplnth;
if (!empty($rowtpl)) {
break;
}
}
}
}
}
if ($count == 1 && isset($tpl_oneresult)) {
$rowtpl = $tpl_oneresult;
}
$fields = array_merge($fields, $properties);
if (!empty($rowtpl)) {
$template = $migx->getTemplate($tpl, $template);
$fields['_tpl'] = $template[$tpl];
} else {
$rowtpl = $tpl;
}
$template = $migx->getTemplate($rowtpl, $template);
if ($template[$rowtpl]) {
$chunk = $modx->newObject('modChunk');
$chunk->setCacheable(false);
$chunk->setContent($template[$rowtpl]);
if (!empty($placeholdersKeyField) && isset($fields[$placeholdersKeyField])) {
$output[$fields[$placeholdersKeyField]] = $chunk->process($fields);
} else {
$output[] = $chunk->process($fields);
}
} else {
if (!empty($placeholdersKeyField)) {
$output[$fields[$placeholdersKeyField]] = '' . print_r($fields, 1) . '
';
} else {
$output[] = '' . print_r($fields, 1) . '
';
}
}
}
}
}
if (count($summaries) > 0) {
$modx->toPlaceholders($summaries);
}
if ($toJsonPlaceholder) {
$modx->setPlaceholder($toJsonPlaceholder, $modx->toJson($output));
return '';
}
if (!empty($toSeparatePlaceholders)) {
$modx->toPlaceholders($output, $toSeparatePlaceholders);
return '';
}
/*
if (!empty($outerTpl))
$o = parseTpl($outerTpl, array('output'=>implode($outputSeparator, $output)));
else
*/
if ($count > 0 && $splits > 0) {
$size = ceil($count / $splits);
$chunks = array_chunk($output, $size);
$output = array();
foreach ($chunks as $chunk) {
$o = implode($outputSeparator, $chunk);
$output[] = $modx->getChunk($splitTpl, array('output' => $o));
}
$outputSeparator = $splitSeparator;
}
if (is_array($output)) {
$o = implode($outputSeparator, $output);
} else {
$o = $output;
}
if (!empty($o) && !empty($wrapperTpl)) {
$template = $migx->getTemplate($wrapperTpl);
if ($template[$wrapperTpl]) {
$chunk = $modx->newObject('modChunk');
$chunk->setCacheable(false);
$chunk->setContent($template[$wrapperTpl]);
$properties['output'] = $o;
$o = $chunk->process($properties);
}
}
if (empty($o) && !empty($emptyTpl)) {
$template = $migx->getTemplate($emptyTpl);
if ($template[$emptyTpl]) {
$chunk = $modx->newObject('modChunk');
$chunk->setCacheable(false);
$chunk->setContent($template[$emptyTpl]);
$o = $chunk->process($properties);
}
}
if (!empty($toPlaceholder)) {
$modx->setPlaceholder($toPlaceholder, $o);
return '';
}
return $o;