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 8class Tiki_Profile_InstallHandler_TrackerItem extends Tiki_Profile_InstallHandler 9{ 10 private $mode = 'create'; 11 12 private function getData() // {{{ 13 { 14 if ($this->data) { 15 return $this->data; 16 } 17 18 $data = $this->obj->getData(); 19 20 return $this->data = $data; 21 } // }}} 22 23 function getDefaultValues() // {{{ 24 { 25 return [ 26 'tracker' => 0, 27 'status' => '', 28 'values' => [], 29 ]; 30 } // }}} 31 32 function getConverters() // {{{ 33 { 34 return [ 35 'status' => new Tiki_Profile_ValueMapConverter([ 'open' => 'o', 'pending' => 'p', 'closed' => 'c' ]), 36 ]; 37 } // }}} 38 39 function canInstall() 40 { 41 $data = $this->getData(); 42 43 if (! isset($data['tracker'])) { 44 return false; 45 } 46 47 if ($this->convertMode($data)) { 48 if ($this->mode == 'create' && ! is_array($data['values'])) { 49 return false; 50 } 51 if (is_array($data['values'])) { 52 foreach ($data['values'] as $row) { 53 if (! is_array($row) || count($row) != 2) { 54 return false; 55 } 56 } 57 } 58 } 59 60 return true; 61 } 62 63 function convertMode($data) 64 { 65 if (isset($data['mode']) && $data['mode'] == 'update') { 66 if (empty($data['itemId'])) { 67 throw new Exception("itemId is mandatory to update tracker"); 68 } else { 69 $this->mode = 'update'; 70 } 71 } 72 return true; 73 } 74 75 function _install() 76 { 77 $data = $this->getData(); 78 $converters = $this->getConverters(); 79 $this->replaceReferences($data); 80 $this->convertMode($data); 81 82 foreach ($data as $key => &$value) { 83 if (isset($converters[$key])) { 84 $value = $converters[$key]->convert($value); 85 } 86 } 87 88 $data = array_merge($this->getDefaultValues(), $data); 89 90 $trklib = TikiLib::lib('trk'); 91 92 $fields = $trklib->list_tracker_fields($data['tracker']); 93 $providedfields = []; 94 foreach ($data['values'] as $row) { 95 list( $f, $v) = $row; 96 97 unset($fieldId); 98 99 foreach ($fields['data'] as $key => $entry) { 100 if ($entry['fieldId'] == $f || $entry['permName'] == $f) { 101 $fields['data'][$key]['value'] = $v; 102 $fieldId = $entry['fieldId']; 103 break; 104 } 105 } 106 107 if ($fieldId) { 108 $providedfields[] = $fieldId; 109 } 110 } 111 112 if ($this->mode == 'update') { 113 foreach ($fields['data'] as $key => $entry) { 114 if (! in_array($entry['fieldId'], $providedfields)) { 115 unset($fields['data'][$key]); 116 } 117 } 118 return $trklib->replace_item($data['tracker'], $data['itemId'], $fields, $data['status']); 119 } else { 120 return $trklib->replace_item($data['tracker'], 0, $fields, $data['status']); 121 } 122 } 123 124 /** 125 * Function to export one tracker item 126 * 127 * @param Tiki_Profile_Writer $writer 128 * @param array $item 129 * 130 * @return bool 131 */ 132 static function export(Tiki_Profile_Writer $writer, $item) 133 { 134 if (empty($item) || ! is_array($item)) { 135 return false; 136 } 137 138 if (! isset($item['field_values'])) { 139 $item['field_values'] = []; 140 } 141 142 $statusMap = new Tiki_Profile_ValueMapConverter(['open' => 'o', 'pending' => 'p', 'closed' => 'c']); 143 144 $data = [ 145 'tracker' => $writer->getReference('tracker', $item['trackerId']), 146 'status' => $statusMap->reverse($item['status']), 147 'values' => [], 148 ]; 149 150 foreach ($item['field_values'] as $valueItems) { 151 $fieldReference = $writer->getReference('tracker_field', $valueItems['fieldId']); 152 if (isset($valueItems['value'])) { 153 $data['values'][] = [$fieldReference, $valueItems['value']]; 154 } else { 155 $data['values'][] = null; 156 157 // just a note (--v) for header and prefs field types, but add a warning for others 158 if (in_array($valueItems['type'], ['h', 'p'])) { 159 $feedbackFn = 'note'; 160 } else { 161 $feedbackFn = 'warning'; 162 } 163 164 call_user_func(['Feedback', $feedbackFn], 165 tr( 166 'Field "%0" in Tracker %1 has no value for itemId %2', 167 $valueItems['permName'], $valueItems['trackerId'], $item['itemId'] 168 ) 169 ); 170 } 171 } 172 173 $writer->addObject('tracker_item', $item['itemId'], $data); 174 175 return true; 176 } 177 178 /** 179 * Remove tracker item 180 * 181 * @param string $trackerItem 182 * @return bool 183 */ 184 function remove($trackerItem) 185 { 186 if (! empty($trackerItem)) { 187 $trklib = TikiLib::lib('trk'); 188 $trackerItems = $trklib 189 ->table('tiki_tracker_item_fields') 190 ->fetchAll(['itemId'], ['value' => $trackerItem]); 191 if (count($trackerItems) == 1) { 192 $trackerItemId = ! empty($trackerField[0]['itemId']) ? $trackerField[0]['itemId'] : 0; 193 if ($trklib->remove_tracker_item($trackerItemId)) { 194 return true; 195 } 196 } 197 } 198 199 return false; 200 } 201} 202