1*5153720fSfkaag71<?php 2*5153720fSfkaag71/** 3*5153720fSfkaag71 * Strata Basic, data entry 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 * List syntax for basic query handling. 13*5153720fSfkaag71 */ 14*5153720fSfkaag71class syntax_plugin_strata_list extends syntax_plugin_strata_select { 15*5153720fSfkaag71 function connectTo($mode) { 16*5153720fSfkaag71 $this->Lexer->addSpecialPattern('<list'.$this->helper->fieldsShortPattern().'* *>\s*?\n.+?\n\s*?</list>',$mode, 'plugin_strata_list'); 17*5153720fSfkaag71 } 18*5153720fSfkaag71 19*5153720fSfkaag71 function handleHeader($header, &$result, &$typemap) { 20*5153720fSfkaag71 return preg_replace('/(^<list)|( *>$)/','',$header); 21*5153720fSfkaag71 } 22*5153720fSfkaag71 23*5153720fSfkaag71 function render($mode, Doku_Renderer $R, $data) { 24*5153720fSfkaag71 if($data == array() || isset($data['error'])) { 25*5153720fSfkaag71 if($mode == 'xhtml' || $mode == 'odt') { 26*5153720fSfkaag71 $R->listu_open(); 27*5153720fSfkaag71 $R->listitem_open(1); 28*5153720fSfkaag71 $R->listcontent_open(); 29*5153720fSfkaag71 $this->displayError($mode, $R, $data); 30*5153720fSfkaag71 $R->listcontent_close(); 31*5153720fSfkaag71 $R->listitem_close(); 32*5153720fSfkaag71 $R->listu_close(); 33*5153720fSfkaag71 } 34*5153720fSfkaag71 35*5153720fSfkaag71 return; 36*5153720fSfkaag71 } 37*5153720fSfkaag71 38*5153720fSfkaag71 $query = $this->prepareQuery($data['query']); 39*5153720fSfkaag71 40*5153720fSfkaag71 // execute the query 41*5153720fSfkaag71 $result = $this->triples->queryRelations($query); 42*5153720fSfkaag71 43*5153720fSfkaag71 if($result == false) { 44*5153720fSfkaag71 if($mode == 'xhtml' || $mode == 'odt') { 45*5153720fSfkaag71 $R->listu_open(); 46*5153720fSfkaag71 $R->listitem_open(1); 47*5153720fSfkaag71 $R->listcontent_open(); 48*5153720fSfkaag71 $R->emphasis_open(); 49*5153720fSfkaag71 $R->cdata(sprintf($this->helper->getLang('content_error_explanation'),'Strata list')); 50*5153720fSfkaag71 $R->emphasis_close(); 51*5153720fSfkaag71 $R->listcontent_close(); 52*5153720fSfkaag71 $R->listitem_close(); 53*5153720fSfkaag71 $R->listu_close(); 54*5153720fSfkaag71 } 55*5153720fSfkaag71 56*5153720fSfkaag71 return; 57*5153720fSfkaag71 } 58*5153720fSfkaag71 59*5153720fSfkaag71 // prepare all 'columns' 60*5153720fSfkaag71 $fields = array(); 61*5153720fSfkaag71 foreach($data['fields'] as $meta) { 62*5153720fSfkaag71 $fields[] = array( 63*5153720fSfkaag71 'variable'=>$meta['variable'], 64*5153720fSfkaag71 'caption'=>$meta['caption'], 65*5153720fSfkaag71 'type'=>$this->util->loadType($meta['type']), 66*5153720fSfkaag71 'typeName'=>$meta['type'], 67*5153720fSfkaag71 'hint'=>$meta['hint'], 68*5153720fSfkaag71 'aggregate'=>$this->util->loadAggregate($meta['aggregate']), 69*5153720fSfkaag71 'aggergateHint'=>$meta['aggregateHint'] 70*5153720fSfkaag71 ); 71*5153720fSfkaag71 } 72*5153720fSfkaag71 73*5153720fSfkaag71 74*5153720fSfkaag71 if($mode == 'xhtml' || $mode == 'odt') { 75*5153720fSfkaag71 // render header 76*5153720fSfkaag71 $this->ui_container_open($mode, $R, $data, array('strata-container', 'strata-container-list')); 77*5153720fSfkaag71 78*5153720fSfkaag71 $this->util->renderCaptions($mode, $R, $fields); 79*5153720fSfkaag71 80*5153720fSfkaag71 $R->listu_open(); 81*5153720fSfkaag71 82*5153720fSfkaag71 // render each row 83*5153720fSfkaag71 $itemcount = 0; 84*5153720fSfkaag71 foreach($result as $row) { 85*5153720fSfkaag71 if($mode == 'xhtml') { 86*5153720fSfkaag71 $R->doc .= '<li class="level1 strata-item" data-strata-order="'.($itemcount++).'">'.DOKU_LF; 87*5153720fSfkaag71 } else { 88*5153720fSfkaag71 $R->listitem_open(1); 89*5153720fSfkaag71 } 90*5153720fSfkaag71 $R->listcontent_open(); 91*5153720fSfkaag71 92*5153720fSfkaag71 $fieldCount = 0; 93*5153720fSfkaag71 94*5153720fSfkaag71 foreach($fields as $f) { 95*5153720fSfkaag71 $values = $f['aggregate']->aggregate($row[$f['variable']], $f['aggregateHint']); 96*5153720fSfkaag71 if(!count($values)) continue; 97*5153720fSfkaag71 if($fieldCount>1) $R->cdata('; '); 98*5153720fSfkaag71 if($fieldCount==1) $R->cdata(' ('); 99*5153720fSfkaag71 $this->util->renderField($mode, $R, $this->triples, $values, $f['typeName'], $f['hint'], $f['type'], $f['variable']); 100*5153720fSfkaag71 $fieldCount++; 101*5153720fSfkaag71 } 102*5153720fSfkaag71 103*5153720fSfkaag71 if($fieldCount>1) $R->cdata(')'); 104*5153720fSfkaag71 105*5153720fSfkaag71 $R->listcontent_close(); 106*5153720fSfkaag71 if($mode == 'xhtml') { 107*5153720fSfkaag71 $R->doc.= '</li>'.DOKU_LF; 108*5153720fSfkaag71 } else { 109*5153720fSfkaag71 $R->listitem_close(); 110*5153720fSfkaag71 } 111*5153720fSfkaag71 } 112*5153720fSfkaag71 $result->closeCursor(); 113*5153720fSfkaag71 114*5153720fSfkaag71 $R->listu_close(); 115*5153720fSfkaag71 $this->ui_container_close($mode, $R); 116*5153720fSfkaag71 117*5153720fSfkaag71 return true; 118*5153720fSfkaag71 } elseif($mode == 'metadata') { 119*5153720fSfkaag71 // render all rows in metadata mode to enable things like backlinks 120*5153720fSfkaag71 foreach($result as $row) { 121*5153720fSfkaag71 foreach($fields as $f) { 122*5153720fSfkaag71 $this->util->renderField($mode, $R, $this->triples, $f['aggregate']->aggregate($row[$f['variable']],$f['aggregateHint']), $f['typeName'], $f['hint'], $f['type'], $f['variable']); 123*5153720fSfkaag71 } 124*5153720fSfkaag71 } 125*5153720fSfkaag71 $result->closeCursor(); 126*5153720fSfkaag71 127*5153720fSfkaag71 return true; 128*5153720fSfkaag71 } 129*5153720fSfkaag71 130*5153720fSfkaag71 return false; 131*5153720fSfkaag71 } 132*5153720fSfkaag71} 133