1fa04b28cSMichael Grosse<?php 2fa04b28cSMichael Grossenamespace dokuwiki\plugin\struct\meta; 3fa04b28cSMichael Grosseclass AggregationCloud { 4fa04b28cSMichael Grosse /** 5fa04b28cSMichael Grosse * @var string the page id of the page this is rendered to 6fa04b28cSMichael Grosse */ 7fa04b28cSMichael Grosse protected $id; 8fa04b28cSMichael Grosse /** 9fa04b28cSMichael Grosse * @var string the Type of renderer used 10fa04b28cSMichael Grosse */ 11fa04b28cSMichael Grosse protected $mode; 12fa04b28cSMichael Grosse /** 13fa04b28cSMichael Grosse * @var \Doku_Renderer the DokuWiki renderer used to create the output 14fa04b28cSMichael Grosse */ 15fa04b28cSMichael Grosse protected $renderer; 16fa04b28cSMichael Grosse /** 17fa04b28cSMichael Grosse * @var SearchConfig the configured search - gives access to columns etc. 18fa04b28cSMichael Grosse */ 19fa04b28cSMichael Grosse protected $searchConfig; 20fa04b28cSMichael Grosse /** 21fa04b28cSMichael Grosse * @var Column[] the list of columns to be displayed 22fa04b28cSMichael Grosse */ 23fa04b28cSMichael Grosse protected $columns; 24fa04b28cSMichael Grosse /** 25fa04b28cSMichael Grosse * @var Value[][] the search result 26fa04b28cSMichael Grosse */ 27fa04b28cSMichael Grosse protected $result; 28fa04b28cSMichael Grosse /** 29fa04b28cSMichael Grosse * @var int number of all results 30fa04b28cSMichael Grosse */ 31fa04b28cSMichael Grosse protected $resultCount; 32fa04b28cSMichael Grosse /** 33fa04b28cSMichael Grosse * @var string[] the result PIDs for each row 34fa04b28cSMichael Grosse */ 35fa04b28cSMichael Grosse protected $resultPIDs; 36fa04b28cSMichael Grosse /** 37fa04b28cSMichael Grosse * @var array for summing up columns 38fa04b28cSMichael Grosse */ 39fa04b28cSMichael Grosse protected $sums; 40fa04b28cSMichael Grosse /** 41fa04b28cSMichael Grosse * @var bool skip full table when no results found 42fa04b28cSMichael Grosse */ 43fa04b28cSMichael Grosse protected $simplenone = true; 44fa04b28cSMichael Grosse /** 45fa04b28cSMichael Grosse * @todo we might be able to get rid of this helper and move this to SearchConfig 46fa04b28cSMichael Grosse * @var \helper_plugin_struct_config 47fa04b28cSMichael Grosse */ 48fa04b28cSMichael Grosse protected $helper; 49fa04b28cSMichael Grosse /** 50fa04b28cSMichael Grosse * Initialize the Aggregation renderer and executes the search 51fa04b28cSMichael Grosse * 52fa04b28cSMichael Grosse * You need to call @see render() on the resulting object. 53fa04b28cSMichael Grosse * 54fa04b28cSMichael Grosse * @param string $id 55fa04b28cSMichael Grosse * @param string $mode 56fa04b28cSMichael Grosse * @param \Doku_Renderer $renderer 57fa04b28cSMichael Grosse * @param SearchConfig $searchConfig 58fa04b28cSMichael Grosse */ 59fa04b28cSMichael Grosse public function __construct($id, $mode, \Doku_Renderer $renderer, SearchConfig $searchConfig) { 60fa04b28cSMichael Grosse $this->id = $id; 61fa04b28cSMichael Grosse $this->mode = $mode; 62fa04b28cSMichael Grosse $this->renderer = $renderer; 63fa04b28cSMichael Grosse $this->searchConfig = $searchConfig; 64fa04b28cSMichael Grosse $this->data = $searchConfig->getConf(); 65fa04b28cSMichael Grosse $this->columns = $searchConfig->getColumns(); 66fa04b28cSMichael Grosse $this->result = $this->search(); //$this->searchConfig->execute(); 67fa04b28cSMichael Grosse //$this->resultCount = $this->searchConfig->getCount(); 68fa04b28cSMichael Grosse //$this->resultPIDs = $this->searchConfig->getPids(); 69fa04b28cSMichael Grosse $this->helper = plugin_load('helper', 'struct_config'); 70fa04b28cSMichael Grosse } 71fa04b28cSMichael Grosse 72fa04b28cSMichael Grosse public function search() { 73fa04b28cSMichael Grosse $QB = new QueryBuilder; 74fa04b28cSMichael Grosse $schema = $this->data['schemas'][0][0]; 75fa04b28cSMichael Grosse $colref = $this->columns[0]->getColref(); 76fa04b28cSMichael Grosse if ($this->columns[0]->getType()->isMulti()) { 77fa04b28cSMichael Grosse $table = 'multi_' . $schema; 78fa04b28cSMichael Grosse $col = 'value'; 79fa04b28cSMichael Grosse $QB->filters()->whereAnd('T1.colref='.$colref); 80fa04b28cSMichael Grosse } else { 81fa04b28cSMichael Grosse $table = 'data_' . $schema; 82fa04b28cSMichael Grosse $col = 'col' . $colref; 83fa04b28cSMichael Grosse } 84fa04b28cSMichael Grosse $QB->addTable($table, 'T1'); 85fa04b28cSMichael Grosse $QB->addSelectColumn('T1', $col, 'tag'); 86fa04b28cSMichael Grosse $QB->addSelectStatement("COUNT(T1.$col)", 'count'); 87fa04b28cSMichael Grosse $QB->filters()->whereAnd('T1.latest=1'); 88fa04b28cSMichael Grosse $QB->addGroupByStatement('tag'); 89fa04b28cSMichael Grosse $QB->addOrderBy('tag'); 90fa04b28cSMichael Grosse /* 91fa04b28cSMichael Grosse if ($min=$this->data['min']) { 92fa04b28cSMichael Grosse $QB->filters()->whereAnd("count > $min"); 93fa04b28cSMichael Grosse } 94fa04b28cSMichael Grosse */ 95fa04b28cSMichael Grosse $sql = $QB->getSQL(); 96fa04b28cSMichael Grosse $db = plugin_load('helper', 'struct_db')->getDB(); 97fa04b28cSMichael Grosse $res=$db->query($sql[0], $sql[1]); 98fa04b28cSMichael Grosse $results = $db->res2arr($res); 99fa04b28cSMichael Grosse $db->res_close($res); 100fa04b28cSMichael Grosse foreach ($results as &$result) { 101fa04b28cSMichael Grosse $result['tag'] = new Value($this->columns[0], $result['tag']); 102fa04b28cSMichael Grosse } 103fa04b28cSMichael Grosse return $results; 104fa04b28cSMichael Grosse } 105fa04b28cSMichael Grosse 106fa04b28cSMichael Grosse /** 107fa04b28cSMichael Grosse * Create the table on the renderer 108fa04b28cSMichael Grosse */ 109fa04b28cSMichael Grosse public function render() { 110fa04b28cSMichael Grosse $this->startScope(); 111fa04b28cSMichael Grosse $this->renderer->doc .= '<ul>'; 112fa04b28cSMichael Grosse foreach ($this->result as $result) { 113fa04b28cSMichael Grosse $this->renderResult($result); 114fa04b28cSMichael Grosse } 115fa04b28cSMichael Grosse $this->renderer->doc .= '</ul>'; 116fa04b28cSMichael Grosse $this->finishScope(); 117fa04b28cSMichael Grosse return; 118fa04b28cSMichael Grosse } 119fa04b28cSMichael Grosse /** 120fa04b28cSMichael Grosse * Adds additional info to document and renderer in XHTML mode 121fa04b28cSMichael Grosse * 122fa04b28cSMichael Grosse * @see finishScope() 123fa04b28cSMichael Grosse */ 124fa04b28cSMichael Grosse protected function startScope() { 125fa04b28cSMichael Grosse // unique identifier for this aggregation 126fa04b28cSMichael Grosse $this->renderer->info['struct_cloud_hash'] = md5(var_export($this->data, true)); 127fa04b28cSMichael Grosse // wrapping div 128fa04b28cSMichael Grosse if($this->mode != 'xhtml') return; 129fa04b28cSMichael Grosse $this->renderer->doc .= "<div class=\"structaggregation cloudaggregation\">"; 130fa04b28cSMichael Grosse } 131fa04b28cSMichael Grosse /** 132fa04b28cSMichael Grosse * Closes the table and anything opened in startScope() 133fa04b28cSMichael Grosse * 134fa04b28cSMichael Grosse * @see startScope() 135fa04b28cSMichael Grosse */ 136fa04b28cSMichael Grosse protected function finishScope() { 137fa04b28cSMichael Grosse // remove identifier from renderer again 138fa04b28cSMichael Grosse if(isset($this->renderer->info['struct_cloud_hash'])) { 139fa04b28cSMichael Grosse unset($this->renderer->info['struct_cloud_hash']); 140fa04b28cSMichael Grosse } 141fa04b28cSMichael Grosse // wrapping div 142fa04b28cSMichael Grosse if($this->mode != 'xhtml') return; 143fa04b28cSMichael Grosse $this->renderer->doc .= '</div>'; 144fa04b28cSMichael Grosse } 145fa04b28cSMichael Grosse protected function renderResult($result) { 146fa04b28cSMichael Grosse /** 147fa04b28cSMichael Grosse * @var Value $value 148fa04b28cSMichael Grosse */ 149fa04b28cSMichael Grosse $value = $result['tag']; 150fa04b28cSMichael Grosse $count = $result['count']; 151fa04b28cSMichael Grosse if ($value->isEmpty()) { 152fa04b28cSMichael Grosse return; 153fa04b28cSMichael Grosse } 154fa04b28cSMichael Grosse 155fa04b28cSMichael Grosse $raw = $value->getRawValue(); 156fa04b28cSMichael Grosse if (is_array($raw)) { 157fa04b28cSMichael Grosse $raw = $raw[0]; 158fa04b28cSMichael Grosse } 159fa04b28cSMichael Grosse $schema = $this->data['schemas'][0][0]; 160fa04b28cSMichael Grosse $col = $value->getColumn()->getLabel(); 161fa04b28cSMichael Grosse $this->renderer->doc .= '<li><div class="li">'; 162fa04b28cSMichael Grosse $this->renderer->doc .= '<div data-count="'. $count.'" class="' . $value->getColumn()->getLabel() . '">'; 163fa04b28cSMichael Grosse //$value->render($this->renderer, $this->mode); 164*1719449cSMichael Grosse $this->renderer->internallink("?flt[$schema.$col*~]=" . urlencode($raw),$raw); 165fa04b28cSMichael Grosse if ($column < $this->resultCount) { 166fa04b28cSMichael Grosse $this->renderer->doc .= ' '; 167fa04b28cSMichael Grosse } 168fa04b28cSMichael Grosse $this->renderer->doc .= '</div>'; 169fa04b28cSMichael Grosse $this->renderer->doc .= '</div></li>'; 170fa04b28cSMichael Grosse } 171fa04b28cSMichael Grosse}