%PDF- %PDF-
Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/wiki/controllers/ |
Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/wiki/controllers/PageController.php |
<?php namespace humhub\modules\wiki\controllers; use Yii; use yii\base\Exception; use yii\web\HttpException; use humhub\components\access\ControllerAccess; use humhub\modules\wiki\helpers\HeadlineExtractor; use humhub\modules\wiki\helpers\Url; use humhub\modules\wiki\models\forms\PageEditForm; use humhub\modules\wiki\models\forms\WikiPageItemDrop; use humhub\modules\wiki\models\WikiPage; use humhub\modules\wiki\models\WikiPageRevision; use humhub\modules\wiki\permissions\AdministerPages; use humhub\modules\wiki\permissions\CreatePage; use humhub\modules\wiki\permissions\EditPages; use humhub\modules\wiki\permissions\ViewHistory; /** * PageController * * @author luke */ class PageController extends BaseController { public function getAccessRules() { return [ [ControllerAccess::RULE_POST => ['sort', 'delete', 'revert']], [ControllerAccess::RULE_PERMISSION => [AdministerPages::class], 'actions' => ['sort', 'delete']], [ControllerAccess::RULE_PERMISSION => [CreatePage::class, EditPages::class, AdministerPages::class], 'actions' => ['edit']], [ControllerAccess::RULE_PERMISSION => [EditPages::class, AdministerPages::class], 'actions' => ['revert']], [ControllerAccess::RULE_PERMISSION => [ViewHistory::class], 'actions' => ['history']], [ControllerAccess::RULE_PERMISSION => [ViewHistory::class], 'actions' => ['history']], ]; } /** * @return $this|\yii\web\Response * @throws \yii\base\Exception */ public function actionIndex() { return $this->redirect($this->contentContainer->createUrl('/wiki/overview')); } /** * @return string * @throws \yii\base\Exception */ public function actionList() { return $this->redirect($this->contentContainer->createUrl('/wiki/overview/list-categories')); } /** * @return string|\yii\web\Response * @throws \yii\base\Exception * @throws \yii\base\InvalidConfigException * @throws \yii\db\StaleObjectException * @throws \Throwable */ public function actionView($title = null, $revisionId = null) { $page = WikiPage::find()->contentContainer($this->contentContainer)->readable()->where(['title' => $title])->one(); if(!$page && $this->canCreatePage()) { return $this->redirect(Url::toWikiCreateByTitle($this->contentContainer, $title)); } if(!$page) { throw new HttpException(404, 'Wiki page not found!'); } $revision = $this->getRevision($page, $revisionId); // There is no revision for this page. if (!$revision && $this->canCreatePage()) { $page->delete(); return $this->redirect(Url::toWikiCreateByTitle($this->contentContainer, $title)); } if(!$revision) { $page->delete(); throw new HttpException(404, 'Wiki page revision not found!'); } return $this->render('view', [ 'page' => $page, 'revision' => $revision, 'homePage' => $this->getHomePage(), 'contentContainer' => $this->contentContainer, 'content' => $revision->content, 'canViewHistory' => $this->canViewHistory(), 'canEdit' => $this->canEdit($page), 'canAdminister' => $this->canAdminister(), 'canCreatePage' => $this->canCreatePage() ]); } /** * Compare two revisions of a Wiki page * * @param string $title Wiki page title * @param int $revision1 Id of revision 1 * @param int $revision2 Id of revision 2 * @return string * @throws Exception * @throws HttpException * @throws \Throwable * @throws \yii\base\InvalidConfigException * @throws \yii\db\StaleObjectException */ public function actionDiff(string $title, int $revision1, int $revision2) { $page = WikiPage::find()->contentContainer($this->contentContainer)->readable()->where(['title' => $title])->one(); if(!$page) { throw new HttpException(404, 'Wiki page not found!'); } $revision1 = $this->getRevision($page, $revision1); if(!$revision1) { $page->delete(); throw new HttpException(404, 'Wiki page revision 1 not found!'); } $revision2 = $this->getRevision($page, $revision2); if(!$revision2) { $page->delete(); throw new HttpException(404, 'Wiki page revision 2 not found!'); } return $this->render('diff', [ 'page' => $page, 'revision1' => $revision1, 'revision2' => $revision2, ]); } /** * Returns a revision for the given page, either by a given revisionid or the latest. * * @param $page * @param $revisionId * @return WikiPageRevision|null */ private function getRevision($page, $revisionId = null) { $revision = null; if ($revisionId != null) { $revision = WikiPageRevision::findOne(['wiki_page_id' => $page->id, 'revision' => $revisionId]); } if (!$revision) { $revision = $page->latestRevision; } return $revision; } /** * @return $this|string|\yii\web\Response * @throws HttpException * @throws \yii\base\Exception * @throws \yii\base\InvalidConfigException * @throws \Throwable */ public function actionEdit($id = null, $title = null, $categoryId = null) { $form = (new PageEditForm(['container' => $this->contentContainer]))->forPage($id,$title,$categoryId); if($form->load(Yii::$app->request->post()) && $form->save()) { $this->view->saved(); return $this->redirect(Url::toWiki($form->page)); } $params = [ 'model' => $form, 'homePage' => $this->getHomePage(), 'contentContainer' => $this->contentContainer, 'canAdminister' => $this->canAdminister(), 'requireConfirmation' => $form->hasErrors('confirmOverwriting'), ]; if ($params['requireConfirmation']) { $originalPage = WikiPage::findOne(['id' => $form->page->id]); $params = array_merge($params, [ 'diffUrl' => Url::toWikiDiffEditing($originalPage), 'discardChangesUrl' => $originalPage->getUrl(), ]); } return $this->render('edit', $params); } /** * Compare the latest and the editing revisions of a Wiki page * * @param int $id Wiki page ID * @return string */ public function actionDiffEditing(int $id) { /* @var WikiPage $page */ $page = WikiPage::find()->contentContainer($this->contentContainer)->readable()->where(['wiki_page.id' => $id])->one(); if (!$page) { throw new HttpException(404, 'Wiki page not found!'); } $form = (new PageEditForm(['container' => $this->contentContainer]))->forPage($id); if (!$form->load(Yii::$app->request->post())) { throw new HttpException(404); } $submittedRevision = new WikiPageRevision(); $submittedRevision->revision = time(); $submittedRevision->content = $form->revision->content; $submittedRevision->isCurrentlyEditing = true; return $this->render('diff', [ 'page' => $page, 'revision1' => $page->latestRevision, 'revision2' => $submittedRevision, ]); } /** * @param $id * @return mixed * @throws Exception * @throws HttpException * @throws \Throwable */ public function actionHeadlines($id) { if (intval($id) === 0) { return $this->asJson([]); } $page = WikiPage::find()->contentContainer($this->contentContainer)->readable()->where(['wiki_page.id' => $id])->one(); if (!$page) { return $this->asJson([]); } return $this->asJson(HeadlineExtractor::extract($page->latestRevision->content)); } public function actionSort() { $dropModel = new WikiPageItemDrop(['contentContainer' => $this->contentContainer]); if($dropModel->load(Yii::$app->request->post()) && $dropModel->save()) { return $this->asJson(['success' => true]); } return $this->asJson(['success' => false]); } /** * @return string * @throws HttpException * @throws \yii\base\Exception * @throws \yii\base\InvalidConfigException */ public function actionHistory() { if (!$this->canViewHistory()) { throw new HttpException(403, Yii::t('WikiModule.base', 'Permission denied. You have no rights to view the history.')); } $id = Yii::$app->request->get('id'); $page = WikiPage::find()->contentContainer($this->contentContainer)->readable()->where(['wiki_page.id' => $id])->one(); if ($page === null) { throw new HttpException(404, Yii::t('WikiModule.base', 'Page not found.')); } $query = WikiPageRevision::find(); $query->orderBy('wiki_page_revision.id DESC'); $query->where(['wiki_page_id' => $page->id]); $query->joinWith('author'); $countQuery = clone $query; $pagination = new \yii\data\Pagination(['totalCount' => $countQuery->count(), 'pageSize' => "20"]); $query->offset($pagination->offset)->limit($pagination->limit); $revisions = $query->all(); return $this->render('history', [ 'page' => $page, 'revisions' => $revisions, 'pagination' => $pagination, 'homePage' => $this->getHomePage(), 'contentContainer' => $this->contentContainer, 'isEnabledDiffTool' => count($revisions) > 1, ]); } /** * @return $this|\yii\web\Response * @throws HttpException * @throws \yii\base\Exception * @throws \yii\base\InvalidConfigException * @throws \yii\db\StaleObjectException * @throws \Throwable */ public function actionDelete($id) { $page = WikiPage::find()->contentContainer($this->contentContainer)->where(['wiki_page.id' => $id])->one(); if (!$page) { throw new HttpException(404, Yii::t('WikiModule.base', 'Page not found.')); } $page->delete(); return $this->redirect($this->contentContainer->createUrl('index')); } /** * @param int $id * @param int $toRevision * @return $this|\yii\web\Response * @throws Exception * @throws HttpException * @throws \yii\base\InvalidConfigException */ public function actionRevert($id, $toRevision) { $page = WikiPage::find()->contentContainer($this->contentContainer)->readable()->where(['wiki_page.id' => $id])->one(); if (!$page) { throw new HttpException(404, Yii::t('WikiModule.base', 'Page not found.')); } if (!$page->canEditWikiPage()) { throw new HttpException(403, Yii::t('WikiModule.base', 'Page not editable!')); } $revision = WikiPageRevision::findOne([ 'revision' => $toRevision, 'wiki_page_id' => $page->id ]); if(!$revision) { throw new HttpException(404, 'Revision not found!'); } if ($revision->is_latest) { throw new HttpException(404, Yii::t('WikiModule.base', 'Revert not possible. Already latest revision!')); } $revertedRevision = $page->createRevision(); $revertedRevision->content = $revision->content; $revertedRevision->save(); return $this->asJson([ 'success' => 1, 'redirect' => Url::toWiki($page) ]); } /** * @param WikiPage $page * @return boolean can edit given wiki site? * @throws \yii\base\InvalidConfigException */ public function canEdit($page) { return $page->canEditWikiPage(); } }