xref: /plugin/data/action.php (revision 820f7b69ab991d98fcb477d9c2cf41aaecde87ec)
14396c296SAndreas Gohr<?php
2b7b9d8d9SAnna Dabrowska
3b7b9d8d9SAnna Dabrowskause dokuwiki\Extension\ActionPlugin;
4b7b9d8d9SAnna Dabrowskause dokuwiki\Extension\EventHandler;
5b7b9d8d9SAnna Dabrowskause dokuwiki\Extension\Event;
6b7b9d8d9SAnna Dabrowskause dokuwiki\Utf8\PhpString;
7b7b9d8d9SAnna Dabrowska
84396c296SAndreas Gohr/**
94396c296SAndreas Gohr *
104396c296SAndreas Gohr * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
114396c296SAndreas Gohr * @author     Andreas Gohr <andi@splitbrain.org>
124396c296SAndreas Gohr */
13e064ed41SGerrit Uitslag/**
14e064ed41SGerrit Uitslag * Class action_plugin_data
15e064ed41SGerrit Uitslag */
16b7b9d8d9SAnna Dabrowskaclass action_plugin_data extends ActionPlugin
178a51ccb3SAndreas Gohr{
184396c296SAndreas Gohr    /**
193588040dSAndreas Gohr     * will hold the data helper plugin
20cf711e76SGerrit Uitslag     * @var helper_plugin_data
214396c296SAndreas Gohr     */
22b7b9d8d9SAnna Dabrowska    public $dthlp;
233588040dSAndreas Gohr
243588040dSAndreas Gohr    /**
2555325c0dSAndreas Gohr     * Constructor. Load helper plugin
2655325c0dSAndreas Gohr     */
27b7b9d8d9SAnna Dabrowska    public function __construct()
288a51ccb3SAndreas Gohr    {
29cf711e76SGerrit Uitslag        $this->dthlp = plugin_load('helper', 'data');
3055325c0dSAndreas Gohr    }
3155325c0dSAndreas Gohr
3255325c0dSAndreas Gohr    /**
334396c296SAndreas Gohr     * Registers a callback function for a given event
344396c296SAndreas Gohr     */
35b7b9d8d9SAnna Dabrowska    public function register(EventHandler $controller)
368a51ccb3SAndreas Gohr    {
37*820f7b69SAnna Dabrowska        $controller->register_hook('IO_WIKIPAGE_WRITE', 'BEFORE', $this, 'handle');
38*820f7b69SAnna Dabrowska        $controller->register_hook('HTML_SECEDIT_BUTTON', 'BEFORE', $this, 'editButton');
39*820f7b69SAnna Dabrowska        $controller->register_hook('HTML_EDIT_FORMSELECTION', 'BEFORE', $this, 'editForm'); // deprecated
40*820f7b69SAnna Dabrowska        $controller->register_hook('EDIT_FORM_ADDTEXTAREA', 'BEFORE', $this, 'editForm'); // replacement
41*820f7b69SAnna Dabrowska        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handleEditPost');
42*820f7b69SAnna Dabrowska        $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handleAjax');
434396c296SAndreas Gohr    }
444396c296SAndreas Gohr
454396c296SAndreas Gohr    /**
4679189949SAndreas Gohr     * Handles the page write event and removes the database info
4779189949SAndreas Gohr     * when the plugin code is no longer in the source
48e064ed41SGerrit Uitslag     *
49b7b9d8d9SAnna Dabrowska     * @param Event $event
50e064ed41SGerrit Uitslag     * @param null $param
514396c296SAndreas Gohr     */
52*820f7b69SAnna Dabrowska    public function handle(Event $event, $param)
538a51ccb3SAndreas Gohr    {
544396c296SAndreas Gohr        $data = $event->data;
5579189949SAndreas Gohr        if (strpos($data[0][1], 'dataentry') !== false) return; // plugin seems still to be there
5679189949SAndreas Gohr
57*820f7b69SAnna Dabrowska        $sqlite = $this->dthlp->getDB();
58436288beSAndreas Gohr        if (!$sqlite) return;
5954c3d277SAndreas Gohr        $id = ltrim($data[1] . ':' . $data[2], ':');
604396c296SAndreas Gohr
614396c296SAndreas Gohr        // get page id
629c149d75SAndreas Gohr        $pid = (int) $sqlite->queryValue('SELECT pid FROM pages WHERE page = ?', $id);
634396c296SAndreas Gohr        if (!$pid) return; // we have no data for this page
644396c296SAndreas Gohr
659c149d75SAndreas Gohr        $sqlite->exec('DELETE FROM data WHERE pid = ?', $pid);
669c149d75SAndreas Gohr        $sqlite->exec('DELETE FROM pages WHERE pid = ?', $pid);
674396c296SAndreas Gohr    }
68b21b04a1SAdrian Lang
69e064ed41SGerrit Uitslag    /**
70b7b9d8d9SAnna Dabrowska     * @param Event $event
71e064ed41SGerrit Uitslag     * @param null $param
72e064ed41SGerrit Uitslag     */
73*820f7b69SAnna Dabrowska    public function editButton($event, $param)
748a51ccb3SAndreas Gohr    {
75b21b04a1SAdrian Lang        if ($event->data['target'] !== 'plugin_data') {
76b21b04a1SAdrian Lang            return;
774396c296SAndreas Gohr        }
784396c296SAndreas Gohr
79b21b04a1SAdrian Lang        $event->data['name'] = $this->getLang('dataentry');
80b21b04a1SAdrian Lang    }
81b21b04a1SAdrian Lang
82e064ed41SGerrit Uitslag    /**
83b7b9d8d9SAnna Dabrowska     * @param Event $event
84e064ed41SGerrit Uitslag     * @param null $param
85e064ed41SGerrit Uitslag     */
86*820f7b69SAnna Dabrowska    public function editForm(Event $event, $param)
878a51ccb3SAndreas Gohr    {
88022080a3SAdrian Lang        global $TEXT;
89fe417445SAdrian Lang        if ($event->data['target'] !== 'plugin_data') {
90af46030fSAdrian Lang            // Not a data edit
91b21b04a1SAdrian Lang            return;
92b21b04a1SAdrian Lang        }
93b21b04a1SAdrian Lang
94b21b04a1SAdrian Lang        $event->stopPropagation();
95b21b04a1SAdrian Lang        $event->preventDefault();
96022080a3SAdrian Lang        unset($event->data['intro_locale']);
97022080a3SAdrian Lang        $event->data['media_manager'] = false;
98b21b04a1SAdrian Lang
9933da37c2SAdrian Lang        echo $this->locale_xhtml('edit_intro' . ($this->getConf('edit_content_only') ? '_contentonly' : ''));
100022080a3SAdrian Lang
101b7b9d8d9SAnna Dabrowska        require_once __DIR__ . '/renderer_data_edit.php';
102b21b04a1SAdrian Lang        $Renderer = new Doku_Renderer_plugin_data_edit();
1033c96821eSAdrian Lang        $Renderer->form = $event->data['form'];
104b21b04a1SAdrian Lang
105b21b04a1SAdrian Lang        // Loop through the instructions
1063c96821eSAdrian Lang        $instructions = p_get_instructions($TEXT);
107b21b04a1SAdrian Lang        foreach ($instructions as $instruction) {
108b21b04a1SAdrian Lang            // Execute the callback against the Renderer
109b7b9d8d9SAnna Dabrowska            call_user_func_array([$Renderer, $instruction[0]], $instruction[1]);
110b21b04a1SAdrian Lang        }
111b21b04a1SAdrian Lang    }
112b21b04a1SAdrian Lang
113e064ed41SGerrit Uitslag    /**
114b7b9d8d9SAnna Dabrowska     * @param Event $event
115e064ed41SGerrit Uitslag     */
116*820f7b69SAnna Dabrowska    public function handleEditPost(Event $event)
1178a51ccb3SAndreas Gohr    {
118b21b04a1SAdrian Lang        if (!isset($_POST['data_edit'])) {
119b21b04a1SAdrian Lang            return;
120b21b04a1SAdrian Lang        }
121b21b04a1SAdrian Lang        global $TEXT;
122b21b04a1SAdrian Lang
123b7b9d8d9SAnna Dabrowska        require_once __DIR__ . '/syntax/entry.php';
124b21b04a1SAdrian Lang        $TEXT = syntax_plugin_data_entry::editToWiki($_POST['data_edit']);
125b21b04a1SAdrian Lang    }
126f2253ab5SAdrian Lang
127e064ed41SGerrit Uitslag    /**
128b7b9d8d9SAnna Dabrowska     * @param Event $event
129e064ed41SGerrit Uitslag     */
130*820f7b69SAnna Dabrowska    public function handleAjax(Event $event)
1318a51ccb3SAndreas Gohr    {
132f82309e2SKlap-in        if ($event->data !== 'data_page') {
133f2253ab5SAdrian Lang            return;
134f2253ab5SAdrian Lang        }
135fc7d04c3SAndreas Gohr
136f82309e2SKlap-in        $event->stopPropagation();
137f2253ab5SAdrian Lang        $event->preventDefault();
138f2253ab5SAdrian Lang
139f82309e2SKlap-in        $type = substr($_REQUEST['aliastype'], 10);
140*820f7b69SAnna Dabrowska        $aliases = $this->dthlp->aliases();
141f82309e2SKlap-in
142f2253ab5SAdrian Lang        if (!isset($aliases[$type])) {
143f2253ab5SAdrian Lang            echo 'Unknown type';
144f2253ab5SAdrian Lang            return;
145f2253ab5SAdrian Lang        }
146f82309e2SKlap-in
14759c247ddSAdrian Lang        if ($aliases[$type]['type'] !== 'page') {
14859c247ddSAdrian Lang            echo 'AutoCompletion is only supported for page types';
14959c247ddSAdrian Lang            return;
15059c247ddSAdrian Lang        }
15159c247ddSAdrian Lang
1529c25d143SAdrian Lang        if (substr($aliases[$type]['postfix'], -1, 1) === ':') {
1539c25d143SAdrian Lang            // Resolve namespace start page ID
1549c25d143SAdrian Lang            global $conf;
1559c25d143SAdrian Lang            $aliases[$type]['postfix'] .= $conf['start'];
1569c25d143SAdrian Lang        }
157f2253ab5SAdrian Lang
158f82309e2SKlap-in        $search = $_REQUEST['search'];
159decc3475SAdrian Lang
160decc3475SAdrian Lang        $c_search = $search;
161decc3475SAdrian Lang        $in_ns = false;
162decc3475SAdrian Lang        if (!$search) {
163decc3475SAdrian Lang            // No search given, so we just want all pages in the prefix
164decc3475SAdrian Lang            $c_search = $aliases[$type]['prefix'];
165decc3475SAdrian Lang            $in_ns = true;
166decc3475SAdrian Lang        }
167decc3475SAdrian Lang        $pages = ft_pageLookup($c_search, $in_ns, false);
168e9585925SAdrian Lang
169e9585925SAdrian Lang        $regexp = '/^';
170e9585925SAdrian Lang        if ($aliases[$type]['prefix'] !== '') {
171e9585925SAdrian Lang            $regexp .= preg_quote($aliases[$type]['prefix'], '/');
172e9585925SAdrian Lang        }
173e9585925SAdrian Lang        $regexp .= '([^:]+)';
174e9585925SAdrian Lang        if ($aliases[$type]['postfix'] !== '') {
175e9585925SAdrian Lang            $regexp .= preg_quote($aliases[$type]['postfix'], '/');
176e9585925SAdrian Lang        }
177e9585925SAdrian Lang        $regexp .= '$/';
178e9585925SAdrian Lang
179b7b9d8d9SAnna Dabrowska        $result = [];
180417a675cSAdrian Lang        foreach ($pages as $page => $title) {
181b7b9d8d9SAnna Dabrowska            $id = [];
182e9585925SAdrian Lang            if (!preg_match($regexp, $page, $id)) {
183e9585925SAdrian Lang                // Does not satisfy the postfix and prefix criteria
184f2253ab5SAdrian Lang                continue;
185f2253ab5SAdrian Lang            }
186f2253ab5SAdrian Lang
187e9585925SAdrian Lang            $id = $id[1];
188f2253ab5SAdrian Lang
189b7b9d8d9SAnna Dabrowska            if (
190b7b9d8d9SAnna Dabrowska                $search !== '' &&
191e9585925SAdrian Lang                stripos($id, cleanID($search)) === false &&
192b7b9d8d9SAnna Dabrowska                stripos($title, (string) $search) === false
193b7b9d8d9SAnna Dabrowska            ) {
194e9585925SAdrian Lang                // Search string is not in id part or title
195f2253ab5SAdrian Lang                continue;
196f2253ab5SAdrian Lang            }
197f2253ab5SAdrian Lang
198417a675cSAdrian Lang            if ($title === '') {
199b7b9d8d9SAnna Dabrowska                $title = PhpString::ucwords(str_replace('_', ' ', $id));
200894aba35SAdrian Lang            }
201417a675cSAdrian Lang            $result[hsc($id)] = hsc($title);
202f2253ab5SAdrian Lang        }
203f2253ab5SAdrian Lang
204fc7d04c3SAndreas Gohr        header('Content-Type: application/json');
205b7b9d8d9SAnna Dabrowska        echo json_encode($result);
206f2253ab5SAdrian Lang    }
207b21b04a1SAdrian Lang}
208