1b0590826SSzymon Olewniczak<?php 2b0590826SSzymon Olewniczak 3b0590826SSzymon Olewniczaknamespace dokuwiki\plugin\bez\struct; 4b0590826SSzymon Olewniczak 5b0590826SSzymon Olewniczakuse dokuwiki\plugin\struct\meta\ValidationException; 6b0590826SSzymon Olewniczakuse dokuwiki\plugin\struct\types\AbstractMultiBaseType; 7b0590826SSzymon Olewniczak 8b0590826SSzymon Olewniczakclass BezType extends AbstractMultiBaseType { 9b0590826SSzymon Olewniczak 10*9b93b298SSzymon Olewniczak const BEZ_TABLE_CODES = array( 11*9b93b298SSzymon Olewniczak '' => 'thread', 12*9b93b298SSzymon Olewniczak 'k' => 'thread_comment', 13*9b93b298SSzymon Olewniczak 'z' => 'task', 14*9b93b298SSzymon Olewniczak 'zk' => 'task_comment' 15*9b93b298SSzymon Olewniczak ); 16*9b93b298SSzymon Olewniczak 17b0590826SSzymon Olewniczak protected $config = array( 18b0590826SSzymon Olewniczak 'autocomplete' => array( 19b0590826SSzymon Olewniczak 'maxresult' => 10 20b0590826SSzymon Olewniczak ), 21b0590826SSzymon Olewniczak ); 22b0590826SSzymon Olewniczak 23b0590826SSzymon Olewniczak /** 24b0590826SSzymon Olewniczak * Output the stored data 25b0590826SSzymon Olewniczak * 26b0590826SSzymon Olewniczak * @param string $value the value stored in the database 27b0590826SSzymon Olewniczak * @param \Doku_Renderer $R the renderer currently used to render the data 28b0590826SSzymon Olewniczak * @param string $mode The mode the output is rendered in (eg. XHTML) 29b0590826SSzymon Olewniczak * @return bool true if $mode could be satisfied 30b0590826SSzymon Olewniczak */ 31b0590826SSzymon Olewniczak public function renderValue($value, \Doku_Renderer $R, $mode) { 32*9b93b298SSzymon Olewniczak preg_match('/#([a-z]*)([0-9]+)/', $value, $matches); 33*9b93b298SSzymon Olewniczak list(,$code, $id) = $matches; 34b0590826SSzymon Olewniczak $title = $value; 35*9b93b298SSzymon Olewniczak 36*9b93b298SSzymon Olewniczak $anchor = ''; 37*9b93b298SSzymon Olewniczak $id_key = 'id'; 38*9b93b298SSzymon Olewniczak switch ($code) { 39*9b93b298SSzymon Olewniczak case '': 40*9b93b298SSzymon Olewniczak $table = 'thread'; 41*9b93b298SSzymon Olewniczak break; 42*9b93b298SSzymon Olewniczak case 'k': 43*9b93b298SSzymon Olewniczak $table = 'thread'; 44*9b93b298SSzymon Olewniczak $anchor = '#k' . $id; 45*9b93b298SSzymon Olewniczak 46*9b93b298SSzymon Olewniczak /** @var helper_plugin_sqlite $sqlite */ 47*9b93b298SSzymon Olewniczak $sqlite = plugin_load('helper', 'bez_db')->getDB(); 48*9b93b298SSzymon Olewniczak $res = $sqlite->query("SELECT thread_id FROM thread_comment WHERE id=?", $id); 49*9b93b298SSzymon Olewniczak $id = $res->fetchColumn(); 50*9b93b298SSzymon Olewniczak break; 51*9b93b298SSzymon Olewniczak case 'z': 52*9b93b298SSzymon Olewniczak $table = 'task'; 53*9b93b298SSzymon Olewniczak $id_key = 'tid'; 54*9b93b298SSzymon Olewniczak break; 55*9b93b298SSzymon Olewniczak case 'zk': 56*9b93b298SSzymon Olewniczak $table = 'task'; 57*9b93b298SSzymon Olewniczak $id_key = 'tid'; 58*9b93b298SSzymon Olewniczak $anchor = '#zk' . $id; 59*9b93b298SSzymon Olewniczak 60*9b93b298SSzymon Olewniczak /** @var helper_plugin_sqlite $sqlite */ 61*9b93b298SSzymon Olewniczak $sqlite = plugin_load('helper', 'bez_db')->getDB(); 62*9b93b298SSzymon Olewniczak $res = $sqlite->query("SELECT task_id FROM task_comment WHERE id=?", $id); 63*9b93b298SSzymon Olewniczak $id = $res->fetchColumn(); 64*9b93b298SSzymon Olewniczak break; 65b0590826SSzymon Olewniczak } 66b0590826SSzymon Olewniczak 67*9b93b298SSzymon Olewniczak $wl = wl("bez:$table:$id_key:$id") . $anchor; 68b0590826SSzymon Olewniczak $R->doc .= '<a href="'.$wl.'">'.$title.'</a>'; 69b0590826SSzymon Olewniczak 70b0590826SSzymon Olewniczak 71b0590826SSzymon Olewniczak return true; 72b0590826SSzymon Olewniczak } 73b0590826SSzymon Olewniczak 74b0590826SSzymon Olewniczak /** 75b0590826SSzymon Olewniczak * Cleans the link 76b0590826SSzymon Olewniczak * 77b0590826SSzymon Olewniczak * @param string $rawvalue 78b0590826SSzymon Olewniczak * @return string 79b0590826SSzymon Olewniczak */ 80b0590826SSzymon Olewniczak public function validate($rawvalue) { 81*9b93b298SSzymon Olewniczak preg_match('/#([a-z]*)([0-9]+)/', $rawvalue, $matches); 82*9b93b298SSzymon Olewniczak list(,$code, $id) = $matches; 83b0590826SSzymon Olewniczak 84b0590826SSzymon Olewniczak if (!is_numeric($id)) { 85b0590826SSzymon Olewniczak throw new ValidationException('Invalid BEZ reference'); 86b0590826SSzymon Olewniczak } 87b0590826SSzymon Olewniczak 88*9b93b298SSzymon Olewniczak if (!in_array($code, array_keys(self::BEZ_TABLE_CODES))) { 89*9b93b298SSzymon Olewniczak throw new ValidationException('Invalid BEZ reference'); 90*9b93b298SSzymon Olewniczak } 91*9b93b298SSzymon Olewniczak 92*9b93b298SSzymon Olewniczak $table = self::BEZ_TABLE_CODES[$code]; 93ffe3109bSSzymon Olewniczak 94ffe3109bSSzymon Olewniczak /** @var helper_plugin_sqlite $sqlite */ 95ffe3109bSSzymon Olewniczak $sqlite = plugin_load('helper', 'bez_db')->getDB(); 96ffe3109bSSzymon Olewniczak $res = $sqlite->query("SELECT COUNT(*) FROM $table WHERE id=?", $id); 97ffe3109bSSzymon Olewniczak $count = $res->fetchColumn(); 98ffe3109bSSzymon Olewniczak if ($count == 0) { 99b0590826SSzymon Olewniczak throw new ValidationException(ucfirst($table) . " with id: $id doesn't exists."); 100b0590826SSzymon Olewniczak } 101b0590826SSzymon Olewniczak 102b0590826SSzymon Olewniczak return $rawvalue; 103b0590826SSzymon Olewniczak } 104b0590826SSzymon Olewniczak 105b0590826SSzymon Olewniczak /** 106b0590826SSzymon Olewniczak * Autocompletion support for pages 107b0590826SSzymon Olewniczak * 108b0590826SSzymon Olewniczak * @return array 109b0590826SSzymon Olewniczak */ 110b0590826SSzymon Olewniczak public function handleAjax() { 111b0590826SSzymon Olewniczak global $INPUT; 112b0590826SSzymon Olewniczak 113b0590826SSzymon Olewniczak // check minimum length 114b0590826SSzymon Olewniczak $lookup = trim($INPUT->str('search')); 115b0590826SSzymon Olewniczak if(utf8_strlen($lookup) < 1) return array(); 116b0590826SSzymon Olewniczak if ($lookup[0] != '#') return array(); 117b0590826SSzymon Olewniczak 118*9b93b298SSzymon Olewniczak preg_match('/#([a-z]*)([0-9]+)/', $lookup, $matches); 119*9b93b298SSzymon Olewniczak list(,$code, $id) = $matches; 120b0590826SSzymon Olewniczak 121b0590826SSzymon Olewniczak if (!is_numeric($id)) return array(); 122*9b93b298SSzymon Olewniczak if (!in_array($code, array_keys(self::BEZ_TABLE_CODES))) return array(); 123b0590826SSzymon Olewniczak 124*9b93b298SSzymon Olewniczak $table = self::BEZ_TABLE_CODES[$code]; 125b0590826SSzymon Olewniczak 126b0590826SSzymon Olewniczak // results wanted? 127b0590826SSzymon Olewniczak $max = (int)$this->config['autocomplete']['maxresult']; 128b0590826SSzymon Olewniczak if($max <= 0) return array(); 129b0590826SSzymon Olewniczak 130ffe3109bSSzymon Olewniczak $bez_db_helper = plugin_load('helper', 'bez_db'); 131ffe3109bSSzymon Olewniczak 132ffe3109bSSzymon Olewniczak /** @var helper_plugin_sqlite $sqlite */ 133ffe3109bSSzymon Olewniczak $sqlite = $bez_db_helper->getDB(); 134*9b93b298SSzymon Olewniczak 135*9b93b298SSzymon Olewniczak $fields = array('id'); 136*9b93b298SSzymon Olewniczak if ($table == 'thread' || $table == 'task') { 137*9b93b298SSzymon Olewniczak $fields[] = 'state'; 138*9b93b298SSzymon Olewniczak } 139*9b93b298SSzymon Olewniczak 140*9b93b298SSzymon Olewniczak $sql = "SELECT " . implode(',', $fields) . " FROM $table WHERE id LIKE ? LIMIT $max"; 141ffe3109bSSzymon Olewniczak $res = $sqlite->query($sql, $id . '%'); 142b0590826SSzymon Olewniczak 143b0590826SSzymon Olewniczak $result = array(); 144ffe3109bSSzymon Olewniczak while ($row = $res->fetch(\PDO::FETCH_ASSOC)) { 145b0590826SSzymon Olewniczak 146*9b93b298SSzymon Olewniczak $name = $value = '#' . $code . $row['id']; 147*9b93b298SSzymon Olewniczak if ($table == 'thread' || $table == 'task') { 148*9b93b298SSzymon Olewniczak $state = $bez_db_helper->getLang('state_' . $row['state']); 149*9b93b298SSzymon Olewniczak $name .= ' (' . $state . ')'; 150b0590826SSzymon Olewniczak } 151b0590826SSzymon Olewniczak 152b0590826SSzymon Olewniczak $result[] = array( 153b0590826SSzymon Olewniczak 'label' => $name, 154b0590826SSzymon Olewniczak 'value' => $value 155b0590826SSzymon Olewniczak ); 156b0590826SSzymon Olewniczak } 157b0590826SSzymon Olewniczak 158b0590826SSzymon Olewniczak return $result; 159b0590826SSzymon Olewniczak } 160b0590826SSzymon Olewniczak}