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