You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

189 lines
7.4 KiB

<?php
// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
//
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
// $Id$
/*
* Render fields of a trackeritem when called from the tracker
* @param array $params - params passed from tempate as key/value pairs
* Added keys to set the view/edit item template in tiki14. Format as defined in the tracker, i.e. 'wiki:myPageName, 'tpl:myTpl.tpl'
* 'viewItemPretty': define a template to view the item.
* 'editItemPretty': define a template to edit the item.
* These keys treat the template setting in the tracker as a default value and will therefore override if present.
* They only apply if the default setting would apply - i.e sectionformat must be set to configured.
*/
function smarty_function_trackerfields($params, $smarty)
{
if (! isset($params['fields']) || ! is_array($params['fields'])) {
return tr('Invalid fields provided.');
}
if (! isset($params['trackerId']) || ! $definition = Tracker_Definition::get($params['trackerId'])) {
return tr('Missing or invalid tracker reference.');
}
if (! isset($params['mode'])) {
$params['mode'] = 'edit';
}
$smarty->loadPlugin('smarty_function_trackeroutput');
$smarty->loadPlugin('smarty_function_trackerinput');
$sectionFormat = $definition->getConfiguration('sectionFormat', 'flat');
if (! empty($params['format'])) {
$sectionFormat = $params['format'];
}
$editItemPretty = isset($params['editItemPretty']) ? $params['editItemPretty'] : '';
$viewItemPretty = isset($params['viewItemPretty']) ? $params['viewItemPretty'] : '';
$trklib = TikiLib::lib('trk');
$trklib->registerSectionFormat('config', 'edit', $editItemPretty, tr('Configured'));
$trklib->registerSectionFormat('config', 'view', $viewItemPretty, tr('Configured'));
$template = $trklib->getSectionFormatTemplate($sectionFormat, $params['mode']);
// smarty doesn't use tpl: as a resource prefix any more
$template = stripos($template, 'tpl:') === 0 ? substr($template, 4) : $template;
$trklib->unregisterSectionFormat('config');
$prettyModifier = [];
if (stripos($template, 'wiki:') === 0) {
$trklib->get_pretty_fieldIds(substr($template, 5), 'wiki', $prettyModifier, $params['trackerId']);
} else {
$trklib->get_pretty_fieldIds($template, 'tpl', $prettyModifier, $params['trackerId']);
}
$trackerInfo = $definition->getInformation();
$smarty->assign('tracker_info', $trackerInfo);
$smarty->assign('status_types', TikiLib::lib('trk')->status_types());
$title = tr('General');
$sections = [];
$auto = ['input' => [], 'output' => [], 'inline' => []];
$datepicker = false;
foreach ($params['fields'] as $field) {
if ($field['type'] == 'h') {
$title = tr($field['name']);
} else {
$sections[$title][] = $field;
}
$permName = $field['permName'];
$itemId = isset($params['itemId']) ? $params['itemId'] : null;
if ($itemId) {
$item = ['itemId' => $itemId];
} else {
$item = [];
}
$smarty->assign('item', $item);
$auto['input'][$permName] = new Tiki_Render_Lazy(function () use ($field, $smarty, $item) {
return smarty_function_trackerinput([
'field' => $field,
'showlinks' => 'n',
'list_mode' => 'n',
'item' => $item,
], $smarty);
});
// the item-list field needs the itemId here - passed via the template - otherwise it does not show a value in the template
$auto['output'][$permName] = new Tiki_Render_Lazy(function () use ($field, $smarty, $itemId) {
return smarty_function_trackeroutput([
'field' => $field,
'showlinks' => 'n',
'list_mode' => 'n',
'itemId' => $itemId,
], $smarty);
});
// not sure wether we can always pass itemId bc i do not know wether the key or the value is checked
if ($itemId) {
$auto['inline'][$permName] = new Tiki_Render_Lazy(function () use ($field, $smarty, $itemId) {
return smarty_function_trackeroutput([
'field' => $field,
'showlinks' => 'n',
'list_mode' => 'n',
'editable' => 'inline',
'itemId' => $itemId,
], $smarty);
});
}
if ($field['type'] == 'j') {
$datepicker = true;
}
}
$out = [];
foreach ($sections as $title => $fields) {
$out[md5($title)] = [
'heading' => $title,
'fields' => $fields,
];
}
if ($params['mode'] == 'view') {
$auto['default'] = $auto['output'];
} else {
$auto['default'] = $auto['input'];
}
// Compatibility attempt with the legacy $f_X format.
// Note: Here we set the the closures for the field, NOT the final values!
// The final values are set in trackerlib.php using field_render_value()
// Using $params['fields'] as $fields is only the last "section" now
foreach ($params['fields'] as $field) {
$id = $field['fieldId'];
$permName = $field['permName'];
if (empty($prettyModifier[$id])) {
$smarty->assign('f_' . $id, $auto['default'][$permName]);
// https://doc.tiki.org/Pretty+Tracker states that next to {f_id} also {f_fieldname} can be used.
// Somehow there is the support missing here - so add it
$smarty->assign('f_' . $permName, $auto['default'][$permName]);
} elseif ($prettyModifier[$id] == "output") {
$smarty->assign('f_' . $id, $auto['output'][$permName]);
$smarty->assign('f_' . $permName, $auto['output'][$permName]);
} else {
$smarty->assign("field_name", $field['name']);
$smarty->assign("field_id", $id);
$smarty->assign("permname", $permName);
$smarty->assign("mandatory_sym", '');
$smarty->assign("field_input", $auto['input'][$permName]);
$smarty->assign("description", '');
$smarty->assign("field_type", $field['type']);
$prettyout = $smarty->fetch($prettyModifier[$id]); //fetch template identified in prettyModifier
$smarty->assign('f_' . $id, $prettyout);
$smarty->assign('f_' . $permName, $prettyout);
}
}
$smarty->assign('sections', array_values($out));
$smarty->assign('fields', $params['fields']);
$smarty->assign('auto', $auto);
try {
$result = $smarty->fetch($template);
} catch (Exception $e) {
// catch any exception probably casued by a pretty tracker template issue
Feedback::error(tr('Tracker rendering error (section="%0" mode="%1")', $sectionFormat, $params['mode']) .
'<br><br>' . htmlentities($e->getMessage()));
// try again with the default section format "flat"
$template = $trklib->getSectionFormatTemplate('flat', $params['mode']);
$result = $smarty->fetch($template);
}
if ($datepicker) {
$smarty->loadPlugin('smarty_function_js_insert_icon');
$result .= smarty_function_js_insert_icon(['type' => "jscalendar"], $smarty);
}
return $result;
}