xref: /plugin/strata/syntax/table.php (revision 5153720fcc1dd2b6e63035d45f7c2bc32e429371)
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