protected function modelToJsonData($parents, $preLoaded) { $modelData = ''; if ($models = $preLoaded ?? $this->modelLoader->loadModels($parents)) { foreach ($models as $name => $model) { $modelData .= $this->modelBridge->modelToJsData($model, $name); } } return $modelData; }
public function execute(ControllerEvent $event) { try { $params = $event->getParams(true) ?? []; $ajaxReq = $params['_contentType'] === 'ajax'; if ($params['_method'] === 'GET' && ($parents = $params['_parents'] ?? null)) { $alias = $ajaxReq ? $params['alias'] : null; if ($models = $this->modelLoader->loadModels($parents, $alias)) { $event->setParam('_models', $models); foreach ($models as $key => $value) { $event->setParam($key, $value); } } foreach ($parents as $key => $value) { $event->setParam("_{$key}", $models[$key] ?? []); } } $args = array_merge([':event' => $event], $event->getParams() ?? []); $action = $this->getController($event->getController()); $final = true; $response = $output = $this->injector->execute($action, $args); if ($response instanceof Redirection) { $this->dispatcher->fire(RedirectEvent::REDIRECT, new RedirectEvent($response)); //chance to do something with redirection $response->redirect(); //exists } else { if ($response instanceof HttpResponseEx) { $event->setResponse($this->response); } else { if ($response instanceof View) { if ($ajaxReq && !empty($alias) && !empty($models)) { $output = '{}'; /** @var CollectionEx $model */ foreach ($models as $tlp => $model) { if ($array = $model->toArray()) { if ($child = $tlp === $alias ? $array : $this->findChildByAlias($array, $alias)) { $output = json_encode($child, JSON_PRETTY_PRINT); } } } } else { /** @var View $view */ $view = $response; $final = $response->isFinal(); $this->viewParser->setHelpers($view->getHelpers()); $this->viewParser->setLayout($view->getLayout()); $this->viewParser->setAdditionalLayoutFiles($view->getAdditionalLayoutFiles()); $this->viewParser->setVars(array_merge($event->getParams(true) ?? [], $view->getVars() ?? [])); if ($content = $view->getContent()) { if (!empty($view->getViewFile())) { trigger_error('You should only specify either content or view file'); } $this->viewParser->setContent($content); } elseif ($templatePath = $view->getViewFile()) { $this->viewParser->loadViewFile($templatePath, $view->isPathLayouts()); } elseif (empty($view->getViewFile())) { if (is_string($event->getController())) { @(list($class) = explode('@', $event->getController(), 2)); $this->viewParser->loadViewFile($class, $view->isPathLayouts()); } else { throw new ControllerError("View must be explicitly set (when Controller is not a string)"); } } $output = $this->viewParser->render(); } } $this->response->setStatusCode(200); $this->response->setContent(is_string($output) ? $output : ''); $this->response->setFinal($final); $event->setResponse($this->response); } } } catch (InjectionException $e) { throw new ControllerError(sprintf("Unable to run controller: %s [%s]", $e->getMessage(), var_export($event->getController(), true))); } }