private function doExecute($actionId = null, $mayBeModifying = false) { if (!$actionId) { $actionId = $this->app->defaultAction; } if (!$this->app->access->isPermitted($actionId)) { throw new \Exception('Permission denied.'); } $action = $this->getAction($actionId); $headElements = self::baseHeadElements(); $form = new ActionForm($this->reader, $this->app->fields, $action, $actionId); $headElements = array_merge($headElements, $form->getHeadElements()); if ($mayBeModifying || !$action->isModifying()) { $executor = new Executor($this->app->actions, $this->app->fields, $this->reader, $this->app->access); $result = new ActionResult($executor, $this->app->renderers, $action, $actionId, $this->crumbs); $headElements = array_merge($headElements, $result->getHeadElements()); $confirm = false; } else { $confirm = true; } return (new Template(__DIR__ . '/ExecutionTemplate.html.php'))->render(['name' => $this->app->name, 'caption' => $action->caption(), 'menu' => $this->app->menu->render(), 'breadcrumbs' => $this->assembleBreadCrumbs(), 'action' => $form->getModel(), 'result' => isset($result) ? $result->getModel() : null, 'headElements' => HeadElements::filter($headElements), 'executed' => isset($result) && $result->wasExecuted(), 'confirmationRequired' => $confirm, 'token' => $action->isModifying() && $this->app->token ? ['name' => self::TOKEN_ARG, 'value' => $this->app->token->generate($actionId)] : null]); }
/** * @param string $__action * @param WebRequest $__request <- * @return array * @throws \Exception */ public function doGet($__action, WebRequest $__request) { $headElements = self::baseHeadElements(); $renderedAction = null; $caption = 'Error'; $crumbs = []; $reader = new RequestParameterReader($__request); try { $action = $this->app->actions->getAction($__action); $caption = $action->caption(); $executor = new WebExecutor($this->app->actions, $this->app->fields, $this->app->renderers, $reader); $executor->restrictAccess($this->app->getAccessControl($__request)); $result = $executor->execute($__action); if (!$result instanceof RedirectResult) { $crumbs = $this->updateCrumbs($__action, $result, $__request, $reader); $headElements = array_merge($headElements, $executor->getHeadElements()); $actionParameter = new Parameter($__action, new ClassType(get_class($action))); $actionField = $this->app->fields->getField($actionParameter); if (!$actionField instanceof WebField) { throw new \Exception(get_class($actionField) . " must implement WebField"); } $renderedAction = $actionField->render($actionParameter, $this->readParameters($action, $reader)); $headElements = array_merge($headElements, $actionField->headElements($actionParameter)); } } catch (\Exception $e) { $result = new FailedResult($e); } $resultModel = $this->assembleResult($result, $__request); return array_merge(['name' => $this->app->name, 'menu' => $this->app->menu->render($__request), 'breadcrumbs' => $crumbs ? array_slice($crumbs, 0, -1) : null, 'current' => $crumbs ? array_slice($crumbs, -1)[0]['target'] : null, 'caption' => $caption, 'action' => $renderedAction, 'headElements' => HeadElements::filter($headElements)], $resultModel); }