xref: /plugin/struct/meta/AggregationList.php (revision d6d97f6064c3b0f90310be8341edc9585520ee54)
1ea5ad12aSMichael Grosse<?php
2ea5ad12aSMichael Grosse
3ea5ad12aSMichael Grossenamespace dokuwiki\plugin\struct\meta;
4ea5ad12aSMichael Grosse
5ea5ad12aSMichael Grosse/**
6ea5ad12aSMichael Grosse * Class AggregationList
7ea5ad12aSMichael Grosse *
8ea5ad12aSMichael Grosse * @package dokuwiki\plugin\struct\meta
9ea5ad12aSMichael Grosse */
10*d6d97f60SAnna Dabrowskaclass AggregationList
11*d6d97f60SAnna Dabrowska{
12ea5ad12aSMichael Grosse
13ea5ad12aSMichael Grosse    /**
14ea5ad12aSMichael Grosse     * @var string the page id of the page this is rendered to
15ea5ad12aSMichael Grosse     */
16ea5ad12aSMichael Grosse    protected $id;
17ea5ad12aSMichael Grosse    /**
18ea5ad12aSMichael Grosse     * @var string the Type of renderer used
19ea5ad12aSMichael Grosse     */
20ea5ad12aSMichael Grosse    protected $mode;
21ea5ad12aSMichael Grosse    /**
22ea5ad12aSMichael Grosse     * @var \Doku_Renderer the DokuWiki renderer used to create the output
23ea5ad12aSMichael Grosse     */
24ea5ad12aSMichael Grosse    protected $renderer;
25ea5ad12aSMichael Grosse    /**
26ea5ad12aSMichael Grosse     * @var SearchConfig the configured search - gives access to columns etc.
27ea5ad12aSMichael Grosse     */
28ea5ad12aSMichael Grosse    protected $searchConfig;
29ea5ad12aSMichael Grosse
30ea5ad12aSMichael Grosse    /**
31ea5ad12aSMichael Grosse     * @var Column[] the list of columns to be displayed
32ea5ad12aSMichael Grosse     */
33ea5ad12aSMichael Grosse    protected $columns;
34ea5ad12aSMichael Grosse
35ea5ad12aSMichael Grosse    /**
36ea5ad12aSMichael Grosse     * @var  Value[][] the search result
37ea5ad12aSMichael Grosse     */
38ea5ad12aSMichael Grosse    protected $result;
39ea5ad12aSMichael Grosse
40ea5ad12aSMichael Grosse    /**
41ea5ad12aSMichael Grosse     * @var int number of all results
42ea5ad12aSMichael Grosse     */
43ea5ad12aSMichael Grosse    protected $resultColumnCount;
44ea5ad12aSMichael Grosse
45ea5ad12aSMichael Grosse    /**
46ea5ad12aSMichael Grosse     * Initialize the Aggregation renderer and executes the search
47ea5ad12aSMichael Grosse     *
48ea5ad12aSMichael Grosse     * You need to call @see render() on the resulting object.
49ea5ad12aSMichael Grosse     *
50ea5ad12aSMichael Grosse     * @param string $id
51ea5ad12aSMichael Grosse     * @param string $mode
52ea5ad12aSMichael Grosse     * @param \Doku_Renderer $renderer
53ea5ad12aSMichael Grosse     * @param SearchConfig $searchConfig
54ea5ad12aSMichael Grosse     */
55*d6d97f60SAnna Dabrowska    public function __construct($id, $mode, \Doku_Renderer $renderer, SearchConfig $searchConfig)
56*d6d97f60SAnna Dabrowska    {
57ea5ad12aSMichael Grosse        $this->id = $id;
58ea5ad12aSMichael Grosse        $this->mode = $mode;
59ea5ad12aSMichael Grosse        $this->renderer = $renderer;
60ea5ad12aSMichael Grosse        $this->searchConfig = $searchConfig;
61ea5ad12aSMichael Grosse        $this->data = $searchConfig->getConf();
62ea5ad12aSMichael Grosse        $this->columns = $searchConfig->getColumns();
63ea5ad12aSMichael Grosse
64ea5ad12aSMichael Grosse        $this->result = $this->searchConfig->execute();
65ea5ad12aSMichael Grosse        $this->resultColumnCount = count($this->columns);
66ea5ad12aSMichael Grosse        $this->resultPIDs = $this->searchConfig->getPids();
67ea5ad12aSMichael Grosse    }
68ea5ad12aSMichael Grosse
69ea5ad12aSMichael Grosse    /**
70ea5ad12aSMichael Grosse     * Create the list on the renderer
71ea5ad12aSMichael Grosse     */
72*d6d97f60SAnna Dabrowska    public function render()
73*d6d97f60SAnna Dabrowska    {
74ea5ad12aSMichael Grosse
75ea5ad12aSMichael Grosse        $this->startScope();
76ea5ad12aSMichael Grosse
772c6e107cSMichael Grosse        $this->renderer->listu_open();
78ea5ad12aSMichael Grosse
79ea5ad12aSMichael Grosse        foreach ($this->result as $result) {
802c6e107cSMichael Grosse            $this->renderer->listitem_open(1);
812c6e107cSMichael Grosse            $this->renderer->listcontent_open();
82ea5ad12aSMichael Grosse            $this->renderListItem($result);
832c6e107cSMichael Grosse            $this->renderer->listcontent_close();
842c6e107cSMichael Grosse            $this->renderer->listitem_close();
85ea5ad12aSMichael Grosse        }
86ea5ad12aSMichael Grosse
872c6e107cSMichael Grosse        $this->renderer->listu_close();
88ea5ad12aSMichael Grosse
89ea5ad12aSMichael Grosse        $this->finishScope();
90ea5ad12aSMichael Grosse
91ea5ad12aSMichael Grosse        return;
92ea5ad12aSMichael Grosse    }
93ea5ad12aSMichael Grosse
94ea5ad12aSMichael Grosse    /**
95ea5ad12aSMichael Grosse     * Adds additional info to document and renderer in XHTML mode
96ea5ad12aSMichael Grosse     *
97ea5ad12aSMichael Grosse     * @see finishScope()
98ea5ad12aSMichael Grosse     */
99*d6d97f60SAnna Dabrowska    protected function startScope()
100*d6d97f60SAnna Dabrowska    {
101ea5ad12aSMichael Grosse        // wrapping div
102ea5ad12aSMichael Grosse        if ($this->mode != 'xhtml') return;
103ea5ad12aSMichael Grosse        $this->renderer->doc .= "<div class=\"structaggregation listaggregation\">";
104ea5ad12aSMichael Grosse    }
105ea5ad12aSMichael Grosse
106ea5ad12aSMichael Grosse    /**
107ea5ad12aSMichael Grosse     * Closes anything opened in startScope()
108ea5ad12aSMichael Grosse     *
109ea5ad12aSMichael Grosse     * @see startScope()
110ea5ad12aSMichael Grosse     */
111*d6d97f60SAnna Dabrowska    protected function finishScope()
112*d6d97f60SAnna Dabrowska    {
113ea5ad12aSMichael Grosse        // wrapping div
114ea5ad12aSMichael Grosse        if ($this->mode != 'xhtml') return;
115ea5ad12aSMichael Grosse        $this->renderer->doc .= '</div>';
116ea5ad12aSMichael Grosse    }
117ea5ad12aSMichael Grosse
118ea5ad12aSMichael Grosse    /**
119ea5ad12aSMichael Grosse     * @param $resultrow
120ea5ad12aSMichael Grosse     */
121*d6d97f60SAnna Dabrowska    protected function renderListItem($resultrow)
122*d6d97f60SAnna Dabrowska    {
123ea5ad12aSMichael Grosse        $sepbyheaders = $this->searchConfig->getConf()['sepbyheaders'];
124ea5ad12aSMichael Grosse        $headers = $this->searchConfig->getConf()['headers'];
125ea5ad12aSMichael Grosse
126ea5ad12aSMichael Grosse        /**
127ea5ad12aSMichael Grosse         * @var Value $value
128ea5ad12aSMichael Grosse         */
129ea5ad12aSMichael Grosse        foreach ($resultrow as $column => $value) {
130ea5ad12aSMichael Grosse            if ($value->isEmpty()) {
131ea5ad12aSMichael Grosse                continue;
132ea5ad12aSMichael Grosse            }
133ea5ad12aSMichael Grosse            if ($sepbyheaders && !empty($headers[$column])) {
1342c6e107cSMichael Grosse                if ($this->mode == 'xhtml') {
135ea5ad12aSMichael Grosse                    $this->renderer->doc .= '<span class="struct_header">' . hsc($headers[$column]) . '</span>';
1362c6e107cSMichael Grosse                } else {
1372c6e107cSMichael Grosse                    $this->renderer->cdata($headers[$column]);
138ea5ad12aSMichael Grosse                }
1392c6e107cSMichael Grosse            }
1402c6e107cSMichael Grosse            if ($this->mode == 'xhtml') {
141ea5ad12aSMichael Grosse                $type = 'struct_' . strtolower($value->getColumn()->getType()->getClass());
142ea5ad12aSMichael Grosse                $this->renderer->doc .= '<div class="' . $type . '">';
1432c6e107cSMichael Grosse            }
144ea5ad12aSMichael Grosse            $value->render($this->renderer, $this->mode);
145ea5ad12aSMichael Grosse            if ($column < $this->resultColumnCount) {
1464b303cdaSMichael Grosse                $this->renderer->cdata(' ');
147ea5ad12aSMichael Grosse            }
1482c6e107cSMichael Grosse            if ($this->mode == 'xhtml') {
149ea5ad12aSMichael Grosse                $this->renderer->doc .= '</div>';
150ea5ad12aSMichael Grosse            }
1512c6e107cSMichael Grosse        }
152ea5ad12aSMichael Grosse    }
153ea5ad12aSMichael Grosse}
154