1<?php 2// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project 3// 4// All Rights Reserved. See copyright.txt for details and a complete list of authors. 5// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details. 6// $Id$ 7 8/** 9 * Handler class for Freetags 10 * 11 * Letter key: ~F~ 12 * 13 */ 14class Tracker_Field_Freetags extends Tracker_Field_Abstract implements Tracker_Field_Synchronizable, Tracker_Field_Exportable, Tracker_Field_Filterable 15{ 16 public static function getTypes() 17 { 18 return [ 19 'F' => [ 20 'name' => tr('Tags'), 21 'description' => tr('Allow tags to be shown or added for tracker items.'), 22 'prefs' => ['trackerfield_freetags', 'feature_freetags'], 23 'tags' => ['advanced'], 24 'default' => 'y', 25 'params' => [ 26 'size' => [ 27 'name' => tr('Size'), 28 'description' => tr('Visible size of the input field'), 29 'filter' => 'int', 30 'legacy_index' => 0, 31 ], 32 'hidehelp' => [ 33 'name' => tr('Help'), 34 'description' => tr('Hide or show the input help'), 35 'default' => '', 36 'filter' => 'alpha', 37 'options' => [ 38 '' => tr('Show'), 39 'y' => tr('Hide'), 40 ], 41 'legacy_index' => 1, 42 ], 43 'hidesuggest' => [ 44 'name' => tr('Suggest'), 45 'description' => tr('Hide or show the tag suggestions'), 46 'default' => '', 47 'filter' => 'alpha', 48 'options' => [ 49 '' => tr('Show'), 50 'y' => tr('Hide'), 51 'all' => tr('Show them all, ordered by popularity'), 52 ], 53 'legacy_index' => 2, 54 ], 55 ], 56 ], 57 ]; 58 } 59 60 function getFieldData(array $requestData = []) 61 { 62 $data = []; 63 64 $ins_id = $this->getInsertId(); 65 66 if (isset($requestData[$ins_id])) { 67 $data['value'] = $requestData[$ins_id]; 68 } else { 69 global $prefs; 70 71 $data['value'] = $this->getValue(); 72 73 $langutil = new Services_Language_Utilities; 74 $itemLang = null; 75 if ($this->getItemId()) { 76 try { 77 $itemLang = $langutil->getLanguage('trackeritem', $this->getItemId()); 78 } catch (Services_Exception $e) { 79 $itemLang = null; 80 } 81 } 82 $freetaglib = TikiLib::lib('freetag'); 83 $data['freetags'] = $freetaglib->_parse_tag($data['value']); 84 if ($this->getOption('hidesuggest') == '') { 85 $data['tag_suggestion'] = $freetaglib->get_tag_suggestion( 86 implode(' ', $data['freetags']), 87 $prefs['freetags_browse_amount_tags_suggestion'], 88 $itemLang 89 ); 90 } else { 91 $data['all_tags'] = $freetaglib->silly_list(-1); 92 } 93 } 94 95 return $data; 96 } 97 98 function addValue($value) { 99 $freetaglib = TikiLib::lib('freetag'); 100 $tags = $freetaglib->_parse_tag($this->getValue()); 101 if (! in_array($value, $tags)) { 102 $tags[] = $value; 103 } 104 return implode(' ', array_map(function($t){ 105 return strstr($t, ' ') ? '"'.$t.'"' : $t; 106 }, $tags)); 107 } 108 109 function removeValue($value) { 110 $freetaglib = TikiLib::lib('freetag'); 111 $tags = $freetaglib->_parse_tag($this->getValue()); 112 $tags = array_filter($tags, function($t) use ($value) { 113 return $t != $value; 114 }); 115 return implode(' ', array_map(function($t){ 116 return strstr($t, ' ') ? '"'.$t.'"' : $t; 117 }, $tags)); 118 } 119 120 function renderInput($context = []) 121 { 122 return $this->renderTemplate('trackerinput/freetags.tpl', $context); 123 } 124 125 function renderOutput($context = []) 126 { 127 return $this->renderTemplate('trackeroutput/freetags.tpl', $context); 128 } 129 130 function importRemote($value) 131 { 132 return $value; 133 } 134 135 function exportRemote($value) 136 { 137 return $value; 138 } 139 140 function importRemoteField(array $info, array $syncInfo) 141 { 142 return $info; 143 } 144 145 function getTabularSchema() 146 { 147 $schema = new Tracker\Tabular\Schema($this->getTrackerDefinition()); 148 149 $permName = $this->getConfiguration('permName'); 150 $name = $this->getConfiguration('name'); 151 152 $schema->addNew($permName, 'default') 153 ->setLabel($name) 154 ->setRenderTransform(function ($value) { 155 return $value; 156 }) 157 ->setParseIntoTransform(function (& $info, $value) use ($permName) { 158 $info['fields'][$permName] = $value; 159 }); 160 161 return $schema; 162 } 163 164 function getFilterCollection() 165 { 166 $filters = new Tracker\Filter\Collection($this->getTrackerDefinition()); 167 $permName = $this->getConfiguration('permName'); 168 $name = $this->getConfiguration('name'); 169 $baseKey = $this->getBaseKey(); 170 171 172 $filters->addNew($permName, 'lookup') 173 ->setLabel($name) 174 ->setControl(new Tracker\Filter\Control\TextField("tf_{$permName}_lookup")) 175 ->setApplyCondition(function ($control, Search_Query $query) use ($baseKey) { 176 $value = $control->getValue(); 177 178 if ($value) { 179 $query->filterContent($value, $baseKey); 180 } 181 }) 182 ; 183 184 return $filters; 185 } 186} 187