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 */ 10d6d97f60SAnna Dabrowskaclass AggregationList 11d6d97f60SAnna Dabrowska{ 12ea5ad12aSMichael Grosse /** 13ea5ad12aSMichael Grosse * @var string the page id of the page this is rendered to 14ea5ad12aSMichael Grosse */ 15ea5ad12aSMichael Grosse protected $id; 16ea5ad12aSMichael Grosse /** 17ea5ad12aSMichael Grosse * @var string the Type of renderer used 18ea5ad12aSMichael Grosse */ 19ea5ad12aSMichael Grosse protected $mode; 20ea5ad12aSMichael Grosse /** 21ea5ad12aSMichael Grosse * @var \Doku_Renderer the DokuWiki renderer used to create the output 22ea5ad12aSMichael Grosse */ 23ea5ad12aSMichael Grosse protected $renderer; 24ea5ad12aSMichael Grosse /** 25ea5ad12aSMichael Grosse * @var SearchConfig the configured search - gives access to columns etc. 26ea5ad12aSMichael Grosse */ 27ea5ad12aSMichael Grosse protected $searchConfig; 28ea5ad12aSMichael Grosse 29ea5ad12aSMichael Grosse /** 30ea5ad12aSMichael Grosse * @var Column[] the list of columns to be displayed 31ea5ad12aSMichael Grosse */ 32ea5ad12aSMichael Grosse protected $columns; 33ea5ad12aSMichael Grosse 34ea5ad12aSMichael Grosse /** 35ea5ad12aSMichael Grosse * @var Value[][] the search result 36ea5ad12aSMichael Grosse */ 37ea5ad12aSMichael Grosse protected $result; 38ea5ad12aSMichael Grosse 39ea5ad12aSMichael Grosse /** 40ea5ad12aSMichael Grosse * @var int number of all results 41ea5ad12aSMichael Grosse */ 42ea5ad12aSMichael Grosse protected $resultColumnCount; 43ea5ad12aSMichael Grosse 44ea5ad12aSMichael Grosse /** 45ea5ad12aSMichael Grosse * Initialize the Aggregation renderer and executes the search 46ea5ad12aSMichael Grosse * 47*0549dcc5SAndreas Gohr * You need to call @param string $id 48ea5ad12aSMichael Grosse * @param string $mode 49ea5ad12aSMichael Grosse * @param \Doku_Renderer $renderer 50ea5ad12aSMichael Grosse * @param SearchConfig $searchConfig 51*0549dcc5SAndreas Gohr * @see render() on the resulting object. 52*0549dcc5SAndreas Gohr * 53ea5ad12aSMichael Grosse */ 54d6d97f60SAnna Dabrowska public function __construct($id, $mode, \Doku_Renderer $renderer, SearchConfig $searchConfig) 55d6d97f60SAnna Dabrowska { 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 */ 71d6d97f60SAnna Dabrowska public function render() 72d6d97f60SAnna Dabrowska { 73ea5ad12aSMichael Grosse 74ea5ad12aSMichael Grosse $this->startScope(); 75ea5ad12aSMichael Grosse 762c6e107cSMichael Grosse $this->renderer->listu_open(); 77ea5ad12aSMichael Grosse 78ea5ad12aSMichael Grosse foreach ($this->result as $result) { 792c6e107cSMichael Grosse $this->renderer->listitem_open(1); 802c6e107cSMichael Grosse $this->renderer->listcontent_open(); 81ea5ad12aSMichael Grosse $this->renderListItem($result); 822c6e107cSMichael Grosse $this->renderer->listcontent_close(); 832c6e107cSMichael Grosse $this->renderer->listitem_close(); 84ea5ad12aSMichael Grosse } 85ea5ad12aSMichael Grosse 862c6e107cSMichael Grosse $this->renderer->listu_close(); 87ea5ad12aSMichael Grosse 88ea5ad12aSMichael Grosse $this->finishScope(); 89ea5ad12aSMichael Grosse 90ea5ad12aSMichael Grosse return; 91ea5ad12aSMichael Grosse } 92ea5ad12aSMichael Grosse 93ea5ad12aSMichael Grosse /** 94ea5ad12aSMichael Grosse * Adds additional info to document and renderer in XHTML mode 95ea5ad12aSMichael Grosse * 96ea5ad12aSMichael Grosse * @see finishScope() 97ea5ad12aSMichael Grosse */ 98d6d97f60SAnna Dabrowska protected function startScope() 99d6d97f60SAnna Dabrowska { 100ea5ad12aSMichael Grosse // wrapping div 101ea5ad12aSMichael Grosse if ($this->mode != 'xhtml') return; 102ea5ad12aSMichael Grosse $this->renderer->doc .= "<div class=\"structaggregation listaggregation\">"; 103ea5ad12aSMichael Grosse } 104ea5ad12aSMichael Grosse 105ea5ad12aSMichael Grosse /** 106ea5ad12aSMichael Grosse * Closes anything opened in startScope() 107ea5ad12aSMichael Grosse * 108ea5ad12aSMichael Grosse * @see startScope() 109ea5ad12aSMichael Grosse */ 110d6d97f60SAnna Dabrowska protected function finishScope() 111d6d97f60SAnna Dabrowska { 112ea5ad12aSMichael Grosse // wrapping div 113ea5ad12aSMichael Grosse if ($this->mode != 'xhtml') return; 114ea5ad12aSMichael Grosse $this->renderer->doc .= '</div>'; 115ea5ad12aSMichael Grosse } 116ea5ad12aSMichael Grosse 117ea5ad12aSMichael Grosse /** 118ea5ad12aSMichael Grosse * @param $resultrow 119ea5ad12aSMichael Grosse */ 120d6d97f60SAnna Dabrowska protected function renderListItem($resultrow) 121d6d97f60SAnna Dabrowska { 122ea5ad12aSMichael Grosse $sepbyheaders = $this->searchConfig->getConf()['sepbyheaders']; 123ea5ad12aSMichael Grosse $headers = $this->searchConfig->getConf()['headers']; 124ea5ad12aSMichael Grosse 125ea5ad12aSMichael Grosse /** 126ea5ad12aSMichael Grosse * @var Value $value 127ea5ad12aSMichael Grosse */ 128ea5ad12aSMichael Grosse foreach ($resultrow as $column => $value) { 129ea5ad12aSMichael Grosse if ($value->isEmpty()) { 130ea5ad12aSMichael Grosse continue; 131ea5ad12aSMichael Grosse } 132ea5ad12aSMichael Grosse if ($sepbyheaders && !empty($headers[$column])) { 1332c6e107cSMichael Grosse if ($this->mode == 'xhtml') { 134ea5ad12aSMichael Grosse $this->renderer->doc .= '<span class="struct_header">' . hsc($headers[$column]) . '</span>'; 1352c6e107cSMichael Grosse } else { 1362c6e107cSMichael Grosse $this->renderer->cdata($headers[$column]); 137ea5ad12aSMichael Grosse } 1382c6e107cSMichael Grosse } 1392c6e107cSMichael Grosse if ($this->mode == 'xhtml') { 140ea5ad12aSMichael Grosse $type = 'struct_' . strtolower($value->getColumn()->getType()->getClass()); 141ea5ad12aSMichael Grosse $this->renderer->doc .= '<div class="' . $type . '">'; 1422c6e107cSMichael Grosse } 143ea5ad12aSMichael Grosse $value->render($this->renderer, $this->mode); 144ea5ad12aSMichael Grosse if ($column < $this->resultColumnCount) { 1454b303cdaSMichael Grosse $this->renderer->cdata(' '); 146ea5ad12aSMichael Grosse } 1472c6e107cSMichael Grosse if ($this->mode == 'xhtml') { 148ea5ad12aSMichael Grosse $this->renderer->doc .= '</div>'; 149ea5ad12aSMichael Grosse } 1502c6e107cSMichael Grosse } 151ea5ad12aSMichael Grosse } 152ea5ad12aSMichael Grosse} 153