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.
 
 
 
 
 
 

335 lines
12 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$
function wikiplugin_trackerquerytemplate_info()
{
return [
'name' => tra('Tracker Query Template'),
'documentation' => 'PluginTrackerQueryTemplate',
'description' => tra('Generate a form from tracker data'),
'prefs' => ['feature_trackers','wikiplugin_trackerquerytemplate'],
'body' => tra('Wiki Syntax, with variables from tracker query.'),
'filter' => 'striptags',
'iconname' => 'code',
'introduced' => 10,
'tags' => [ 'basic' ],
'params' => [
'tracker' => [
'required' => true,
'name' => tra('Tracker'),
'description' => tr(
'The name of the tracker to be queried, or if %0, the tracker ID.',
'<code>byname="n"</code>'
),
'since' => '10.0',
'filter' => 'text',
'default' => '',
'profile_reference' => 'tracker',
],
'debug' => [
'required' => false,
'name' => tra('Debug'),
'description' => tra('Turn tracker query debug on (off by default).'),
'since' => '10.0',
'default' => '',
'filter' => 'alpha',
'options' => [
['text' => '', 'value' => ''],
['text' => tra('Yes'), 'value' => 'y'],
['text' => tra('No'), 'value' => 'n'],
]
],
'byname' => [
'required' => false,
'name' => tra('Tracker'),
'description' => tr('Use the tracker name instead of tracker ID in the %0 parameter. Also use the field
name instead of field ID in the filter parameters. Set to Yes (%1) to use names (default) or
No (%2) to use IDs.', '<code>tracker</code>', '<code>y</code>', '<code>n</code>'),
'since' => '10.0',
'default' => 'y',
'filter' => 'alpha',
'options' => [
['text' => '', 'value' => ''],
['text' => tra('Yes'), 'value' => 'y'],
['text' => tra('No'), 'value' => 'n'],
]
],
'render' => [
'required' => false,
'name' => tra('Render'),
'description' => tra('Render as needed for trackers (default).'),
'since' => '10.0',
'default' => 'y',
'filter' => 'alpha',
'options' => [
['text' => '', 'value' => ''],
['text' => tra('Yes'), 'value' => 'y'],
['text' => tra('No'), 'value' => 'n'],
]
],
'itemid' => [
'required' => false,
'name' => tra('Tracker Item Id'),
'description' => tra('Item id of tracker item'),
'since' => '10.0',
'default' => '',
'filter' => 'digits',
'profile_reference' => 'tracker_item',
],
'itemids' => [
'required' => false,
'name' => tra('Tracker Item Ids'),
'description' => tra('Item id of tracker items, separated with comma'),
'since' => '11.0',
'default' => '',
'filter' => 'digits',
'separator' => ',',
'profile_reference' => 'tracker_item',
],
'likefilters' => [
'required' => false,
'name' => tra('Like Filters'),
'description' => tr(
'Apply "like" filters to fields. Format: %0field:value;field:value;field:value%1,
where %0field%1 may be the field name or ID depending on the setting for the %0byname%1 parameter.',
'<code>',
'</code>'
),
'since' => '10.0',
'filter' => 'text',
'default' => ''
],
'andfilters' => [
'required' => false,
'name' => tra('And Filters'),
'description' => tr(
'Apply "and" filters to fields. Format: %0field:value;field:value;field:value%1,
where %0field%1 may be the field name or ID depending on the setting for the %0byname%1 parameter.',
'<code>',
'</code>'
),
'since' => '10.0',
'filter' => 'text',
'default' => ''
],
'orfilters' => [
'required' => false,
'name' => tra('Or Filters'),
'description' => tr(
'Apply "or" filters to fields. Format: %0field:value;field:value;field:value%1,
where %0field%1 may be the field name or ID depending on the setting for the %0byname%1 parameter.',
'<code>',
'</code>'
),
'since' => '10.0',
'filter' => 'text',
'default' => ''
],
'getlast' => [
'required' => false,
'name' => tra('Get Last'),
'description' => tra('Retrieve only the last item from the tracker.'),
'since' => '10.0',
'filter' => 'alpha',
'default' => '',
'options' => [
['text' => '', 'value' => ''],
['text' => tra('Yes'), 'value' => 'y'],
['text' => tra('No'), 'value' => 'n'],
]
],
]
];
}
function wikiplugin_trackerquerytemplate($data, $params)
{
$params = array_merge(
[
'tracker' => '',
'debug' => '',
'byname' => 'y',
'render' => 'y',
'likefilters' => '',
'andfilters' => '',
'getlast' => ''
],
$params
);
if (! empty($params['itemids'])) {
$itemIds = $params['itemids'];
unset($params['itemids']);
$newData = '';
foreach ($itemIds as $itemId) {
if (! empty($itemId)) {
$params['itemid'] = $itemId;
$newData .= wikiplugin_trackerquerytemplate($data, $params);
}
}
return $newData;
}
$handler = new dataToFieldHandler();
foreach ($params as &$param) {//We parse the variables
$param = $handler->parse($param);
}
$query = Tracker_Query::tracker($params['tracker'])->excludeDetails();
$pattern = 'id';
if (! empty($params['byname']) && $params['byname'] == 'y') {
$query->byName();
$pattern = 'name';
}
if (! empty($params['render']) && $params['render'] == 'n') {
$query->render(false);
}
if (! empty($params['itemid']) || isset($_REQUEST['itemId'])) {
if (isset($_REQUEST['itemId'])) { //itemId overrides parameters
$query->itemId($_REQUEST['itemId']);
unset($_REQUEST['itemId']); //we unset because nested plugins may need to have itemId set
} else {
$query->itemId($params['itemid']);
}
}
if (! empty($params['likefilters'])) {
$likefilters = explode(';', $params['likefilters']);
foreach ($likefilters as $likefilter) {
$filter = explode(':', $likefilter);
$query->filterFieldByValueLike($filter[0], $filter[1]);
}
}
if (! empty($params['andfilters'])) {
$andfilters = explode(';', $params['andfilters']);
foreach ($andfilters as $andfilter) {
$filter = explode(':', $andfilter);
$query->filterFieldByValue($filter[0], $filter[1]);
}
}
if (! empty($params['orfilters'])) {
$orfilters = explode(';', $params['orfilters']);
foreach ($orfilters as $orfilter) {
$filter = explode(':', $orfilter);
$query->filterFieldByValueOr($filter[0], $filter[1]);
}
}
if (! empty($params['debug']) && $params['debug'] == 'y') {
$query->debug();
}
if (! empty($params['getlast']) && $params['getlast'] == 'y') {
$items = $query->getLast();
} else {
$items = $query->query();
}
$newData = '';
foreach ($items as $itemId => $fields) {
$trackerId = $query->trackerId();
$handler->set($pattern, $fields, $query->itemsRaw[$itemId], $itemId, $trackerId);
$newData .= $handler->parse($data);
$newData = "~np~" . TikiLib::lib('parser')->parse_data($newData, ['is_html' => true]) . "~/np~";
$handler->pop();
}
return $newData;
}
class dataToFieldHandler
{
public static $itemStack = [];
public $pattern;
private $trackerId;
private $itemId;
private $fields;
private $fieldsRaw;
function __construct() //initially set it to the last called item from trackers if it exists
{
$last = end(self::$itemStack);
if (! empty($last)) {
$this->set($last['pattern'], $last['fields'], $last['fieldsRaw'], $last['itemId'], $last['trackerId']);
}
}
function set($pattern, $fields, $fieldsRaw, $itemId, $trackerId)
{
$this->pattern = $pattern;
$this->trackerId = $trackerId;
$this->itemId = $itemId;
$this->fields = $fields;
$this->fieldsRaw = $fieldsRaw;
self::$itemStack[] = [
"pattern" => $this->pattern,
"fields" => $this->fields,
"fieldsRaw" => $this->fieldsRaw,
"itemId" => $this->itemId,
"trackerId" => $this->trackerId,
];
}
function pop()
{
array_pop(self::$itemStack);
}
function parse($data)
{
global $tikilib;
$checkedData = trim($data);
if (empty($checkedData) || empty(self::$itemStack)) {
return $data;
}
$data = str_replace('$trackerId$', $this->trackerId, $data);
$data = str_replace('$itemId$', $this->itemId, $data);
$data = str_replace('$' . $this->trackerId . '_itemId$', $this->itemId, $data);
if ($this->pattern == 'name') {
foreach ($this->fields as $key => $field) {
$data = str_replace('$' . $key . '$', $field, $data);
$data = str_replace('$~' . $key . '$', $this->fieldsRaw[$key], $data);
}
} else {
preg_match_all('/[\{][$](.)+?[\}]/', $data, $matches);
if (! empty($matches[0])) {
foreach ($matches[0] as $match) {
$data = str_replace($match, "(" . substr($match, 1, -1) . ")", $data);
}
}
foreach ($this->fields as $key => $field) {
$data = str_replace('($f_' . $key . ')', $field, $data);
$data = str_replace('($~f_' . $key . ')', $this->fieldsRaw[$key], $data);
$data = str_replace('{$f_' . $key . '}', $field, $data);
$data = str_replace('{$~f_' . $key . '}', $this->fieldsRaw[$key], $data);
}
}
if (strpos($data, '$created$')) {
$data = str_replace('$created$', $tikilib->get_short_date($tikilib->getOne("SELECT created FROM tiki_tracker_items WHERE itemId = ?", [$this->itemId])), $data);
}
return $data;
}
}