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