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