1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeaunamespace ComboStrap\Api; 4*04fd306cSNickeau 5*04fd306cSNickeauuse Api\AjaxHandler; 6*04fd306cSNickeauuse ComboStrap\ExceptionInternal; 7*04fd306cSNickeauuse ComboStrap\ExceptionNotFound; 8*04fd306cSNickeauuse ComboStrap\ExceptionRuntimeInternal; 9*04fd306cSNickeauuse ComboStrap\ExecutionContext; 10*04fd306cSNickeauuse ComboStrap\HttpResponseStatus; 11*04fd306cSNickeauuse ComboStrap\IFetcher; 12*04fd306cSNickeauuse ComboStrap\Mime; 13*04fd306cSNickeauuse ComboStrap\PluginUtility; 14*04fd306cSNickeauuse ComboStrap\Web\Url; 15*04fd306cSNickeauuse dokuwiki\Extension\Event; 16*04fd306cSNickeau 17*04fd306cSNickeauclass ApiRouter 18*04fd306cSNickeau{ 19*04fd306cSNickeau public const CANONICAL = "ajax"; 20*04fd306cSNickeau 21*04fd306cSNickeau /** 22*04fd306cSNickeau * The generic call that should be used for {@link \action_plugin_combo_ajax call} 23*04fd306cSNickeau */ 24*04fd306cSNickeau public const AJAX_CALL_VALUE = "combo"; 25*04fd306cSNickeau const AJAX_CALL_ATTRIBUTE = 'call'; 26*04fd306cSNickeau 27*04fd306cSNickeau /** 28*04fd306cSNickeau * @param Event $event 29*04fd306cSNickeau * @return void 30*04fd306cSNickeau */ 31*04fd306cSNickeau public static function handle(Event $event) 32*04fd306cSNickeau { 33*04fd306cSNickeau 34*04fd306cSNickeau $call = $event->data; 35*04fd306cSNickeau switch ($call) { 36*04fd306cSNickeau case QualityMessageHandler::CALL_ID: 37*04fd306cSNickeau QualityMessageHandler::handle($event); 38*04fd306cSNickeau return; 39*04fd306cSNickeau case MetaManagerHandler::META_MANAGER_CALL_ID: 40*04fd306cSNickeau case MetaManagerHandler::META_VIEWER_CALL_ID: 41*04fd306cSNickeau MetaManagerHandler::handle($event); 42*04fd306cSNickeau return; 43*04fd306cSNickeau } 44*04fd306cSNickeau 45*04fd306cSNickeau $fetchUrl = Url::createFromGetOrPostGlobalVariable(); 46*04fd306cSNickeau if ($call !== self::AJAX_CALL_VALUE && !$fetchUrl->hasProperty(IFetcher::FETCHER_KEY)) { 47*04fd306cSNickeau return; 48*04fd306cSNickeau } 49*04fd306cSNickeau 50*04fd306cSNickeau // no other ajax call handlers needed 51*04fd306cSNickeau $event->stopPropagation(); 52*04fd306cSNickeau $event->preventDefault(); 53*04fd306cSNickeau 54*04fd306cSNickeau 55*04fd306cSNickeau $executionContext = ExecutionContext::getActualOrCreateFromEnv(); 56*04fd306cSNickeau try { 57*04fd306cSNickeau $fetcher = $executionContext->createStringMainFetcherFromRequestedUrl($fetchUrl); 58*04fd306cSNickeau } catch (\Exception $e) { 59*04fd306cSNickeau if (PluginUtility::isTest()) { 60*04fd306cSNickeau throw new ExceptionRuntimeInternal("Error while creating the ajax fetcher.", self::CANONICAL, 1, $e); 61*04fd306cSNickeau } 62*04fd306cSNickeau $executionContext 63*04fd306cSNickeau ->response() 64*04fd306cSNickeau ->setException($e) 65*04fd306cSNickeau ->setBody("Error while creating the fetcher for the fetch Url ($fetchUrl)", Mime::getText()) 66*04fd306cSNickeau ->end(); 67*04fd306cSNickeau return; 68*04fd306cSNickeau } 69*04fd306cSNickeau 70*04fd306cSNickeau $executionContext 71*04fd306cSNickeau ->response() 72*04fd306cSNickeau ->setStatus(HttpResponseStatus::ALL_GOOD) 73*04fd306cSNickeau ->setBody($fetcher->getFetchString(), $fetcher->getMime()) 74*04fd306cSNickeau ->end(); 75*04fd306cSNickeau 76*04fd306cSNickeau 77*04fd306cSNickeau } 78*04fd306cSNickeau 79*04fd306cSNickeau /** 80*04fd306cSNickeau * @throws ExceptionNotFound 81*04fd306cSNickeau */ 82*04fd306cSNickeau public static function getRequestParameter(string $parameter) 83*04fd306cSNickeau { 84*04fd306cSNickeau /** 85*04fd306cSNickeau * Shared check between post and get HTTP method 86*04fd306cSNickeau */ 87*04fd306cSNickeau if (array_key_exists($parameter, $_GET)) { 88*04fd306cSNickeau /** 89*04fd306cSNickeau * May be null value with boolean 90*04fd306cSNickeau */ 91*04fd306cSNickeau return $_GET[$parameter]; 92*04fd306cSNickeau } 93*04fd306cSNickeau 94*04fd306cSNickeau /** 95*04fd306cSNickeau * With {@link TestRequest} 96*04fd306cSNickeau * for instance 97*04fd306cSNickeau */ 98*04fd306cSNickeau if (array_key_exists($parameter, $_REQUEST)) { 99*04fd306cSNickeau return $_REQUEST[$parameter]; 100*04fd306cSNickeau } 101*04fd306cSNickeau 102*04fd306cSNickeau global $INPUT; 103*04fd306cSNickeau if ($INPUT->has($parameter)) { 104*04fd306cSNickeau return $INPUT->str($parameter); 105*04fd306cSNickeau } 106*04fd306cSNickeau 107*04fd306cSNickeau if (defined('DOKU_UNITTEST')) { 108*04fd306cSNickeau global $COMBO; 109*04fd306cSNickeau if (array_key_exists($parameter, $COMBO)) { 110*04fd306cSNickeau return $COMBO[$parameter]; 111*04fd306cSNickeau } 112*04fd306cSNickeau } 113*04fd306cSNickeau 114*04fd306cSNickeau throw new ExceptionNotFound("The parameter ($parameter) was not found for this request"); 115*04fd306cSNickeau 116*04fd306cSNickeau } 117*04fd306cSNickeau 118*04fd306cSNickeau public static function hasRequestParameter(string $parameter): bool 119*04fd306cSNickeau { 120*04fd306cSNickeau try { 121*04fd306cSNickeau self::getRequestParameter($parameter); 122*04fd306cSNickeau return true; 123*04fd306cSNickeau } catch (ExceptionNotFound $e) { 124*04fd306cSNickeau return false; 125*04fd306cSNickeau } 126*04fd306cSNickeau } 127*04fd306cSNickeau} 128