xref: /plugin/struct/meta/AggregationList.php (revision 4b303cda4f3419d0d58d2e50e81e8423db527045)
1ea5ad12aSMichael Grosse<?php
2ea5ad12aSMichael Grosse
3ea5ad12aSMichael Grossenamespace dokuwiki\plugin\struct\meta;
4ea5ad12aSMichael Grosse
5ea5ad12aSMichael Grosse
6ea5ad12aSMichael Grosse/**
7ea5ad12aSMichael Grosse * Class AggregationList
8ea5ad12aSMichael Grosse *
9ea5ad12aSMichael Grosse * @package dokuwiki\plugin\struct\meta
10ea5ad12aSMichael Grosse */
11ea5ad12aSMichael Grosseclass AggregationList {
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     */
55ea5ad12aSMichael Grosse    public function __construct($id, $mode, \Doku_Renderer $renderer, SearchConfig $searchConfig) {
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     */
71ea5ad12aSMichael Grosse    public function render() {
72ea5ad12aSMichael Grosse
73ea5ad12aSMichael Grosse        $this->startScope();
74ea5ad12aSMichael Grosse
752c6e107cSMichael Grosse        $this->renderer->listu_open();
76ea5ad12aSMichael Grosse
77ea5ad12aSMichael Grosse        foreach ($this->result as $result) {
782c6e107cSMichael Grosse            $this->renderer->listitem_open(1);
792c6e107cSMichael Grosse            $this->renderer->listcontent_open();
80ea5ad12aSMichael Grosse            $this->renderListItem($result);
812c6e107cSMichael Grosse            $this->renderer->listcontent_close();
822c6e107cSMichael Grosse            $this->renderer->listitem_close();
83ea5ad12aSMichael Grosse        }
84ea5ad12aSMichael Grosse
852c6e107cSMichael Grosse        $this->renderer->listu_close();
86ea5ad12aSMichael Grosse
87ea5ad12aSMichael Grosse        $this->finishScope();
88ea5ad12aSMichael Grosse
89ea5ad12aSMichael Grosse        return;
90ea5ad12aSMichael Grosse    }
91ea5ad12aSMichael Grosse
92ea5ad12aSMichael Grosse    /**
93ea5ad12aSMichael Grosse     * Adds additional info to document and renderer in XHTML mode
94ea5ad12aSMichael Grosse     *
95ea5ad12aSMichael Grosse     * @see finishScope()
96ea5ad12aSMichael Grosse     */
97ea5ad12aSMichael Grosse    protected function startScope() {
98ea5ad12aSMichael Grosse        // wrapping div
99ea5ad12aSMichael Grosse        if($this->mode != 'xhtml') return;
100ea5ad12aSMichael Grosse        $this->renderer->doc .= "<div class=\"structaggregation listaggregation\">";
101ea5ad12aSMichael Grosse    }
102ea5ad12aSMichael Grosse
103ea5ad12aSMichael Grosse    /**
104ea5ad12aSMichael Grosse     * Closes anything opened in startScope()
105ea5ad12aSMichael Grosse     *
106ea5ad12aSMichael Grosse     * @see startScope()
107ea5ad12aSMichael Grosse     */
108ea5ad12aSMichael Grosse    protected function finishScope() {
109ea5ad12aSMichael Grosse        // wrapping div
110ea5ad12aSMichael Grosse        if($this->mode != 'xhtml') return;
111ea5ad12aSMichael Grosse        $this->renderer->doc .= '</div>';
112ea5ad12aSMichael Grosse    }
113ea5ad12aSMichael Grosse
114ea5ad12aSMichael Grosse    /**
115ea5ad12aSMichael Grosse     * @param $resultrow
116ea5ad12aSMichael Grosse     */
117ea5ad12aSMichael Grosse    protected function renderListItem($resultrow) {
118ea5ad12aSMichael Grosse        $sepbyheaders = $this->searchConfig->getConf()['sepbyheaders'];
119ea5ad12aSMichael Grosse        $headers = $this->searchConfig->getConf()['headers'];
120ea5ad12aSMichael Grosse
121ea5ad12aSMichael Grosse        /**
122ea5ad12aSMichael Grosse         * @var Value $value
123ea5ad12aSMichael Grosse         */
124ea5ad12aSMichael Grosse        foreach ($resultrow as $column => $value) {
125ea5ad12aSMichael Grosse            if ($value->isEmpty()) {
126ea5ad12aSMichael Grosse                continue;
127ea5ad12aSMichael Grosse            }
128ea5ad12aSMichael Grosse            if ($sepbyheaders && !empty($headers[$column])) {
1292c6e107cSMichael Grosse                if ($this->mode == 'xhtml') {
130ea5ad12aSMichael Grosse                    $this->renderer->doc .= '<span class="struct_header">' . hsc($headers[$column]) . '</span>';
1312c6e107cSMichael Grosse                } else {
1322c6e107cSMichael Grosse                    $this->renderer->cdata($headers[$column]);
133ea5ad12aSMichael Grosse                }
1342c6e107cSMichael Grosse            }
1352c6e107cSMichael Grosse            if ($this->mode == 'xhtml') {
136ea5ad12aSMichael Grosse                $type = 'struct_' . strtolower($value->getColumn()->getType()->getClass());
137ea5ad12aSMichael Grosse                $this->renderer->doc .= '<div class="' . $type . '">';
1382c6e107cSMichael Grosse            }
139ea5ad12aSMichael Grosse            $value->render($this->renderer, $this->mode);
140ea5ad12aSMichael Grosse            if ($column < $this->resultColumnCount) {
141*4b303cdaSMichael Grosse                $this->renderer->cdata(' ');
142ea5ad12aSMichael Grosse            }
1432c6e107cSMichael Grosse            if ($this->mode == 'xhtml') {
144ea5ad12aSMichael Grosse                $this->renderer->doc .= '</div>';
145ea5ad12aSMichael Grosse            }
1462c6e107cSMichael Grosse        }
147ea5ad12aSMichael Grosse
148ea5ad12aSMichael Grosse    }
149ea5ad12aSMichael Grosse}
150