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