1914921fbSAndreas Gohr<?php 2d6d97f60SAnna Dabrowska 3914921fbSAndreas Gohr/** 4914921fbSAndreas Gohr * DokuWiki Plugin struct (Action Component) 5914921fbSAndreas Gohr * 6914921fbSAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 7914921fbSAndreas Gohr * @author Andreas Gohr, Michael Große <dokuwiki@cosmocode.de> 8914921fbSAndreas Gohr */ 9914921fbSAndreas Gohr 107234bfb1Ssplitbrainuse dokuwiki\Extension\ActionPlugin; 117234bfb1Ssplitbrainuse dokuwiki\Extension\EventHandler; 127234bfb1Ssplitbrainuse dokuwiki\Extension\Event; 13ba766201SAndreas Gohruse dokuwiki\plugin\struct\meta\Schema; 14ba766201SAndreas Gohruse dokuwiki\plugin\struct\meta\StructException; 15914921fbSAndreas Gohr 167234bfb1Ssplitbrainclass action_plugin_struct_ajax extends ActionPlugin 17d6d97f60SAnna Dabrowska{ 18914921fbSAndreas Gohr /** 19914921fbSAndreas Gohr * Registers a callback function for a given event 20914921fbSAndreas Gohr * 21*5e29103aSannda * @param EventHandler $controller DokuWiki's event controller object 22914921fbSAndreas Gohr * @return void 23914921fbSAndreas Gohr */ 247234bfb1Ssplitbrain public function register(EventHandler $controller) 25d6d97f60SAnna Dabrowska { 26748e747fSAnna Dabrowska $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handleAjax'); 27914921fbSAndreas Gohr } 28914921fbSAndreas Gohr 29914921fbSAndreas Gohr /** 30914921fbSAndreas Gohr * Pass Ajax call to a type 31914921fbSAndreas Gohr * 32*5e29103aSannda * @param Event $event event object by reference 33914921fbSAndreas Gohr */ 347234bfb1Ssplitbrain public function handleAjax(Event $event) 35d6d97f60SAnna Dabrowska { 36914921fbSAndreas Gohr if ($event->data != 'plugin_struct') return; 37914921fbSAndreas Gohr $event->preventDefault(); 38914921fbSAndreas Gohr $event->stopPropagation(); 399dfe4ab9SAndreas Gohr global $conf; 40914921fbSAndreas Gohr 41914921fbSAndreas Gohr header('Content-Type: application/json'); 42914921fbSAndreas Gohr try { 43914921fbSAndreas Gohr $result = $this->executeTypeAjax(); 44914921fbSAndreas Gohr } catch (StructException $e) { 457fe2cdf2SAndreas Gohr $result = [ 467fe2cdf2SAndreas Gohr 'error' => $e->getMessage() . ' ' . basename($e->getFile()) . ':' . $e->getLine() 477fe2cdf2SAndreas Gohr ]; 489dfe4ab9SAndreas Gohr if ($conf['allowdebug']) { 499dfe4ab9SAndreas Gohr $result['stacktrace'] = $e->getTraceAsString(); 509dfe4ab9SAndreas Gohr } 51914921fbSAndreas Gohr http_status(500); 52914921fbSAndreas Gohr } 53914921fbSAndreas Gohr 54*5e29103aSannda echo json_encode($result, JSON_THROW_ON_ERROR); 55914921fbSAndreas Gohr } 56914921fbSAndreas Gohr 57914921fbSAndreas Gohr /** 58914921fbSAndreas Gohr * Check the input variables and run the AJAX call 59914921fbSAndreas Gohr * 60914921fbSAndreas Gohr * @return mixed 610549dcc5SAndreas Gohr * @throws StructException 62914921fbSAndreas Gohr */ 63d6d97f60SAnna Dabrowska protected function executeTypeAjax() 64d6d97f60SAnna Dabrowska { 65914921fbSAndreas Gohr global $INPUT; 66914921fbSAndreas Gohr 67914921fbSAndreas Gohr $col = $INPUT->str('column'); 68914921fbSAndreas Gohr if (blank($col)) throw new StructException('No column provided'); 697234bfb1Ssplitbrain [$schema, $colname] = explode('.', $col, 2); 70914921fbSAndreas Gohr if (blank($schema) || blank($colname)) throw new StructException('Column format is wrong'); 71914921fbSAndreas Gohr 72914921fbSAndreas Gohr $schema = new Schema($schema); 73914921fbSAndreas Gohr if (!$schema->getId()) throw new StructException('Unknown Schema'); 74914921fbSAndreas Gohr 75914921fbSAndreas Gohr $column = $schema->findColumn($colname); 76914921fbSAndreas Gohr if ($column === false) throw new StructException('Column not found'); 77914921fbSAndreas Gohr 78914921fbSAndreas Gohr return $column->getType()->handleAjax(); 79914921fbSAndreas Gohr } 80914921fbSAndreas Gohr} 81