1ea5ad12aSMichael Grosse<?php 2ea5ad12aSMichael Grosse 3ea5ad12aSMichael Grossenamespace dokuwiki\plugin\struct\meta; 4ea5ad12aSMichael Grosse 5ea5ad12aSMichael Grosse/** 6ea5ad12aSMichael Grosse * Class AggregationList 7ea5ad12aSMichael Grosse * 8ea5ad12aSMichael Grosse * @package dokuwiki\plugin\struct\meta 9ea5ad12aSMichael Grosse */ 10*d6d97f60SAnna Dabrowskaclass AggregationList 11*d6d97f60SAnna Dabrowska{ 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 */ 55*d6d97f60SAnna Dabrowska public function __construct($id, $mode, \Doku_Renderer $renderer, SearchConfig $searchConfig) 56*d6d97f60SAnna Dabrowska { 57ea5ad12aSMichael Grosse $this->id = $id; 58ea5ad12aSMichael Grosse $this->mode = $mode; 59ea5ad12aSMichael Grosse $this->renderer = $renderer; 60ea5ad12aSMichael Grosse $this->searchConfig = $searchConfig; 61ea5ad12aSMichael Grosse $this->data = $searchConfig->getConf(); 62ea5ad12aSMichael Grosse $this->columns = $searchConfig->getColumns(); 63ea5ad12aSMichael Grosse 64ea5ad12aSMichael Grosse $this->result = $this->searchConfig->execute(); 65ea5ad12aSMichael Grosse $this->resultColumnCount = count($this->columns); 66ea5ad12aSMichael Grosse $this->resultPIDs = $this->searchConfig->getPids(); 67ea5ad12aSMichael Grosse } 68ea5ad12aSMichael Grosse 69ea5ad12aSMichael Grosse /** 70ea5ad12aSMichael Grosse * Create the list on the renderer 71ea5ad12aSMichael Grosse */ 72*d6d97f60SAnna Dabrowska public function render() 73*d6d97f60SAnna Dabrowska { 74ea5ad12aSMichael Grosse 75ea5ad12aSMichael Grosse $this->startScope(); 76ea5ad12aSMichael Grosse 772c6e107cSMichael Grosse $this->renderer->listu_open(); 78ea5ad12aSMichael Grosse 79ea5ad12aSMichael Grosse foreach ($this->result as $result) { 802c6e107cSMichael Grosse $this->renderer->listitem_open(1); 812c6e107cSMichael Grosse $this->renderer->listcontent_open(); 82ea5ad12aSMichael Grosse $this->renderListItem($result); 832c6e107cSMichael Grosse $this->renderer->listcontent_close(); 842c6e107cSMichael Grosse $this->renderer->listitem_close(); 85ea5ad12aSMichael Grosse } 86ea5ad12aSMichael Grosse 872c6e107cSMichael Grosse $this->renderer->listu_close(); 88ea5ad12aSMichael Grosse 89ea5ad12aSMichael Grosse $this->finishScope(); 90ea5ad12aSMichael Grosse 91ea5ad12aSMichael Grosse return; 92ea5ad12aSMichael Grosse } 93ea5ad12aSMichael Grosse 94ea5ad12aSMichael Grosse /** 95ea5ad12aSMichael Grosse * Adds additional info to document and renderer in XHTML mode 96ea5ad12aSMichael Grosse * 97ea5ad12aSMichael Grosse * @see finishScope() 98ea5ad12aSMichael Grosse */ 99*d6d97f60SAnna Dabrowska protected function startScope() 100*d6d97f60SAnna Dabrowska { 101ea5ad12aSMichael Grosse // wrapping div 102ea5ad12aSMichael Grosse if ($this->mode != 'xhtml') return; 103ea5ad12aSMichael Grosse $this->renderer->doc .= "<div class=\"structaggregation listaggregation\">"; 104ea5ad12aSMichael Grosse } 105ea5ad12aSMichael Grosse 106ea5ad12aSMichael Grosse /** 107ea5ad12aSMichael Grosse * Closes anything opened in startScope() 108ea5ad12aSMichael Grosse * 109ea5ad12aSMichael Grosse * @see startScope() 110ea5ad12aSMichael Grosse */ 111*d6d97f60SAnna Dabrowska protected function finishScope() 112*d6d97f60SAnna Dabrowska { 113ea5ad12aSMichael Grosse // wrapping div 114ea5ad12aSMichael Grosse if ($this->mode != 'xhtml') return; 115ea5ad12aSMichael Grosse $this->renderer->doc .= '</div>'; 116ea5ad12aSMichael Grosse } 117ea5ad12aSMichael Grosse 118ea5ad12aSMichael Grosse /** 119ea5ad12aSMichael Grosse * @param $resultrow 120ea5ad12aSMichael Grosse */ 121*d6d97f60SAnna Dabrowska protected function renderListItem($resultrow) 122*d6d97f60SAnna Dabrowska { 123ea5ad12aSMichael Grosse $sepbyheaders = $this->searchConfig->getConf()['sepbyheaders']; 124ea5ad12aSMichael Grosse $headers = $this->searchConfig->getConf()['headers']; 125ea5ad12aSMichael Grosse 126ea5ad12aSMichael Grosse /** 127ea5ad12aSMichael Grosse * @var Value $value 128ea5ad12aSMichael Grosse */ 129ea5ad12aSMichael Grosse foreach ($resultrow as $column => $value) { 130ea5ad12aSMichael Grosse if ($value->isEmpty()) { 131ea5ad12aSMichael Grosse continue; 132ea5ad12aSMichael Grosse } 133ea5ad12aSMichael Grosse if ($sepbyheaders && !empty($headers[$column])) { 1342c6e107cSMichael Grosse if ($this->mode == 'xhtml') { 135ea5ad12aSMichael Grosse $this->renderer->doc .= '<span class="struct_header">' . hsc($headers[$column]) . '</span>'; 1362c6e107cSMichael Grosse } else { 1372c6e107cSMichael Grosse $this->renderer->cdata($headers[$column]); 138ea5ad12aSMichael Grosse } 1392c6e107cSMichael Grosse } 1402c6e107cSMichael Grosse if ($this->mode == 'xhtml') { 141ea5ad12aSMichael Grosse $type = 'struct_' . strtolower($value->getColumn()->getType()->getClass()); 142ea5ad12aSMichael Grosse $this->renderer->doc .= '<div class="' . $type . '">'; 1432c6e107cSMichael Grosse } 144ea5ad12aSMichael Grosse $value->render($this->renderer, $this->mode); 145ea5ad12aSMichael Grosse if ($column < $this->resultColumnCount) { 1464b303cdaSMichael Grosse $this->renderer->cdata(' '); 147ea5ad12aSMichael Grosse } 1482c6e107cSMichael Grosse if ($this->mode == 'xhtml') { 149ea5ad12aSMichael Grosse $this->renderer->doc .= '</div>'; 150ea5ad12aSMichael Grosse } 1512c6e107cSMichael Grosse } 152ea5ad12aSMichael Grosse } 153ea5ad12aSMichael Grosse} 154