%PDF- %PDF-
Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/components/ |
Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/components/Controller.php |
<?php /** * @link https://www.humhub.org/ * @copyright Copyright (c) 2017 HumHub GmbH & Co. KG * @license https://www.humhub.com/licences */ namespace humhub\components; use humhub\components\access\ControllerAccess; use humhub\components\access\StrictAccess; use humhub\components\behaviors\AccessControl; use Yii; use yii\helpers\Url; use yii\helpers\Html; use yii\web\ForbiddenHttpException; /** * Base Controller * * * @property View $view * @inheritdoc * @author luke */ class Controller extends \yii\web\Controller { /** * @event \yii\base\Event an event raised on init a controller. */ const EVENT_INIT = 'init'; /** * @var null|string the name of the sub layout to be applied to this controller's views. * This property mainly affects the behavior of [[render()]]. */ public $subLayout = null; /** * @var string title of the rendered page */ public $pageTitle; /** * @var array page titles */ public $actionTitlesMap = []; /** * @var boolean append page title */ public $prependActionTitles = true; /** * @var string defines the ControllerAccess class for this controller responsible for managing access rules * @see self::getAccess() */ protected $access = StrictAccess::class; /** * @var string[] List of action ids which should not be intercepted by another actions. Use '*' for all action ids. * @since 1.9 */ protected $doNotInterceptActionIds = []; /** * Returns access rules for the standard access control behavior. * * @see AccessControl * @return array the access permissions */ protected function getAccessRules() { return []; } /** * @return null|ControllerAccess returns a ControllerAccess instance */ public function getAccess() { if (!$this->access) { return null; } return Yii::createObject($this->access); } /** * @inheritdoc */ public function init() { parent::init(); $this->trigger(self::EVENT_INIT); } public function behaviors() { return [ 'acl' => [ 'class' => AccessControl::class, 'rules' => $this->getAccessRules() ] ]; } /** * @inheritdoc */ public function renderAjaxContent($content) { return $this->getView()->renderAjaxContent($content); } /** * Renders a string as Ajax including assets without end page so it can be called several times. * * @param string $content * @return string Rendered content */ public function renderAjaxPartial(string $content): string { return $this->getView()->renderAjaxPartial($content); } /** * Renders a static string by applying the layouts (sublayout + layout. * * @param string $content the static string being rendered * @return string the rendering result of the layout with the given static string as the `$content` variable. * If the layout is disabled, the string will be returned back. * * @since 1.2 */ public function renderContent($content) { // Apply Sublayout if provided if ($this->subLayout !== null) { $content = $this->getView()->render($this->subLayout . '.php', ['content' => $content], $this); } // Return Pjax Snippet if (Yii::$app->request->isPjax) { return $this->renderAjaxContent($content); } $layoutFile = $this->findLayoutFile($this->getView()); if ($layoutFile !== false) { return $this->getView()->renderFile($layoutFile, ['content' => Html::tag('div', $content, ['id' => 'layout-content'])], $this); } else { return $content; } } /** * Throws HttpException in case the request is not an post request, otherwise returns true. * * @throws \yii\web\HttpException * @return boolean returns true in case the current request is a POST */ public function forcePostRequest() { if (Yii::$app->request->method != 'POST') { throw new \yii\web\HttpException(405, Yii::t('ContentModule.base', 'Invalid request method!')); } return true; } /** * Create Redirect for AJAX Requests which output goes into HTML content. * Is an alternative method to redirect, for ajax responses. */ public function htmlRedirect($url = "") { return $this->renderPartial('@humhub/views/htmlRedirect.php', [ 'url' => Url::to($url) ]); } /** * @throws ForbiddenHttpException * @since 1.2 */ protected function forbidden() { throw new ForbiddenHttpException(Yii::t('error', 'You are not allowed to perform this action.')); } /** * Closes a modal */ public function renderModalClose() { return $this->renderPartial('@humhub/views/modalClose.php', []); } /** * * @see \yii\web\Controller::beforeAction() */ public function beforeAction($action) { if (parent::beforeAction($action)) { if (array_key_exists($this->action->id, $this->actionTitlesMap)) { if ($this->prependActionTitles) { $this->prependPageTitle($this->actionTitlesMap[$this->action->id]); } else { $this->appendPageTitle($this->actionTitlesMap[$this->action->id]); } } if (!empty($this->pageTitle)) { $this->getView()->setPageTitle($this->pageTitle); } if (!Yii::$app->request->isAjax || Yii::$app->request->isPjax) { $this->setJsViewStatus(); } return true; } return false; } /** * Append a page title. * * @param string $title */ public function appendPageTitle($title) { $this->pageTitle .= empty($this->pageTitle) ? $title : ' - ' . $title; } /** * Prepend a page title. * * @param string $title */ public function prependPageTitle($title) { $this->pageTitle = empty($this->pageTitle) ? $title : $title . ' - ' . $this->pageTitle; } /** * Set the page title. * * @param string $title */ public function setPageTitle($title) { $this->pageTitle = $title; } /** * Set a map that indicates what page title should be shown for the currently active action. * It will be appended to * * @param array $map * [action_id => action_page_title] * @param boolean $prependActionTitles set to false if the action titles should rather be appended */ public function setActionTitles($map = [], $prependActionTitles = true) { $this->actionTitlesMap = is_array($map) ? $map : []; $this->prependActionTitles = $prependActionTitles; } /** * @inheritdoc */ public function redirect($url, $statusCode = 302) { if (Yii::$app->request->isPjax) { Yii::$app->response->statusCode = $statusCode; Yii::$app->response->headers->add('X-PJAX-REDIRECT-URL', Url::to($url)); return Yii::$app->getResponse(); } return Yii::$app->getResponse()->redirect(Url::to($url), $statusCode); } /** * Sets some ui state as current controller/module and active topmenu. * * This is required for some modules in pjax mode. * * @since 1.2 */ public function setJsViewStatus() { $moduleId = (Yii::$app->controller->module) ? Yii::$app->controller->module->id : ''; $this->view->registerJs('humhub.modules.ui.view.setState("' . $moduleId . '", "' . Yii::$app->controller->id . '", "' . Yii::$app->controller->action->id . '");', \yii\web\View::POS_BEGIN); if (Yii::$app->request->isPjax) { \humhub\widgets\TopMenu::setViewState(); } } /** * Check if action cannot be intercepted * * @since 1.9 * @param string|null $actionId, NULL - to use current action * @return bool */ public function isNotInterceptedAction(string $actionId = null) : bool { if ($actionId === null) { if (isset($this->action->id)) { $actionId = $this->action->id; } else { return false; } } foreach ($this->doNotInterceptActionIds as $doNotInterceptActionId) { if ($doNotInterceptActionId === '*' || $doNotInterceptActionId === $actionId) { return true; } } return false; } }