107993756SAndreas Gohr<?php 207993756SAndreas Gohr 3ba766201SAndreas Gohrnamespace dokuwiki\plugin\struct\meta; 407993756SAndreas Gohr 5d60f71efSAndreas Gohr/** 6d60f71efSAndreas Gohr * Creates the table aggregation output 7d60f71efSAndreas Gohr * 8ba766201SAndreas Gohr * @package dokuwiki\plugin\struct\meta 9d60f71efSAndreas Gohr */ 1007993756SAndreas Gohrclass AggregationTable { 1107993756SAndreas Gohr 1207993756SAndreas Gohr /** 1307993756SAndreas Gohr * @var string the page id of the page this is rendered to 1407993756SAndreas Gohr */ 1507993756SAndreas Gohr protected $id; 1607993756SAndreas Gohr /** 1707993756SAndreas Gohr * @var string the Type of renderer used 1807993756SAndreas Gohr */ 1907993756SAndreas Gohr protected $mode; 2007993756SAndreas Gohr /** 2107993756SAndreas Gohr * @var \Doku_Renderer the DokuWiki renderer used to create the output 2207993756SAndreas Gohr */ 2307993756SAndreas Gohr protected $renderer; 2407993756SAndreas Gohr /** 2507993756SAndreas Gohr * @var SearchConfig the configured search - gives access to columns etc. 2607993756SAndreas Gohr */ 2707993756SAndreas Gohr protected $searchConfig; 2807993756SAndreas Gohr 2907993756SAndreas Gohr /** 3007993756SAndreas Gohr * @var Column[] the list of columns to be displayed 3107993756SAndreas Gohr */ 3207993756SAndreas Gohr protected $columns; 3307993756SAndreas Gohr 3407993756SAndreas Gohr /** 3507993756SAndreas Gohr * @var Value[][] the search result 3607993756SAndreas Gohr */ 3707993756SAndreas Gohr protected $result; 3807993756SAndreas Gohr 3907993756SAndreas Gohr /** 4007993756SAndreas Gohr * @var int number of all results 4107993756SAndreas Gohr */ 4207993756SAndreas Gohr protected $resultCount; 4307993756SAndreas Gohr 4407993756SAndreas Gohr /** 45d4b5a17cSAndreas Gohr * @var string[] the result PIDs for each row 46d4b5a17cSAndreas Gohr */ 47d4b5a17cSAndreas Gohr protected $resultPIDs; 48*0ceefd5cSAnna Dabrowska protected $resultRids; 49d4b5a17cSAndreas Gohr 50d4b5a17cSAndreas Gohr /** 5107993756SAndreas Gohr * @var array for summing up columns 5207993756SAndreas Gohr */ 5307993756SAndreas Gohr protected $sums; 5407993756SAndreas Gohr 5507993756SAndreas Gohr /** 566b5e52fdSAndreas Gohr * @var bool skip full table when no results found 576b5e52fdSAndreas Gohr */ 586b5e52fdSAndreas Gohr protected $simplenone = true; 596b5e52fdSAndreas Gohr 606b5e52fdSAndreas Gohr /** 6107993756SAndreas Gohr * @todo we might be able to get rid of this helper and move this to SearchConfig 6207993756SAndreas Gohr * @var \helper_plugin_struct_config 6307993756SAndreas Gohr */ 6407993756SAndreas Gohr protected $helper; 6507993756SAndreas Gohr 6607993756SAndreas Gohr /** 6707993756SAndreas Gohr * Initialize the Aggregation renderer and executes the search 6807993756SAndreas Gohr * 6907993756SAndreas Gohr * You need to call @see render() on the resulting object. 7007993756SAndreas Gohr * 7107993756SAndreas Gohr * @param string $id 7207993756SAndreas Gohr * @param string $mode 7307993756SAndreas Gohr * @param \Doku_Renderer $renderer 7407993756SAndreas Gohr * @param SearchConfig $searchConfig 7507993756SAndreas Gohr */ 7607993756SAndreas Gohr public function __construct($id, $mode, \Doku_Renderer $renderer, SearchConfig $searchConfig) { 7707993756SAndreas Gohr $this->id = $id; 7807993756SAndreas Gohr $this->mode = $mode; 7907993756SAndreas Gohr $this->renderer = $renderer; 8007993756SAndreas Gohr $this->searchConfig = $searchConfig; 8107993756SAndreas Gohr $this->data = $searchConfig->getConf(); 8207993756SAndreas Gohr $this->columns = $searchConfig->getColumns(); 8307993756SAndreas Gohr 8407993756SAndreas Gohr $this->result = $this->searchConfig->execute(); 8507993756SAndreas Gohr $this->resultCount = $this->searchConfig->getCount(); 86d4b5a17cSAndreas Gohr $this->resultPIDs = $this->searchConfig->getPids(); 87*0ceefd5cSAnna Dabrowska $this->resultRids = $this->searchConfig->getRids(); 8807993756SAndreas Gohr $this->helper = plugin_load('helper', 'struct_config'); 8907993756SAndreas Gohr } 9007993756SAndreas Gohr 9107993756SAndreas Gohr /** 9207993756SAndreas Gohr * Create the table on the renderer 9307993756SAndreas Gohr */ 9407993756SAndreas Gohr public function render() { 95b7e1d73bSAndreas Gohr 96b7e1d73bSAndreas Gohr // abort early if there are no results at all (not filtered) 976b5e52fdSAndreas Gohr if(!$this->resultCount && !$this->isDynamicallyFiltered() && $this->simplenone) { 98b7e1d73bSAndreas Gohr $this->startScope(); 99b7e1d73bSAndreas Gohr $this->renderer->cdata($this->helper->getLang('none')); 100b7e1d73bSAndreas Gohr $this->finishScope(); 101b7e1d73bSAndreas Gohr return; 102b7e1d73bSAndreas Gohr } 103b7e1d73bSAndreas Gohr 10407993756SAndreas Gohr // table open 10507993756SAndreas Gohr $this->startScope(); 106986ab7e6SAndreas Gohr $this->renderActiveFilters(); 10707993756SAndreas Gohr $this->renderer->table_open(); 10807993756SAndreas Gohr 10907993756SAndreas Gohr // header 11007993756SAndreas Gohr $this->renderer->tablethead_open(); 111986ab7e6SAndreas Gohr $this->renderColumnHeaders(); 112986ab7e6SAndreas Gohr $this->renderDynamicFilters(); 11307993756SAndreas Gohr $this->renderer->tablethead_close(); 11407993756SAndreas Gohr 11507993756SAndreas Gohr if($this->resultCount) { 11607993756SAndreas Gohr // actual data 117a9fd81f9SAndreas Gohr $this->renderer->tabletbody_open(); 118986ab7e6SAndreas Gohr $this->renderResult(); 119a9fd81f9SAndreas Gohr $this->renderer->tabletbody_close(); 12007993756SAndreas Gohr 121a9fd81f9SAndreas Gohr // footer (tfoot is develonly currently) 122a9fd81f9SAndreas Gohr if(method_exists($this->renderer, 'tabletfoot_open')) $this->renderer->tabletfoot_open(); 123986ab7e6SAndreas Gohr $this->renderSums(); 124986ab7e6SAndreas Gohr $this->renderPagingControls(); 125a9fd81f9SAndreas Gohr if(method_exists($this->renderer, 'tabletfoot_close')) $this->renderer->tabletfoot_close(); 12607993756SAndreas Gohr } else { 12707993756SAndreas Gohr // nothing found 128986ab7e6SAndreas Gohr $this->renderEmptyResult(); 12907993756SAndreas Gohr } 13007993756SAndreas Gohr 13107993756SAndreas Gohr // table close 13207993756SAndreas Gohr $this->renderer->table_close(); 13309dd691aSAndreas Gohr 13409dd691aSAndreas Gohr // export handle 13509dd691aSAndreas Gohr $this->renderExportControls(); 13607993756SAndreas Gohr $this->finishScope(); 13707993756SAndreas Gohr } 13807993756SAndreas Gohr 13907993756SAndreas Gohr /** 14007993756SAndreas Gohr * Adds additional info to document and renderer in XHTML mode 14107993756SAndreas Gohr * 14207993756SAndreas Gohr * @see finishScope() 14307993756SAndreas Gohr */ 14407993756SAndreas Gohr protected function startScope() { 14507993756SAndreas Gohr // unique identifier for this aggregation 14607993756SAndreas Gohr $this->renderer->info['struct_table_hash'] = md5(var_export($this->data, true)); 14709dd691aSAndreas Gohr 14809dd691aSAndreas Gohr // wrapping div 14909dd691aSAndreas Gohr if($this->mode != 'xhtml') return; 15009dd691aSAndreas Gohr $this->renderer->doc .= "<div class=\"structaggregation\">"; 15107993756SAndreas Gohr } 15207993756SAndreas Gohr 15307993756SAndreas Gohr /** 15407993756SAndreas Gohr * Closes the table and anything opened in startScope() 15507993756SAndreas Gohr * 15607993756SAndreas Gohr * @see startScope() 15707993756SAndreas Gohr */ 15807993756SAndreas Gohr protected function finishScope() { 15907993756SAndreas Gohr // remove identifier from renderer again 16007993756SAndreas Gohr if(isset($this->renderer->info['struct_table_hash'])) { 16107993756SAndreas Gohr unset($this->renderer->info['struct_table_hash']); 16207993756SAndreas Gohr } 16309dd691aSAndreas Gohr 16409dd691aSAndreas Gohr // wrapping div 16509dd691aSAndreas Gohr if($this->mode != 'xhtml') return; 16609dd691aSAndreas Gohr $this->renderer->doc .= '</div>'; 16707993756SAndreas Gohr } 16807993756SAndreas Gohr 16907993756SAndreas Gohr /** 17007993756SAndreas Gohr * Displays info about the currently applied filters 17107993756SAndreas Gohr */ 172986ab7e6SAndreas Gohr protected function renderActiveFilters() { 17307993756SAndreas Gohr if($this->mode != 'xhtml') return; 17407993756SAndreas Gohr $dynamic = $this->searchConfig->getDynamicParameters(); 17507993756SAndreas Gohr $filters = $dynamic->getFilters(); 17607993756SAndreas Gohr if(!$filters) return; 17707993756SAndreas Gohr 17807993756SAndreas Gohr $fltrs = array(); 17907993756SAndreas Gohr foreach($filters as $column => $filter) { 18007993756SAndreas Gohr list($comp, $value) = $filter; 18104ec4785SAnna Dabrowska 18204ec4785SAnna Dabrowska // display the filters in a human readable format 18304ec4785SAnna Dabrowska foreach ($this->columns as $col) { 18404ec4785SAnna Dabrowska if ($column === $col->getFullQualifiedLabel()) { 18504ec4785SAnna Dabrowska $column = $col->getTranslatedLabel(); 18604ec4785SAnna Dabrowska } 18704ec4785SAnna Dabrowska } 1881f075418SAnna Dabrowska $fltrs[] = sprintf('"%s" %s "%s"', $column, $this->helper->getLang("comparator $comp"), $value); 18907993756SAndreas Gohr } 19007993756SAndreas Gohr 19107993756SAndreas Gohr $this->renderer->doc .= '<div class="filter">'; 19207993756SAndreas Gohr $this->renderer->doc .= '<h4>' . sprintf($this->helper->getLang('tablefilteredby'), hsc(implode(' & ', $fltrs))) . '</h4>'; 19307993756SAndreas Gohr $this->renderer->doc .= '<div class="resetfilter">'; 19407993756SAndreas Gohr $this->renderer->internallink($this->id, $this->helper->getLang('tableresetfilter')); 19507993756SAndreas Gohr $this->renderer->doc .= '</div>'; 19607993756SAndreas Gohr $this->renderer->doc .= '</div>'; 19707993756SAndreas Gohr } 19807993756SAndreas Gohr 19907993756SAndreas Gohr /** 20007993756SAndreas Gohr * Shows the column headers with links to sort by column 20107993756SAndreas Gohr */ 202986ab7e6SAndreas Gohr protected function renderColumnHeaders() { 20307993756SAndreas Gohr $this->renderer->tablerow_open(); 20407993756SAndreas Gohr 20507993756SAndreas Gohr // additional column for row numbers 20607993756SAndreas Gohr if($this->data['rownumbers']) { 20707993756SAndreas Gohr $this->renderer->tableheader_open(); 20807993756SAndreas Gohr $this->renderer->cdata('#'); 20907993756SAndreas Gohr $this->renderer->tableheader_close(); 21007993756SAndreas Gohr } 21107993756SAndreas Gohr 21207993756SAndreas Gohr // show all headers 2138c4ee9beSAndreas Gohr foreach($this->columns as $num => $column) { 2148c4ee9beSAndreas Gohr $header = ''; 2158c4ee9beSAndreas Gohr if(isset($this->data['headers'][$num])) { 2168c4ee9beSAndreas Gohr $header = $this->data['headers'][$num]; 2178c4ee9beSAndreas Gohr } 21807993756SAndreas Gohr 21907993756SAndreas Gohr // use field label if no header was set 22007993756SAndreas Gohr if(blank($header)) { 22101f8b845SAndreas Gohr if(is_a($column, 'dokuwiki\plugin\struct\meta\Column')) { 22207993756SAndreas Gohr $header = $column->getTranslatedLabel(); 22307993756SAndreas Gohr } else { 22407993756SAndreas Gohr $header = 'column ' . $num; // this should never happen 22507993756SAndreas Gohr } 22607993756SAndreas Gohr } 22707993756SAndreas Gohr 22807993756SAndreas Gohr // simple mode first 22907993756SAndreas Gohr if($this->mode != 'xhtml') { 23007993756SAndreas Gohr $this->renderer->tableheader_open(); 23107993756SAndreas Gohr $this->renderer->cdata($header); 23207993756SAndreas Gohr $this->renderer->tableheader_close(); 23307993756SAndreas Gohr continue; 23407993756SAndreas Gohr } 23507993756SAndreas Gohr 23607993756SAndreas Gohr // still here? create custom header for more flexibility 23707993756SAndreas Gohr 2389113d04aSAndreas Gohr // width setting, widths are prevalidated, no escape needed 23907993756SAndreas Gohr $width = ''; 2409113d04aSAndreas Gohr if(isset($this->data['widths'][$num]) && $this->data['widths'][$num] != '-') { 2419113d04aSAndreas Gohr $width = ' style="min-width: ' . $this->data['widths'][$num] . ';'. 2429113d04aSAndreas Gohr 'max-width: ' . $this->data['widths'][$num] . ';"'; 24307993756SAndreas Gohr } 24407993756SAndreas Gohr 245d4b5a17cSAndreas Gohr // prepare data attribute for inline edits 246d4b5a17cSAndreas Gohr if(!is_a($column, '\dokuwiki\plugin\struct\meta\PageColumn') && 247d4b5a17cSAndreas Gohr !is_a($column, '\dokuwiki\plugin\struct\meta\RevisionColumn') 248d4b5a17cSAndreas Gohr ) { 249d4b5a17cSAndreas Gohr $data = 'data-field="' . hsc($column->getFullQualifiedLabel()) . '"'; 250d4b5a17cSAndreas Gohr } else { 251d4b5a17cSAndreas Gohr $data = ''; 252d4b5a17cSAndreas Gohr } 253d4b5a17cSAndreas Gohr 25407993756SAndreas Gohr // sort indicator and link 25507993756SAndreas Gohr $sortclass = ''; 25607993756SAndreas Gohr $sorts = $this->searchConfig->getSorts(); 25707993756SAndreas Gohr $dynamic = $this->searchConfig->getDynamicParameters(); 258aa124708SAndreas Gohr $dynamic->setSort($column, true); 25907993756SAndreas Gohr if(isset($sorts[$column->getFullQualifiedLabel()])) { 260aa124708SAndreas Gohr list(/*colname*/, $currentSort) = $sorts[$column->getFullQualifiedLabel()]; 261aa124708SAndreas Gohr if($currentSort) { 26207993756SAndreas Gohr $sortclass = 'sort-down'; 26307993756SAndreas Gohr $dynamic->setSort($column, false); 26407993756SAndreas Gohr } else { 26507993756SAndreas Gohr $sortclass = 'sort-up'; 26607993756SAndreas Gohr } 26707993756SAndreas Gohr } 26807993756SAndreas Gohr $link = wl($this->id, $dynamic->getURLParameters()); 26907993756SAndreas Gohr 27007993756SAndreas Gohr // output XHTML header 271d4b5a17cSAndreas Gohr $this->renderer->doc .= "<th $width $data>"; 27207993756SAndreas Gohr $this->renderer->doc .= '<a href="' . $link . '" class="' . $sortclass . '" title="' . $this->helper->getLang('sort') . '">' . hsc($header) . '</a>'; 27307993756SAndreas Gohr $this->renderer->doc .= '</th>'; 27407993756SAndreas Gohr } 27507993756SAndreas Gohr 27607993756SAndreas Gohr $this->renderer->tablerow_close(); 27707993756SAndreas Gohr } 27807993756SAndreas Gohr 27907993756SAndreas Gohr /** 280b7e1d73bSAndreas Gohr * Is the result set currently dynamically filtered? 281b7e1d73bSAndreas Gohr * @return bool 282b7e1d73bSAndreas Gohr */ 283b7e1d73bSAndreas Gohr protected function isDynamicallyFiltered() { 284b7e1d73bSAndreas Gohr if($this->mode != 'xhtml') return false; 285b7e1d73bSAndreas Gohr if(!$this->data['dynfilters']) return false; 286b7e1d73bSAndreas Gohr 287b7e1d73bSAndreas Gohr $dynamic = $this->searchConfig->getDynamicParameters(); 288b7e1d73bSAndreas Gohr return (bool) $dynamic->getFilters(); 289b7e1d73bSAndreas Gohr } 290b7e1d73bSAndreas Gohr 291b7e1d73bSAndreas Gohr /** 29207993756SAndreas Gohr * Add input fields for dynamic filtering 29307993756SAndreas Gohr */ 294986ab7e6SAndreas Gohr protected function renderDynamicFilters() { 29507993756SAndreas Gohr if($this->mode != 'xhtml') return; 29607993756SAndreas Gohr if(!$this->data['dynfilters']) return; 2971bc467a4SMichael Grosse if (is_a($this->renderer, 'renderer_plugin_dw2pdf')) { 298e6ae02ecSMichael Grosse return; 299e6ae02ecSMichael Grosse } 3001bc467a4SMichael Grosse global $conf; 30107993756SAndreas Gohr 30207993756SAndreas Gohr $this->renderer->doc .= '<tr class="dataflt">'; 30307993756SAndreas Gohr 30407993756SAndreas Gohr // add extra column for row numbers 30507993756SAndreas Gohr if($this->data['rownumbers']) { 30607993756SAndreas Gohr $this->renderer->doc .= '<th></th>'; 30707993756SAndreas Gohr } 30807993756SAndreas Gohr 30907993756SAndreas Gohr // each column gets a form 31007993756SAndreas Gohr foreach($this->columns as $column) { 31107993756SAndreas Gohr $this->renderer->doc .= '<th>'; 31207993756SAndreas Gohr { 31307993756SAndreas Gohr $form = new \Doku_Form(array('method' => 'GET', 'action' => wl($this->id))); 31476195677SAndreas Gohr unset($form->_hidden['sectok']); // we don't need it here 31576195677SAndreas Gohr if(!$conf['userewrite']) $form->addHidden('id', $this->id); 31607993756SAndreas Gohr 31707993756SAndreas Gohr // current value 31807993756SAndreas Gohr $dynamic = $this->searchConfig->getDynamicParameters(); 31907993756SAndreas Gohr $filters = $dynamic->getFilters(); 32007993756SAndreas Gohr if(isset($filters[$column->getFullQualifiedLabel()])) { 32107993756SAndreas Gohr list(, $current) = $filters[$column->getFullQualifiedLabel()]; 32207993756SAndreas Gohr $dynamic->removeFilter($column); 32307993756SAndreas Gohr } else { 32407993756SAndreas Gohr $current = ''; 32507993756SAndreas Gohr } 32607993756SAndreas Gohr 32707993756SAndreas Gohr // Add current request params 32807993756SAndreas Gohr $params = $dynamic->getURLParameters(); 32907993756SAndreas Gohr foreach($params as $key => $val) { 33007993756SAndreas Gohr $form->addHidden($key, $val); 33107993756SAndreas Gohr } 33207993756SAndreas Gohr 33307993756SAndreas Gohr // add input field 334db9b8745SAndreas Gohr $key = $column->getFullQualifiedLabel() . $column->getType()->getDefaultComparator(); 335d60f71efSAndreas Gohr $form->addElement(form_makeField('text', SearchConfigParameters::$PARAM_FILTER . '[' . $key . ']', $current, '')); 33607993756SAndreas Gohr $this->renderer->doc .= $form->getForm(); 33707993756SAndreas Gohr } 33807993756SAndreas Gohr $this->renderer->doc .= '</th>'; 33907993756SAndreas Gohr } 34007993756SAndreas Gohr $this->renderer->doc .= '</tr>'; 34107993756SAndreas Gohr 34207993756SAndreas Gohr } 34307993756SAndreas Gohr 34407993756SAndreas Gohr /** 34507993756SAndreas Gohr * Display the actual table data 34607993756SAndreas Gohr */ 347986ab7e6SAndreas Gohr protected function renderResult() { 34807993756SAndreas Gohr foreach($this->result as $rownum => $row) { 349f107f479SAndreas Gohr $this->renderResultRow($rownum, $row); 350f107f479SAndreas Gohr } 351f107f479SAndreas Gohr } 352f107f479SAndreas Gohr 353f107f479SAndreas Gohr /** 354f107f479SAndreas Gohr * Render a single result row 355f107f479SAndreas Gohr * 356f107f479SAndreas Gohr * @param int $rownum 357f107f479SAndreas Gohr * @param array $row 358f107f479SAndreas Gohr */ 359f107f479SAndreas Gohr protected function renderResultRow($rownum, $row) { 36007993756SAndreas Gohr $this->renderer->tablerow_open(); 36107993756SAndreas Gohr 362d4b5a17cSAndreas Gohr // add data attribute for inline edit 363d4b5a17cSAndreas Gohr if($this->mode == 'xhtml') { 364d4b5a17cSAndreas Gohr $pid = $this->resultPIDs[$rownum]; 365*0ceefd5cSAnna Dabrowska $rid = $this->resultRids[$rownum]; 366d4b5a17cSAndreas Gohr $this->renderer->doc = substr(rtrim($this->renderer->doc), 0, -1); // remove closing '>' 367*0ceefd5cSAnna Dabrowska $this->renderer->doc .= ' data-pid="' . hsc($pid) . '" data-rid="' . hsc($rid) . '">'; 368d4b5a17cSAndreas Gohr } 369d4b5a17cSAndreas Gohr 37007993756SAndreas Gohr // row number column 37107993756SAndreas Gohr if($this->data['rownumbers']) { 37207993756SAndreas Gohr $this->renderer->tablecell_open(); 3733215aebfSSzymon Olewniczak $searchConfigConf = $this->searchConfig->getConf(); 3743215aebfSSzymon Olewniczak $this->renderer->cdata($rownum + $searchConfigConf['offset'] + 1); 37507993756SAndreas Gohr $this->renderer->tablecell_close(); 37607993756SAndreas Gohr } 37707993756SAndreas Gohr 37807993756SAndreas Gohr /** @var Value $value */ 37907993756SAndreas Gohr foreach($row as $colnum => $value) { 38095eef580SAndreas Gohr $this->renderer->tablecell_open(1, $this->data['align'][$colnum]); 38107993756SAndreas Gohr $value->render($this->renderer, $this->mode); 38207993756SAndreas Gohr $this->renderer->tablecell_close(); 38307993756SAndreas Gohr 38407993756SAndreas Gohr // summarize 38507993756SAndreas Gohr if($this->data['summarize'] && is_numeric($value->getValue())) { 38607993756SAndreas Gohr if(!isset($this->sums[$colnum])) { 38707993756SAndreas Gohr $this->sums[$colnum] = 0; 38807993756SAndreas Gohr } 38907993756SAndreas Gohr $this->sums[$colnum] += $value->getValue(); 39007993756SAndreas Gohr } 39107993756SAndreas Gohr } 39207993756SAndreas Gohr $this->renderer->tablerow_close(); 39307993756SAndreas Gohr } 39407993756SAndreas Gohr 39507993756SAndreas Gohr /** 39607993756SAndreas Gohr * Renders an information row for when no results were found 39707993756SAndreas Gohr */ 398986ab7e6SAndreas Gohr protected function renderEmptyResult() { 39907993756SAndreas Gohr $this->renderer->tablerow_open(); 40070cf6339SAndreas Gohr $this->renderer->tablecell_open(count($this->columns) + $this->data['rownumbers'], 'center'); 40107993756SAndreas Gohr $this->renderer->cdata($this->helper->getLang('none')); 40207993756SAndreas Gohr $this->renderer->tablecell_close(); 40307993756SAndreas Gohr $this->renderer->tablerow_close(); 40407993756SAndreas Gohr } 40507993756SAndreas Gohr 40607993756SAndreas Gohr /** 40707993756SAndreas Gohr * Add sums if wanted 40807993756SAndreas Gohr */ 409986ab7e6SAndreas Gohr protected function renderSums() { 410d18090e8SAndreas Gohr if(empty($this->data['summarize'])) return; 41107993756SAndreas Gohr 412a0bf8bb2SAndreas Gohr $this->renderer->info['struct_table_meta'] = true; 4138925ba29SAndreas Gohr if($this->mode == 'xhtml') { 4148925ba29SAndreas Gohr /** @noinspection PhpMethodParametersCountMismatchInspection */ 4158925ba29SAndreas Gohr $this->renderer->tablerow_open('summarize'); 4168925ba29SAndreas Gohr } else { 41707993756SAndreas Gohr $this->renderer->tablerow_open(); 4188925ba29SAndreas Gohr } 41907993756SAndreas Gohr 42007993756SAndreas Gohr if($this->data['rownumbers']) { 4218925ba29SAndreas Gohr $this->renderer->tableheader_open(); 4228925ba29SAndreas Gohr $this->renderer->tableheader_close(); 42307993756SAndreas Gohr } 42407993756SAndreas Gohr 425aee4116bSAndreas Gohr $len = count($this->columns); 42607993756SAndreas Gohr for($i = 0; $i < $len; $i++) { 4278925ba29SAndreas Gohr $this->renderer->tableheader_open(1, $this->data['align'][$i]); 428aee4116bSAndreas Gohr if(!empty($this->sums[$i])) { 4299b97e610SAndreas Gohr $this->renderer->cdata('∑ '); 4309b97e610SAndreas Gohr $this->columns[$i]->getType()->renderValue($this->sums[$i], $this->renderer, $this->mode); 43107993756SAndreas Gohr } else { 43207993756SAndreas Gohr if($this->mode == 'xhtml') { 43307993756SAndreas Gohr $this->renderer->doc .= ' '; 43407993756SAndreas Gohr } 43507993756SAndreas Gohr } 4368925ba29SAndreas Gohr $this->renderer->tableheader_close(); 43707993756SAndreas Gohr } 43807993756SAndreas Gohr $this->renderer->tablerow_close(); 439a0bf8bb2SAndreas Gohr $this->renderer->info['struct_table_meta'] = false; 44007993756SAndreas Gohr } 44107993756SAndreas Gohr 44207993756SAndreas Gohr /** 443986ab7e6SAndreas Gohr * Adds paging controls to the table 44407993756SAndreas Gohr */ 445986ab7e6SAndreas Gohr protected function renderPagingControls() { 44607993756SAndreas Gohr if(empty($this->data['limit'])) return; 447a0bf8bb2SAndreas Gohr if($this->mode != 'xhtml') return; 44807993756SAndreas Gohr 449a0bf8bb2SAndreas Gohr $this->renderer->info['struct_table_meta'] = true; 45007993756SAndreas Gohr $this->renderer->tablerow_open(); 4514bc1074dSMichael Grosse $this->renderer->tableheader_open((count($this->columns) + ($this->data['rownumbers'] ? 1 : 0))); 45207993756SAndreas Gohr $offset = $this->data['offset']; 45307993756SAndreas Gohr 45407993756SAndreas Gohr // prev link 45507993756SAndreas Gohr if($offset) { 45607993756SAndreas Gohr $prev = $offset - $this->data['limit']; 45707993756SAndreas Gohr if($prev < 0) { 45807993756SAndreas Gohr $prev = 0; 45907993756SAndreas Gohr } 46007993756SAndreas Gohr 46107993756SAndreas Gohr $dynamic = $this->searchConfig->getDynamicParameters(); 46207993756SAndreas Gohr $dynamic->setOffset($prev); 46307993756SAndreas Gohr $link = wl($this->id, $dynamic->getURLParameters()); 46407993756SAndreas Gohr $this->renderer->doc .= '<a href="' . $link . '" class="prev">' . $this->helper->getLang('prev') . '</a>'; 46507993756SAndreas Gohr } 46607993756SAndreas Gohr 46707993756SAndreas Gohr // next link 46807993756SAndreas Gohr if($this->resultCount > $offset + $this->data['limit']) { 46907993756SAndreas Gohr $next = $offset + $this->data['limit']; 47007993756SAndreas Gohr $dynamic = $this->searchConfig->getDynamicParameters(); 47107993756SAndreas Gohr $dynamic->setOffset($next); 47207993756SAndreas Gohr $link = wl($this->id, $dynamic->getURLParameters()); 47307993756SAndreas Gohr $this->renderer->doc .= '<a href="' . $link . '" class="next">' . $this->helper->getLang('next') . '</a>'; 47407993756SAndreas Gohr } 47507993756SAndreas Gohr 47607993756SAndreas Gohr $this->renderer->tableheader_close(); 47707993756SAndreas Gohr $this->renderer->tablerow_close(); 478a0bf8bb2SAndreas Gohr $this->renderer->info['struct_table_meta'] = true; 47907993756SAndreas Gohr } 48009dd691aSAndreas Gohr 48109dd691aSAndreas Gohr /** 48209dd691aSAndreas Gohr * Adds CSV export controls 48309dd691aSAndreas Gohr */ 48409dd691aSAndreas Gohr protected function renderExportControls() { 48509dd691aSAndreas Gohr if($this->mode != 'xhtml') return; 4867b240ca8SAndreas Gohr if(empty($this->data['csv'])) return; 48709dd691aSAndreas Gohr if(!$this->resultCount) return; 48809dd691aSAndreas Gohr 489c8ccdaf8SAndreas Gohr $dynamic = $this->searchConfig->getDynamicParameters(); 490c8ccdaf8SAndreas Gohr $params = $dynamic->getURLParameters(); 491c8ccdaf8SAndreas Gohr $params['hash'] = $this->renderer->info['struct_table_hash']; 492c8ccdaf8SAndreas Gohr 49309dd691aSAndreas Gohr // FIXME apply dynamic filters 494eafc109fSAndreas Gohr $link = exportlink($this->id, 'struct_csv', $params); 49509dd691aSAndreas Gohr 49609dd691aSAndreas Gohr $this->renderer->doc .= '<a href="' . $link . '" class="export mediafile mf_csv">'.$this->helper->getLang('csvexport').'</a>'; 49709dd691aSAndreas Gohr } 49807993756SAndreas Gohr} 499