1ea5ad12aSMichael Grosse<?php 2ea5ad12aSMichael Grosse 3ea5ad12aSMichael Grossenamespace dokuwiki\plugin\struct\meta; 4ea5ad12aSMichael Grosse 5ea5ad12aSMichael Grosse 6ea5ad12aSMichael Grosse/** 7ea5ad12aSMichael Grosse * Class AggregationList 8ea5ad12aSMichael Grosse * 9ea5ad12aSMichael Grosse * @package dokuwiki\plugin\struct\meta 10ea5ad12aSMichael Grosse */ 11ea5ad12aSMichael Grosseclass AggregationList { 12ea5ad12aSMichael Grosse 13ea5ad12aSMichael Grosse /** 14ea5ad12aSMichael Grosse * @var string the page id of the page this is rendered to 15ea5ad12aSMichael Grosse */ 16ea5ad12aSMichael Grosse protected $id; 17ea5ad12aSMichael Grosse /** 18ea5ad12aSMichael Grosse * @var string the Type of renderer used 19ea5ad12aSMichael Grosse */ 20ea5ad12aSMichael Grosse protected $mode; 21ea5ad12aSMichael Grosse /** 22ea5ad12aSMichael Grosse * @var \Doku_Renderer the DokuWiki renderer used to create the output 23ea5ad12aSMichael Grosse */ 24ea5ad12aSMichael Grosse protected $renderer; 25ea5ad12aSMichael Grosse /** 26ea5ad12aSMichael Grosse * @var SearchConfig the configured search - gives access to columns etc. 27ea5ad12aSMichael Grosse */ 28ea5ad12aSMichael Grosse protected $searchConfig; 29ea5ad12aSMichael Grosse 30ea5ad12aSMichael Grosse /** 31ea5ad12aSMichael Grosse * @var Column[] the list of columns to be displayed 32ea5ad12aSMichael Grosse */ 33ea5ad12aSMichael Grosse protected $columns; 34ea5ad12aSMichael Grosse 35ea5ad12aSMichael Grosse /** 36ea5ad12aSMichael Grosse * @var Value[][] the search result 37ea5ad12aSMichael Grosse */ 38ea5ad12aSMichael Grosse protected $result; 39ea5ad12aSMichael Grosse 40ea5ad12aSMichael Grosse /** 41ea5ad12aSMichael Grosse * @var int number of all results 42ea5ad12aSMichael Grosse */ 43ea5ad12aSMichael Grosse protected $resultColumnCount; 44ea5ad12aSMichael Grosse 45ea5ad12aSMichael Grosse /** 46ea5ad12aSMichael Grosse * Initialize the Aggregation renderer and executes the search 47ea5ad12aSMichael Grosse * 48ea5ad12aSMichael Grosse * You need to call @see render() on the resulting object. 49ea5ad12aSMichael Grosse * 50ea5ad12aSMichael Grosse * @param string $id 51ea5ad12aSMichael Grosse * @param string $mode 52ea5ad12aSMichael Grosse * @param \Doku_Renderer $renderer 53ea5ad12aSMichael Grosse * @param SearchConfig $searchConfig 54ea5ad12aSMichael Grosse */ 55ea5ad12aSMichael Grosse public function __construct($id, $mode, \Doku_Renderer $renderer, SearchConfig $searchConfig) { 56ea5ad12aSMichael Grosse $this->id = $id; 57ea5ad12aSMichael Grosse $this->mode = $mode; 58ea5ad12aSMichael Grosse $this->renderer = $renderer; 59ea5ad12aSMichael Grosse $this->searchConfig = $searchConfig; 60ea5ad12aSMichael Grosse $this->data = $searchConfig->getConf(); 61ea5ad12aSMichael Grosse $this->columns = $searchConfig->getColumns(); 62ea5ad12aSMichael Grosse 63ea5ad12aSMichael Grosse $this->result = $this->searchConfig->execute(); 64ea5ad12aSMichael Grosse $this->resultColumnCount = count($this->columns); 65ea5ad12aSMichael Grosse $this->resultPIDs = $this->searchConfig->getPids(); 66ea5ad12aSMichael Grosse } 67ea5ad12aSMichael Grosse 68ea5ad12aSMichael Grosse /** 69ea5ad12aSMichael Grosse * Create the list on the renderer 70ea5ad12aSMichael Grosse */ 71ea5ad12aSMichael Grosse public function render() { 72ea5ad12aSMichael Grosse 73ea5ad12aSMichael Grosse $this->startScope(); 74ea5ad12aSMichael Grosse 75*2c6e107cSMichael Grosse $this->renderer->listu_open(); 76ea5ad12aSMichael Grosse 77ea5ad12aSMichael Grosse foreach ($this->result as $result) { 78*2c6e107cSMichael Grosse $this->renderer->listitem_open(1); 79*2c6e107cSMichael Grosse $this->renderer->listcontent_open(); 80ea5ad12aSMichael Grosse $this->renderListItem($result); 81*2c6e107cSMichael Grosse $this->renderer->listcontent_close(); 82*2c6e107cSMichael Grosse $this->renderer->listitem_close(); 83ea5ad12aSMichael Grosse } 84ea5ad12aSMichael Grosse 85*2c6e107cSMichael Grosse $this->renderer->listu_close(); 86ea5ad12aSMichael Grosse 87ea5ad12aSMichael Grosse $this->finishScope(); 88ea5ad12aSMichael Grosse 89ea5ad12aSMichael Grosse return; 90ea5ad12aSMichael Grosse } 91ea5ad12aSMichael Grosse 92ea5ad12aSMichael Grosse /** 93ea5ad12aSMichael Grosse * Adds additional info to document and renderer in XHTML mode 94ea5ad12aSMichael Grosse * 95ea5ad12aSMichael Grosse * @see finishScope() 96ea5ad12aSMichael Grosse */ 97ea5ad12aSMichael Grosse protected function startScope() { 98ea5ad12aSMichael Grosse // wrapping div 99ea5ad12aSMichael Grosse if($this->mode != 'xhtml') return; 100ea5ad12aSMichael Grosse $this->renderer->doc .= "<div class=\"structaggregation listaggregation\">"; 101ea5ad12aSMichael Grosse } 102ea5ad12aSMichael Grosse 103ea5ad12aSMichael Grosse /** 104ea5ad12aSMichael Grosse * Closes anything opened in startScope() 105ea5ad12aSMichael Grosse * 106ea5ad12aSMichael Grosse * @see startScope() 107ea5ad12aSMichael Grosse */ 108ea5ad12aSMichael Grosse protected function finishScope() { 109ea5ad12aSMichael Grosse // wrapping div 110ea5ad12aSMichael Grosse if($this->mode != 'xhtml') return; 111ea5ad12aSMichael Grosse $this->renderer->doc .= '</div>'; 112ea5ad12aSMichael Grosse } 113ea5ad12aSMichael Grosse 114ea5ad12aSMichael Grosse /** 115ea5ad12aSMichael Grosse * @param $resultrow 116ea5ad12aSMichael Grosse */ 117ea5ad12aSMichael Grosse protected function renderListItem($resultrow) { 118ea5ad12aSMichael Grosse $sepbyheaders = $this->searchConfig->getConf()['sepbyheaders']; 119ea5ad12aSMichael Grosse $headers = $this->searchConfig->getConf()['headers']; 120ea5ad12aSMichael Grosse 121ea5ad12aSMichael Grosse /** 122ea5ad12aSMichael Grosse * @var Value $value 123ea5ad12aSMichael Grosse */ 124ea5ad12aSMichael Grosse foreach ($resultrow as $column => $value) { 125ea5ad12aSMichael Grosse if ($value->isEmpty()) { 126ea5ad12aSMichael Grosse continue; 127ea5ad12aSMichael Grosse } 128ea5ad12aSMichael Grosse if ($sepbyheaders && !empty($headers[$column])) { 129*2c6e107cSMichael Grosse if ($this->mode == 'xhtml') { 130ea5ad12aSMichael Grosse $this->renderer->doc .= '<span class="struct_header">' . hsc($headers[$column]) . '</span>'; 131*2c6e107cSMichael Grosse } else { 132*2c6e107cSMichael Grosse $this->renderer->cdata($headers[$column]); 133ea5ad12aSMichael Grosse } 134*2c6e107cSMichael Grosse } 135*2c6e107cSMichael Grosse if ($this->mode == 'xhtml') { 136ea5ad12aSMichael Grosse $type = 'struct_' . strtolower($value->getColumn()->getType()->getClass()); 137ea5ad12aSMichael Grosse $this->renderer->doc .= '<div class="' . $type . '">'; 138*2c6e107cSMichael Grosse } 139ea5ad12aSMichael Grosse $value->render($this->renderer, $this->mode); 140ea5ad12aSMichael Grosse if ($column < $this->resultColumnCount) { 141ea5ad12aSMichael Grosse $this->renderer->doc .= ' '; 142ea5ad12aSMichael Grosse } 143*2c6e107cSMichael Grosse if ($this->mode == 'xhtml') { 144ea5ad12aSMichael Grosse $this->renderer->doc .= '</div>'; 145ea5ad12aSMichael Grosse } 146*2c6e107cSMichael Grosse } 147ea5ad12aSMichael Grosse 148ea5ad12aSMichael Grosse } 149ea5ad12aSMichael Grosse} 150