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.
 
 
 
 
 
 

396 lines
10 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$
class Tracker_Definition
{
public static $definitions = [];
private $trackerInfo;
private $factory;
private $fields;
public static function get($trackerId, $useCache = true)
{
$trackerId = (int) $trackerId;
if ($useCache && isset(self::$definitions[$trackerId])) {
return self::$definitions[$trackerId];
}
$trklib = TikiLib::lib('trk');
$tracker_info = $trklib->get_tracker($trackerId);
$definition = false;
if ($tracker_info) {
if ($t = $trklib->get_tracker_options($trackerId)) {
$tracker_info = array_merge($t, $tracker_info);
}
$definition = new self($tracker_info);
}
return self::$definitions[$trackerId] = $definition;
}
public static function createFake(array $trackerInfo, array $fields)
{
$def = new self($trackerInfo);
$def->fields = $fields;
return $def;
}
public static function getDefault()
{
$def = new self([]);
$def->fields = [];
return $def;
}
private function __construct($trackerInfo)
{
$this->trackerInfo = $trackerInfo;
}
public function getInformation()
{
return $this->trackerInfo;
}
public function getFieldFactory()
{
if ($this->factory) {
return $this->factory;
}
return $this->factory = new Tracker_Field_Factory($this);
}
public function getConfiguration($key, $default = false)
{
return isset($this->trackerInfo[$key]) ? $this->trackerInfo[$key] : $default;
}
public function isEnabled($key)
{
return $this->getConfiguration($key) === 'y';
}
public function getFieldsIdKeys()
{
$fields = [];
foreach ($this->getFields() as $key => $field) {
$fields[$field['fieldId']] = $field;
}
return $fields;
}
public function getFields()
{
if ($this->fields) {
return $this->fields;
}
$trklib = TikiLib::lib('trk');
$trackerId = $this->trackerInfo['trackerId'];
if ($trackerId) {
$fields = $trklib->list_tracker_fields($trackerId, 0, -1, 'position_asc', '', false /* Translation must be done from the views to avoid translating the sources on edit. */);
return $this->fields = $fields['data'];
} else {
return $this->fields = [];
}
}
public function setFields($fields)
{
$this->fields = $fields;
}
public function getField($id)
{
if (is_numeric($id)) {
foreach ($this->getFields() as $f) {
if ($f['fieldId'] == $id) {
return $f;
}
}
} else {
return $this->getFieldFromPermName($id);
}
}
public function getFieldFromName($name)
{
foreach ($this->getFields() as $f) {
if ($f['name'] == $name) {
return $f;
}
}
}
public function getFieldFromPermName($name)
{
if (empty($name)) {
return null;
}
foreach ($this->getFields() as $f) {
if ($f['permName'] == $name) {
return $f;
}
}
}
public function getPopupFields()
{
if (! empty($this->trackerInfo['showPopup'])) {
return explode(',', $this->trackerInfo['showPopup']);
} else {
return [];
}
}
public function getAuthorField()
{
foreach ($this->getFields() as $field) {
if (
$field['type'] == 'u'
&& $field['options_map']['autoassign'] == 1
&& ($this->isEnabled('userCanSeeOwn') or $this->isEnabled('writerCanModify'))
) {
return $field['fieldId'];
}
}
}
public function getAuthorIpField()
{
foreach ($this->getFields() as $field) {
if (
$field['type'] == 'I'
&& $field['options_map']['autoassign'] == 1
) {
return $field['fieldId'];
}
}
}
public function getWriterField()
{
foreach ($this->getFields() as $field) {
if (
in_array($field['type'], ['u', 'I'])
&& $field['options_map']['autoassign'] == 1
) {
return $field['fieldId'];
}
}
}
public function getUserField()
{
foreach ($this->getFields() as $field) {
if (
$field['type'] == 'u'
&& $field['options_map']['autoassign'] == 1
) {
return $field['fieldId'];
}
}
}
public function getItemOwnerFields()
{
$ownerFields = [];
foreach ($this->getFields() as $field) {
if (
$field['type'] == 'u'
&& $field['options_map']['owner'] == 1
) {
$ownerFields[] = $field['fieldId'];
}
}
if (! $ownerFields) {
$ownerFields = [$this->getUserField()];
}
return array_filter($ownerFields);
}
public function getItemGroupOwnerFields()
{
$ownerFields = [];
foreach ($this->getFields() as $field) {
if ($field['type'] == 'g' && ! empty($field['options_map']['owner'])) {
$ownerFields[] = $field['fieldId'];
}
}
if (! $ownerFields) {
$ownerFields = [$this->getWriterGroupField()];
}
return array_filter($ownerFields);
}
public function getArticleField()
{
foreach ($this->getFields() as $field) {
if ($field['type'] == 'articles') {
return $field['fieldId'];
}
}
}
public function getGeolocationField()
{
foreach ($this->getFields() as $field) {
if ($field['type'] == 'G' && in_array($field['options_map']['use_as_item_location'], [1, 'y'])) {
return $field['fieldId'];
}
}
}
public function getWikiFields()
{
$fields = [];
foreach ($this->getFields() as $field) {
if ($field['type'] == 'wiki') {
$fields[] = $field['fieldId'];
}
}
return $fields;
}
public function getIconField()
{
foreach ($this->getFields() as $field) {
if ($field['type'] == 'icon') {
return $field['fieldId'];
}
}
}
public function getWriterGroupField()
{
foreach ($this->getFields() as $field) {
if (
$field['type'] == 'g'
&& $field['options_map']['autoassign'] == 1
) {
return $field['fieldId'];
}
}
}
public function getRateField()
{
// This is here to support some legacy code for the deprecated 's' type rating field. It is not meant to be generically apply to the newer stars rating field
foreach ($this->getFields() as $field) {
// if ($field['type'] == 's' && $field['name'] == 'Rating') { // Do not force the name to be exactly the non-l10n string "Rating" to allow fetching the fieldID !!!
if ($field['type'] == 's') {
return $field['fieldId'];
}
}
}
public function getFreetagField()
{
foreach ($this->getFields() as $field) {
if ($field['type'] == 'F') {
return $field['fieldId'];
}
}
}
public function getLanguageField()
{
foreach ($this->getFields() as $field) {
if (
$field['type'] == 'LANG'
&& $field['options_map']['autoassign'] == 1
) {
return $field['fieldId'];
}
}
}
public function getCategorizedFields()
{
$out = [];
foreach ($this->getFields() as $field) {
if ($field['type'] == 'e') {
$out[] = $field['fieldId'];
}
}
return $out;
}
public function getRelationField($relation)
{
foreach ($this->getFields() as $field) {
if (
$field['type'] == 'REL'
&& $field['options_map']['relation'] == $relation
) {
return $field['fieldId'];
}
}
}
/**
* Get the names of the item user(s) if any.
* An item user is defined if a 'user selector' field
* exist for this tracker and it has at least one user selected.
*
* @param int $itemId
* @return array|mixed item user name
*/
public function getItemUsers($itemId)
{
$trklib = TikiLib::lib('trk');
return $trklib->get_item_creators($this->trackerInfo['trackerId'], $itemId);
}
public function getSyncInformation()
{
global $prefs;
if ($prefs['tracker_remote_sync'] != 'y') {
return false;
}
$attributelib = TikiLib::lib('attribute');
$attributes = $attributelib->get_attributes('tracker', $this->getConfiguration('trackerId'));
if (! isset($attributes['tiki.sync.provider'])) {
return false;
}
return [
'provider' => $attributes['tiki.sync.provider'],
'source' => $attributes['tiki.sync.source'],
'last' => $attributes['tiki.sync.last'],
'modified' => $this->getConfiguration('lastModif') > $attributes['tiki.sync.last'],
];
}
public function canInsert(array $keyList)
{
foreach ($keyList as $key) {
if (! $this->getFieldFromPermName($key)) {
return false;
}
}
return true;
}
}