xref: /plugin/bez/struct/BezType.php (revision 9b93b298b733352a4f0b80f5605eb1f78a853271)
1b0590826SSzymon Olewniczak<?php
2b0590826SSzymon Olewniczak
3b0590826SSzymon Olewniczaknamespace dokuwiki\plugin\bez\struct;
4b0590826SSzymon Olewniczak
5b0590826SSzymon Olewniczakuse dokuwiki\plugin\struct\meta\ValidationException;
6b0590826SSzymon Olewniczakuse dokuwiki\plugin\struct\types\AbstractMultiBaseType;
7b0590826SSzymon Olewniczak
8b0590826SSzymon Olewniczakclass BezType extends AbstractMultiBaseType {
9b0590826SSzymon Olewniczak
10*9b93b298SSzymon Olewniczak    const BEZ_TABLE_CODES = array(
11*9b93b298SSzymon Olewniczak        '' => 'thread',
12*9b93b298SSzymon Olewniczak        'k' => 'thread_comment',
13*9b93b298SSzymon Olewniczak        'z' => 'task',
14*9b93b298SSzymon Olewniczak        'zk' => 'task_comment'
15*9b93b298SSzymon Olewniczak    );
16*9b93b298SSzymon Olewniczak
17b0590826SSzymon Olewniczak    protected $config = array(
18b0590826SSzymon Olewniczak        'autocomplete' => array(
19b0590826SSzymon Olewniczak            'maxresult' => 10
20b0590826SSzymon Olewniczak        ),
21b0590826SSzymon Olewniczak    );
22b0590826SSzymon Olewniczak
23b0590826SSzymon Olewniczak    /**
24b0590826SSzymon Olewniczak     * Output the stored data
25b0590826SSzymon Olewniczak     *
26b0590826SSzymon Olewniczak     * @param string $value the value stored in the database
27b0590826SSzymon Olewniczak     * @param \Doku_Renderer $R the renderer currently used to render the data
28b0590826SSzymon Olewniczak     * @param string $mode The mode the output is rendered in (eg. XHTML)
29b0590826SSzymon Olewniczak     * @return bool true if $mode could be satisfied
30b0590826SSzymon Olewniczak     */
31b0590826SSzymon Olewniczak    public function renderValue($value, \Doku_Renderer $R, $mode) {
32*9b93b298SSzymon Olewniczak        preg_match('/#([a-z]*)([0-9]+)/', $value, $matches);
33*9b93b298SSzymon Olewniczak        list(,$code, $id) = $matches;
34b0590826SSzymon Olewniczak        $title = $value;
35*9b93b298SSzymon Olewniczak
36*9b93b298SSzymon Olewniczak        $anchor = '';
37*9b93b298SSzymon Olewniczak        $id_key = 'id';
38*9b93b298SSzymon Olewniczak        switch ($code) {
39*9b93b298SSzymon Olewniczak            case '':
40*9b93b298SSzymon Olewniczak                $table = 'thread';
41*9b93b298SSzymon Olewniczak                break;
42*9b93b298SSzymon Olewniczak            case 'k':
43*9b93b298SSzymon Olewniczak                $table = 'thread';
44*9b93b298SSzymon Olewniczak                $anchor = '#k' . $id;
45*9b93b298SSzymon Olewniczak
46*9b93b298SSzymon Olewniczak                /** @var helper_plugin_sqlite $sqlite */
47*9b93b298SSzymon Olewniczak                $sqlite = plugin_load('helper', 'bez_db')->getDB();
48*9b93b298SSzymon Olewniczak                $res = $sqlite->query("SELECT thread_id FROM thread_comment WHERE id=?", $id);
49*9b93b298SSzymon Olewniczak                $id = $res->fetchColumn();
50*9b93b298SSzymon Olewniczak                break;
51*9b93b298SSzymon Olewniczak            case 'z':
52*9b93b298SSzymon Olewniczak                $table = 'task';
53*9b93b298SSzymon Olewniczak                $id_key = 'tid';
54*9b93b298SSzymon Olewniczak                break;
55*9b93b298SSzymon Olewniczak            case 'zk':
56*9b93b298SSzymon Olewniczak                $table = 'task';
57*9b93b298SSzymon Olewniczak                $id_key = 'tid';
58*9b93b298SSzymon Olewniczak                $anchor = '#zk' . $id;
59*9b93b298SSzymon Olewniczak
60*9b93b298SSzymon Olewniczak                /** @var helper_plugin_sqlite $sqlite */
61*9b93b298SSzymon Olewniczak                $sqlite = plugin_load('helper', 'bez_db')->getDB();
62*9b93b298SSzymon Olewniczak                $res = $sqlite->query("SELECT task_id FROM task_comment WHERE id=?", $id);
63*9b93b298SSzymon Olewniczak                $id = $res->fetchColumn();
64*9b93b298SSzymon Olewniczak                break;
65b0590826SSzymon Olewniczak        }
66b0590826SSzymon Olewniczak
67*9b93b298SSzymon Olewniczak        $wl = wl("bez:$table:$id_key:$id") . $anchor;
68b0590826SSzymon Olewniczak        $R->doc .= '<a href="'.$wl.'">'.$title.'</a>';
69b0590826SSzymon Olewniczak
70b0590826SSzymon Olewniczak
71b0590826SSzymon Olewniczak        return true;
72b0590826SSzymon Olewniczak    }
73b0590826SSzymon Olewniczak
74b0590826SSzymon Olewniczak    /**
75b0590826SSzymon Olewniczak     * Cleans the link
76b0590826SSzymon Olewniczak     *
77b0590826SSzymon Olewniczak     * @param string $rawvalue
78b0590826SSzymon Olewniczak     * @return string
79b0590826SSzymon Olewniczak     */
80b0590826SSzymon Olewniczak    public function validate($rawvalue) {
81*9b93b298SSzymon Olewniczak        preg_match('/#([a-z]*)([0-9]+)/', $rawvalue, $matches);
82*9b93b298SSzymon Olewniczak        list(,$code, $id) = $matches;
83b0590826SSzymon Olewniczak
84b0590826SSzymon Olewniczak        if (!is_numeric($id)) {
85b0590826SSzymon Olewniczak            throw new ValidationException('Invalid BEZ reference');
86b0590826SSzymon Olewniczak        }
87b0590826SSzymon Olewniczak
88*9b93b298SSzymon Olewniczak        if (!in_array($code, array_keys(self::BEZ_TABLE_CODES))) {
89*9b93b298SSzymon Olewniczak                throw new ValidationException('Invalid BEZ reference');
90*9b93b298SSzymon Olewniczak        }
91*9b93b298SSzymon Olewniczak
92*9b93b298SSzymon Olewniczak        $table = self::BEZ_TABLE_CODES[$code];
93ffe3109bSSzymon Olewniczak
94ffe3109bSSzymon Olewniczak        /** @var helper_plugin_sqlite $sqlite */
95ffe3109bSSzymon Olewniczak        $sqlite = plugin_load('helper', 'bez_db')->getDB();
96ffe3109bSSzymon Olewniczak        $res = $sqlite->query("SELECT COUNT(*) FROM $table WHERE id=?", $id);
97ffe3109bSSzymon Olewniczak        $count = $res->fetchColumn();
98ffe3109bSSzymon Olewniczak        if ($count == 0) {
99b0590826SSzymon Olewniczak            throw new ValidationException(ucfirst($table) . " with id: $id doesn't exists.");
100b0590826SSzymon Olewniczak        }
101b0590826SSzymon Olewniczak
102b0590826SSzymon Olewniczak        return $rawvalue;
103b0590826SSzymon Olewniczak    }
104b0590826SSzymon Olewniczak
105b0590826SSzymon Olewniczak    /**
106b0590826SSzymon Olewniczak     * Autocompletion support for pages
107b0590826SSzymon Olewniczak     *
108b0590826SSzymon Olewniczak     * @return array
109b0590826SSzymon Olewniczak     */
110b0590826SSzymon Olewniczak    public function handleAjax() {
111b0590826SSzymon Olewniczak        global $INPUT;
112b0590826SSzymon Olewniczak
113b0590826SSzymon Olewniczak        // check minimum length
114b0590826SSzymon Olewniczak        $lookup = trim($INPUT->str('search'));
115b0590826SSzymon Olewniczak        if(utf8_strlen($lookup) < 1) return array();
116b0590826SSzymon Olewniczak        if ($lookup[0] != '#') return array();
117b0590826SSzymon Olewniczak
118*9b93b298SSzymon Olewniczak        preg_match('/#([a-z]*)([0-9]+)/', $lookup, $matches);
119*9b93b298SSzymon Olewniczak        list(,$code, $id) = $matches;
120b0590826SSzymon Olewniczak
121b0590826SSzymon Olewniczak        if (!is_numeric($id)) return array();
122*9b93b298SSzymon Olewniczak        if (!in_array($code, array_keys(self::BEZ_TABLE_CODES))) return array();
123b0590826SSzymon Olewniczak
124*9b93b298SSzymon Olewniczak        $table = self::BEZ_TABLE_CODES[$code];
125b0590826SSzymon Olewniczak
126b0590826SSzymon Olewniczak        // results wanted?
127b0590826SSzymon Olewniczak        $max = (int)$this->config['autocomplete']['maxresult'];
128b0590826SSzymon Olewniczak        if($max <= 0) return array();
129b0590826SSzymon Olewniczak
130ffe3109bSSzymon Olewniczak        $bez_db_helper = plugin_load('helper', 'bez_db');
131ffe3109bSSzymon Olewniczak
132ffe3109bSSzymon Olewniczak        /** @var helper_plugin_sqlite $sqlite */
133ffe3109bSSzymon Olewniczak        $sqlite = $bez_db_helper->getDB();
134*9b93b298SSzymon Olewniczak
135*9b93b298SSzymon Olewniczak        $fields = array('id');
136*9b93b298SSzymon Olewniczak        if ($table == 'thread' || $table == 'task') {
137*9b93b298SSzymon Olewniczak            $fields[] = 'state';
138*9b93b298SSzymon Olewniczak        }
139*9b93b298SSzymon Olewniczak
140*9b93b298SSzymon Olewniczak        $sql = "SELECT " . implode(',', $fields) . " FROM $table WHERE id LIKE ? LIMIT $max";
141ffe3109bSSzymon Olewniczak        $res = $sqlite->query($sql, $id . '%');
142b0590826SSzymon Olewniczak
143b0590826SSzymon Olewniczak        $result = array();
144ffe3109bSSzymon Olewniczak        while ($row = $res->fetch(\PDO::FETCH_ASSOC)) {
145b0590826SSzymon Olewniczak
146*9b93b298SSzymon Olewniczak            $name = $value = '#' . $code . $row['id'];
147*9b93b298SSzymon Olewniczak            if ($table == 'thread' || $table == 'task') {
148*9b93b298SSzymon Olewniczak                $state = $bez_db_helper->getLang('state_' . $row['state']);
149*9b93b298SSzymon Olewniczak                $name .= ' (' . $state . ')';
150b0590826SSzymon Olewniczak            }
151b0590826SSzymon Olewniczak
152b0590826SSzymon Olewniczak            $result[] = array(
153b0590826SSzymon Olewniczak                'label' => $name,
154b0590826SSzymon Olewniczak                'value' => $value
155b0590826SSzymon Olewniczak            );
156b0590826SSzymon Olewniczak        }
157b0590826SSzymon Olewniczak
158b0590826SSzymon Olewniczak        return $result;
159b0590826SSzymon Olewniczak    }
160b0590826SSzymon Olewniczak}