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