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.
 
 
 
 
 
 

193 lines
8.7 KiB

<?php
/**
* @package tikiwiki
*/
// (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$
// TODO - refactor to ajax-services then KILME
// If you make changes here check also Tracker/Field/DynamicList.php
/**
* Handler for (XHR) requests from the trackerfield type dynamic itemslist. This handler does not save or update anything.
* It only updates the listfield when the $filterFieldValueHere changes, which happens if it is for example as selection change on a linkfield or category field.
*
* @see lib/core/Tracker/Field/DynamicList.php for furher details.
*/
require_once('tiki-setup.php');
$trklib = TikiLib::lib('trk');
if ($prefs['feature_categories'] == 'y') {
$categlib = TikiLib::lib('categ');
}
if ($prefs['feature_trackers'] != 'y') {
die;
}
$access = TikiLib::lib('access');
$filterFieldIdHere = isset($_GET["filterFieldIdHere"]) ? $_GET["filterFieldIdHere"] : null;
$trackerIdThere = isset($_GET["trackerIdThere"]) ? $_GET["trackerIdThere"] : null;
$filterFieldValueHere = isset($_GET["filterFieldValueHere"]) ? $_GET["filterFieldValueHere"] : null;
$filterFieldIdThere = isset($_GET["filterFieldIdThere"]) ? $_GET["filterFieldIdThere"] : null;
$listFieldIdThere = isset($_GET["listFieldIdThere"]) ? $_GET["listFieldIdThere"] : null;
$statusThere = isset($_GET["statusThere"]) ? $_GET["statusThere"] : null;
$mandatory = isset($_GET["mandatory"]) ? $_GET["mandatory"] == 'y' : false;
// needed when multiple fields are bound to the same selection i.e $filterFieldValueHere
$insertId = isset($_GET["insertId"]) ? $_GET["insertId"] : null;
// needed when the default should be passed back to the frontend
$originalValue = isset($_GET["originalValue"]) ? $_GET["originalValue"] : null;
$hideBlank = isset($_GET['hideBlank']) ? $_GET['hideBlank'] : false;
header('Cache-Control: no-cache');
header('content-type: application/x-javascript');
$json_return = [];
// prepare response, we need to pass back some request data:
// $insertId: their could be more than one dynamic list field bound to the same $filterFieldValueHere. Need to know Dynamic Item List field we refer to.
// $originalValue: to select the orginalValue (the value currently used for selecting the element), on changes of $filterFieldValueHere
$json_return['request'] = [
'insertId' => $insertId,
'originalValue' => $originalValue
];
$json_return['response'] = [];
if (! $hideBlank) {
// blank value is the default first option here
$json_return['response'][] = ['', ' '];
}
// if we do not have something to compare with we return empty result
if (empty($filterFieldValueHere)) {
$access->output_serialized($json_return);
return;
}
// start pre processing
$filterFieldHere = $trklib->get_tracker_field($filterFieldIdHere);
$filterFieldThere = $trklib->get_tracker_field($filterFieldIdThere);
// set defaults - normalize $filterValueHere to $finalFilterValueHere, $filterFieldIdThere to $finalFilterFieldIdThere
$finalFilterFieldIdThere = $filterFieldIdThere;
$finalFilterValueHere = $filterFieldValueHere;
// check which combination of filterFieldTypeHere and filterFieldTypeThere we have and how to deal with it.
// case 'xyz' - xyz tested means: this combinination has been tested and works for both, trackerlistview and item templateview.
switch ($filterFieldHere['type']) {
case 'e': // category tested
// only allow category with category. disallow any other category combination.
if ($filterFieldThere['type'] != 'e') {
$access->output_serialized($json_return);
return;
}
break;
case 'r': // r = itemlink - disallow itemlink/category, allow itemlink/itemlink, itemlink/simplefield types like text
switch ($filterFieldThere['type']) {
case 'r': // r = itemlink tested
break;
case 't': // textfield tested
default:
$handler = $trklib->get_field_handler($filterFieldHere);
$optTrackerId = $handler->getOption('trackerId');
$optFieldId = $handler->getOption('fieldId');
$finalFilterValueHere = $trklib->get_item_value($optTrackerId, $filterFieldValueHere, $optFieldId);
break;
}
break;
default:
// if both field types are unknown but match, we assume that it could work
if ($filterFieldHere['type'] != $filterFieldThere['type']) {
$access->output_serialized($json_return);
return;
}
break;
}
// Figure out if the remote list takes multiple values
$filterFieldThereMultipleValues = false;
if ($filterFieldThere['type'] == 'r') {
$filterFieldThereOptions = json_decode($filterFieldThere['options'], true);
if ($filterFieldThereOptions['selectMultipleValues'] == 1) {
$filterFieldThereMultipleValues = true;
}
}
// start main processing - $trackerIdThere is not used at all in get_items_list()
$remoteItemIds = $trklib->get_items_list($trackerIdThere, $finalFilterFieldIdThere, $finalFilterValueHere, $statusThere, $filterFieldThereMultipleValues);
$listFieldThere = $trklib->get_tracker_field($listFieldIdThere);
// special handling for itemList field. We would get always the same values on each iteration so we do it only one time.
$itemListFirstRun = true;
foreach ($remoteItemIds as $remoteItemId) {
$itemInfo = $trklib->get_tracker_item($remoteItemId);
// @TODO although it should be checked by the fieldhandler, verify that permissions on itemId level are respected. i.e restricted by a category field etc.
// however: something like this does not work: $permObject = $tikilib->get_perm_object($remoteItemId, 'trackeritem');
$hasPermission = true;
if (! $hasPermission) {
continue;
}
$listFieldThere = array_merge($listFieldThere, ['value' => $itemInfo[$listFieldIdThere]]);
$handler = $trklib->get_field_handler($listFieldThere, $itemInfo);
// do not inherit showlinks settings from remote items.
$context = ['showlinks' => 'n', 'list_mode' => 'csv'];
// permissions are ok, now get the values depending on the fieldtype of $listFieldIdThere
switch ($listFieldThere['type']) {
case 'l': // itemlist tested
// itemlink can have multiple matches and we would the same matches on each iteration.
// so we only process one iteration and take the fields as selections out of it.
if (! $itemListFirstRun) {
break;
}
$valueFields = $handler->getFieldData();
if (is_array($valueFields)) {
// return each item of that list - requires match in DynamicList.php renderInnerOutput()
// note: we save the itemId of the item selected out of the list, not the value. Allows to keep the links consistant on changing values.
foreach ($valueFields['items'] as $valueField => $labelField) {
$labelField = preg_replace('/<\!--.*?-->/', '', $labelField); // remove comments added by log_tpl
$json_return['response'][] = [$valueField, $labelField];
}
}
$itemListFirstRun = false;
break;
case 'r': // itemlink tested
$valueField = $handler->getFieldData();
$labelField = $handler->renderOutput($context);
$labelField = preg_replace('/<\!--.*?-->/', '', $labelField); // remove comments added by log_tpl
$json_return['response'][] = [$valueField['value'], $labelField];
break;
case 'e': // category tested
case 'd': // dropdown
// array selected_categories etc.
$valueField = $handler->getFieldData();
// for some reason, need to apply the values back, oterwise renderOutput does not return a value - bug?
$listFieldThere = array_merge($listFieldThere, $valueField);
$handler = $trklib->get_field_handler($listFieldThere, $itemInfo);
$labelField = $handler->renderOutput($context);
// we return all categories per itemId, without html, comma-separated
$labelField = str_replace('<br/>', ', ', $labelField);
$json_return['response'][] = [$remoteItemId, $labelField];
break;
// other fieldtypes
case 't': // textfield tested
default:
$labelField = $handler->renderOutput($context);
$labelField = preg_replace('/<\!--.*?-->/', '', $labelField); // remove comments added by log_tpl
$json_return['response'][] = [$remoteItemId, $labelField];
break;
} // switch
} // foreach
$access->output_serialized($json_return);
return;