1*5153720fSfkaag71<?php 2*5153720fSfkaag71/** 3*5153720fSfkaag71 * Strata Basic, table plugin 4*5153720fSfkaag71 * 5*5153720fSfkaag71 * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 6*5153720fSfkaag71 * @author Brend Wanders <b.wanders@utwente.nl> 7*5153720fSfkaag71 */ 8*5153720fSfkaag71 9*5153720fSfkaag71if (!defined('DOKU_INC')) die('Meh.'); 10*5153720fSfkaag71 11*5153720fSfkaag71/** 12*5153720fSfkaag71 * Table syntax for basic query handling. 13*5153720fSfkaag71 */ 14*5153720fSfkaag71class syntax_plugin_strata_table extends syntax_plugin_strata_select { 15*5153720fSfkaag71 function connectTo($mode) { 16*5153720fSfkaag71 $this->Lexer->addSpecialPattern('<table'.$this->helper->fieldsShortPattern().'* *>\s*?\n.+?\n\s*?</table>',$mode, 'plugin_strata_table'); 17*5153720fSfkaag71 } 18*5153720fSfkaag71 19*5153720fSfkaag71 function getUISettingUI($hasUIBlock) { 20*5153720fSfkaag71 return array('choices' => array('none' => array('none', 'no', 'n'), 'generic' => array('generic', 'g'), 'table' => array('table', 't')), 'default' => 'table'); 21*5153720fSfkaag71 } 22*5153720fSfkaag71 23*5153720fSfkaag71 function handleHeader($header, &$result, &$typemap) { 24*5153720fSfkaag71 return preg_replace('/(^<table)|( *>$)/','',$header); 25*5153720fSfkaag71 } 26*5153720fSfkaag71 27*5153720fSfkaag71 function render($mode, Doku_Renderer $R, $data) { 28*5153720fSfkaag71 if($data == array() || isset($data['error'])) { 29*5153720fSfkaag71 if($mode == 'xhtml' || $mode == 'odt') { 30*5153720fSfkaag71 $R->table_open(); 31*5153720fSfkaag71 $R->tablerow_open(); 32*5153720fSfkaag71 $R->tablecell_open(); 33*5153720fSfkaag71 $this->displayError($mode, $R, $data); 34*5153720fSfkaag71 $R->tablecell_close(); 35*5153720fSfkaag71 $R->tablerow_close(); 36*5153720fSfkaag71 $R->table_close(); 37*5153720fSfkaag71 } 38*5153720fSfkaag71 return; 39*5153720fSfkaag71 } 40*5153720fSfkaag71 41*5153720fSfkaag71 $query = $this->prepareQuery($data['query']); 42*5153720fSfkaag71 43*5153720fSfkaag71 // execute the query 44*5153720fSfkaag71 $result = $this->triples->queryRelations($query); 45*5153720fSfkaag71 46*5153720fSfkaag71 // prepare all columns 47*5153720fSfkaag71 foreach($data['fields'] as $meta) { 48*5153720fSfkaag71 $fields[] = array( 49*5153720fSfkaag71 'variable'=>$meta['variable'], 50*5153720fSfkaag71 'caption'=>$meta['caption'], 51*5153720fSfkaag71 'type'=>$this->util->loadType($meta['type']), 52*5153720fSfkaag71 'typeName'=>$meta['type'], 53*5153720fSfkaag71 'hint'=>$meta['hint'], 54*5153720fSfkaag71 'aggregate'=>$this->util->loadAggregate($meta['aggregate']), 55*5153720fSfkaag71 'aggregateHint'=>$meta['aggregateHint'] 56*5153720fSfkaag71 ); 57*5153720fSfkaag71 } 58*5153720fSfkaag71 59*5153720fSfkaag71 if($mode == 'xhtml' || $mode == 'odt') { 60*5153720fSfkaag71 // render header 61*5153720fSfkaag71 $this->ui_container_open($mode, $R, $data, array('strata-container', 'strata-container-table')); 62*5153720fSfkaag71 $R->table_open(); 63*5153720fSfkaag71 if($mode == 'xhtml') { $R->doc .= '<thead>'.DOKU_LF; } 64*5153720fSfkaag71 $R->tablerow_open(); 65*5153720fSfkaag71 66*5153720fSfkaag71 // render all columns 67*5153720fSfkaag71 foreach($fields as $f) { 68*5153720fSfkaag71 $R->tableheader_open(); 69*5153720fSfkaag71 if($mode == 'xhtml') { $R->doc .= '<span class="strata-caption" data-field="'.hsc($f['variable']).'">'; } 70*5153720fSfkaag71 $R->cdata($f['caption']); 71*5153720fSfkaag71 if($mode == 'xhtml') { $R->doc .= '</span>'.DOKU_LF; } 72*5153720fSfkaag71 $R->tableheader_close(); 73*5153720fSfkaag71 } 74*5153720fSfkaag71 $R->tablerow_close(); 75*5153720fSfkaag71 if($mode == 'xhtml') { $R->doc .= '</thead>'.DOKU_LF; } 76*5153720fSfkaag71 77*5153720fSfkaag71 if($result != false) { 78*5153720fSfkaag71 // render each row 79*5153720fSfkaag71 $itemcount = 0; 80*5153720fSfkaag71 foreach($result as $row) { 81*5153720fSfkaag71 if($mode == 'xhtml') { $R->doc .= '<tbody class="strata-item" data-strata-order="'.($itemcount++).'">'.DOKU_LF; } 82*5153720fSfkaag71 $R->tablerow_open(); 83*5153720fSfkaag71 foreach($fields as $f) { 84*5153720fSfkaag71 $R->tablecell_open(); 85*5153720fSfkaag71 $this->util->renderField($mode, $R, $this->triples, $f['aggregate']->aggregate($row[$f['variable']],$f['aggregateHint']), $f['typeName'], $f['hint'], $f['type'], $f['variable']); 86*5153720fSfkaag71 $R->tablecell_close(); 87*5153720fSfkaag71 } 88*5153720fSfkaag71 $R->tablerow_close(); 89*5153720fSfkaag71 if($mode == 'xhtml') { $R->doc .= '</tbody>'.DOKU_LF; } 90*5153720fSfkaag71 } 91*5153720fSfkaag71 $result->closeCursor(); 92*5153720fSfkaag71 } else { 93*5153720fSfkaag71 $R->tablerow_open(); 94*5153720fSfkaag71 $R->tablecell_open(count($fields)); 95*5153720fSfkaag71 $R->emphasis_open(); 96*5153720fSfkaag71 $R->cdata(sprintf($this->helper->getLang('content_error_explanation'),'Strata table')); 97*5153720fSfkaag71 $R->emphasis_close(); 98*5153720fSfkaag71 $R->tablecell_close(); 99*5153720fSfkaag71 $R->tablerow_close(); 100*5153720fSfkaag71 } 101*5153720fSfkaag71 102*5153720fSfkaag71 $R->table_close(); 103*5153720fSfkaag71 $this->ui_container_close($mode, $R); 104*5153720fSfkaag71 105*5153720fSfkaag71 return true; 106*5153720fSfkaag71 } elseif($mode == 'metadata') { 107*5153720fSfkaag71 if($result == false) return; 108*5153720fSfkaag71 109*5153720fSfkaag71 // render all rows in metadata mode to enable things like backlinks 110*5153720fSfkaag71 foreach($result as $row) { 111*5153720fSfkaag71 foreach($fields as $f) { 112*5153720fSfkaag71 $this->util->renderField($mode, $R, $this->triples, $f['aggregate']->aggregate($row[$f['variable']],$f['aggregateHint']), $f['typeName'], $f['hint'], $f['type'], $f['variable']); 113*5153720fSfkaag71 } 114*5153720fSfkaag71 } 115*5153720fSfkaag71 $result->closeCursor(); 116*5153720fSfkaag71 117*5153720fSfkaag71 return true; 118*5153720fSfkaag71 } 119*5153720fSfkaag71 120*5153720fSfkaag71 return false; 121*5153720fSfkaag71 } 122*5153720fSfkaag71} 123