xref: /plugin/struct/meta/AggregationValue.php (revision 812a20f76a42af454ce9b827bf7c930f0774879f)
1*812a20f7SIain Hallam<?php
2*812a20f7SIain Hallam
3*812a20f7SIain Hallamnamespace dokuwiki\plugin\struct\meta;
4*812a20f7SIain Hallam
5*812a20f7SIain Hallam/**
6*812a20f7SIain Hallam * Class AggregationValue
7*812a20f7SIain Hallam *
8*812a20f7SIain Hallam * @package dokuwiki\plugin\struct\meta
9*812a20f7SIain Hallam * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
10*812a20f7SIain Hallam * @author  Iain Hallam <iain@nineworlds.net>
11*812a20f7SIain Hallam */
12*812a20f7SIain Hallamclass AggregationValue
13*812a20f7SIain Hallam{
14*812a20f7SIain Hallam
15*812a20f7SIain Hallam    /**
16*812a20f7SIain Hallam     * @var string the page id of the page this is rendered to
17*812a20f7SIain Hallam     */
18*812a20f7SIain Hallam    protected $id;
19*812a20f7SIain Hallam    /**
20*812a20f7SIain Hallam     * @var string the Type of renderer used
21*812a20f7SIain Hallam     */
22*812a20f7SIain Hallam    protected $mode;
23*812a20f7SIain Hallam    /**
24*812a20f7SIain Hallam     * @var Doku_Renderer the DokuWiki renderer used to create the output
25*812a20f7SIain Hallam     */
26*812a20f7SIain Hallam    protected $renderer;
27*812a20f7SIain Hallam    /**
28*812a20f7SIain Hallam     * @var SearchConfig the configured search - gives access to columns etc.
29*812a20f7SIain Hallam     */
30*812a20f7SIain Hallam    protected $searchConfig;
31*812a20f7SIain Hallam
32*812a20f7SIain Hallam    /**
33*812a20f7SIain Hallam     * @var Column the column to be displayed
34*812a20f7SIain Hallam     */
35*812a20f7SIain Hallam    protected $column;
36*812a20f7SIain Hallam
37*812a20f7SIain Hallam    /**
38*812a20f7SIain Hallam     * @var  Value[][] the search result
39*812a20f7SIain Hallam     */
40*812a20f7SIain Hallam    protected $result;
41*812a20f7SIain Hallam
42*812a20f7SIain Hallam    /**
43*812a20f7SIain Hallam     * @var int number of all results
44*812a20f7SIain Hallam     */
45*812a20f7SIain Hallam    protected $resultCount;
46*812a20f7SIain Hallam
47*812a20f7SIain Hallam    /**
48*812a20f7SIain Hallam     * @todo we might be able to get rid of this helper and move this to SearchConfig
49*812a20f7SIain Hallam     * @var helper_plugin_struct_config
50*812a20f7SIain Hallam     */
51*812a20f7SIain Hallam    protected $helper;
52*812a20f7SIain Hallam
53*812a20f7SIain Hallam    /**
54*812a20f7SIain Hallam     * Initialize the Aggregation renderer and executes the search
55*812a20f7SIain Hallam     *
56*812a20f7SIain Hallam     * You need to call @see render() on the resulting object.
57*812a20f7SIain Hallam     *
58*812a20f7SIain Hallam     * @param  string         $id
59*812a20f7SIain Hallam     * @param  string         $mode
60*812a20f7SIain Hallam     * @param  Doku_Renderer  $renderer
61*812a20f7SIain Hallam     * @param  SearchConfig   $searchConfig
62*812a20f7SIain Hallam     */
63*812a20f7SIain Hallam    public function __construct($id, $mode, \Doku_Renderer $renderer, SearchConfig $searchConfig)
64*812a20f7SIain Hallam    {
65*812a20f7SIain Hallam        // Parameters
66*812a20f7SIain Hallam        $this->id = $id;
67*812a20f7SIain Hallam        $this->mode = $mode;
68*812a20f7SIain Hallam        $this->renderer = $renderer;
69*812a20f7SIain Hallam        $this->searchConfig = $searchConfig;
70*812a20f7SIain Hallam
71*812a20f7SIain Hallam        // Search info
72*812a20f7SIain Hallam        $this->data = $this->searchConfig->getConf();
73*812a20f7SIain Hallam        $columns = $this->searchConfig->getColumns();
74*812a20f7SIain Hallam        $this->column = $columns[0];
75*812a20f7SIain Hallam
76*812a20f7SIain Hallam        // limit to first result
77*812a20f7SIain Hallam        $this->searchConfig->setLimit(1);
78*812a20f7SIain Hallam        $this->searchConfig->setOffset(0);
79*812a20f7SIain Hallam
80*812a20f7SIain Hallam        // Run the search
81*812a20f7SIain Hallam        $result = $this->searchConfig->execute();
82*812a20f7SIain Hallam        $this->resultCount = $this->searchConfig->getCount();
83*812a20f7SIain Hallam
84*812a20f7SIain Hallam        // Change from two-dimensional array with one entry to one-dimensional array
85*812a20f7SIain Hallam        $this->result = $result[0];
86*812a20f7SIain Hallam
87*812a20f7SIain Hallam        // Load helper
88*812a20f7SIain Hallam        $this->helper = plugin_load('helper', 'struct_config');
89*812a20f7SIain Hallam    }
90*812a20f7SIain Hallam
91*812a20f7SIain Hallam    /**
92*812a20f7SIain Hallam     * Create the output on the renderer
93*812a20f7SIain Hallam     *
94*812a20f7SIain Hallam     * @param  int  $show_not_found  Whether to display the default text for no records
95*812a20f7SIain Hallam     */
96*812a20f7SIain Hallam    public function render($show_not_found = 0)
97*812a20f7SIain Hallam    {
98*812a20f7SIain Hallam        $this->startScope();
99*812a20f7SIain Hallam
100*812a20f7SIain Hallam        // Check that we actually got a result
101*812a20f7SIain Hallam        if ($this->resultCount) {
102*812a20f7SIain Hallam            $this->renderValue($this->result);
103*812a20f7SIain Hallam        } else {
104*812a20f7SIain Hallam            if ($show_not_found) {
105*812a20f7SIain Hallam                $this->renderer->cdata($this->helper->getLang('none'));
106*812a20f7SIain Hallam            }
107*812a20f7SIain Hallam        }
108*812a20f7SIain Hallam
109*812a20f7SIain Hallam        $this->finishScope();
110*812a20f7SIain Hallam
111*812a20f7SIain Hallam        return;
112*812a20f7SIain Hallam    }
113*812a20f7SIain Hallam
114*812a20f7SIain Hallam    /**
115*812a20f7SIain Hallam     * Adds additional info to document and renderer in XHTML mode
116*812a20f7SIain Hallam     *
117*812a20f7SIain Hallam     * @see finishScope()
118*812a20f7SIain Hallam     */
119*812a20f7SIain Hallam    protected function startScope()
120*812a20f7SIain Hallam    {
121*812a20f7SIain Hallam        // wrapping span
122*812a20f7SIain Hallam        if ($this->mode != 'xhtml') {
123*812a20f7SIain Hallam            return;
124*812a20f7SIain Hallam        }
125*812a20f7SIain Hallam        $this->renderer->doc .= "<span class=\"structaggregation valueaggregation\">";
126*812a20f7SIain Hallam    }
127*812a20f7SIain Hallam
128*812a20f7SIain Hallam    /**
129*812a20f7SIain Hallam     * Closes anything opened in startScope()
130*812a20f7SIain Hallam     *
131*812a20f7SIain Hallam     * @see startScope()
132*812a20f7SIain Hallam     */
133*812a20f7SIain Hallam    protected function finishScope()
134*812a20f7SIain Hallam    {
135*812a20f7SIain Hallam        // wrapping span
136*812a20f7SIain Hallam        if ($this->mode != 'xhtml') {
137*812a20f7SIain Hallam            return;
138*812a20f7SIain Hallam        }
139*812a20f7SIain Hallam        $this->renderer->doc .= '</span>';
140*812a20f7SIain Hallam    }
141*812a20f7SIain Hallam
142*812a20f7SIain Hallam    /**
143*812a20f7SIain Hallam     * @param $resultrow
144*812a20f7SIain Hallam     */
145*812a20f7SIain Hallam    protected function renderValue($resultrow)
146*812a20f7SIain Hallam    {
147*812a20f7SIain Hallam        // @var  Value  $value
148*812a20f7SIain Hallam        foreach ($resultrow as $column => $value) {
149*812a20f7SIain Hallam            if ($value->isEmpty()) {
150*812a20f7SIain Hallam                continue;
151*812a20f7SIain Hallam            }
152*812a20f7SIain Hallam            if ($this->mode == 'xhtml') {
153*812a20f7SIain Hallam                $type = 'struct_' . strtolower($value->getColumn()->getType()->getClass());
154*812a20f7SIain Hallam                $this->renderer->doc .= '<span class="' . $type . '">';
155*812a20f7SIain Hallam            }
156*812a20f7SIain Hallam            $value->render($this->renderer, $this->mode);
157*812a20f7SIain Hallam            if ($this->mode == 'xhtml') {
158*812a20f7SIain Hallam                $this->renderer->doc .= '</span>';
159*812a20f7SIain Hallam            }
160*812a20f7SIain Hallam        }
161*812a20f7SIain Hallam    }
162*812a20f7SIain Hallam}
163