Возможность создания любой страницы с url

Такой вопрос.

Например, я точно не знаю какие страницы будут на сайте, т.е. могут добавлятся по мере необходимости.

Например /about/, /about/history/ - и т.п.

Т.е., по сути своей они сами контроллерами не являются.

Подскажите, как можно создать подобный контроллер, (по сути своей типа 404, если по заданным урлам не найдены нужные контроллеры), который будет обрабатывать все входящие запросы и уже дальше определять - это реальный контроллер, или "статичная страничка" ?

Как вариант ты можешь создать контроллер статичных страниц, а в нем Action -> actionViewFlatPage. Методом GET передавать туда значения страниц - например mysite.com/flatpages/viewflatpage/about/

где, mysite.com - базовый url

flatpages - имя контроллера

viewflatpages - action этого контроллера flatpages

about - передаваемое в него GET значение.

внутри самого action проверять есть ли GET и поставить условия, если значение GET равно about, значит рендерить view about.

Но в принципе если тебе не нужна динамика в этом плане, то легче создавать по action’у и view на каждую статичную страницу.

Только что на предыдущей странице тема была: http://www.yiiframework.com/forum/index.php?/topic/2691-динамическая-обработка-url-поиск-url-в-базе/ В четвертом ответе есть ссылка на что-то похожее на CMS, там как реализовано в этом духе. Т.е. если страница не найдена, то ищется url а базе. Судя по всему, вам нужно что-то похожее, но проще всего сделать контроллер дерева страниц (которое будет храниться в БД).

А зачем дерево, оно только мешать будет. Тупо хранить в базе по имени страницы.


<?php

class PageController extends CController {

 public function actionView($view)

 {

    if (Yii::app()->user->checkAccess('pageEdit') && Yii::app()->getRequest()->getIsPostRequest())

      $this->_actionPageSave($view);


    /** @var $page Pages */

    $page = Pages::model()->findByAttributes(array('alias'=>$view));

    $text = '';

    if ($page === null)

    {

      if (Yii::app()->user->checkAccess('pageEdit'))

        $text = $this->renderPartial('newpage', null, true);

      else

        throw new CHttpException(404, Yii::t('woow', 'Страница не найдена'));

    } 

    else

      $text = $page->text;


    $this->render('page', array('text' => $text));

  }


  protected function _actionPageSave($view)

  {

    $text = Yii::app()->getRequest()->getPost('pageText');

    $page = Pages::model()->findByAttributes(array('alias'=>$view));

    if ($page === null)

    {

      $page = new Pages();

      $page->alias = $view;

    }

    $page->text = $text;

    $page->save();


    $this->redirect(array("site/page", "view" => $view));

  }

}



И правило url менеджера ‘/<view:(.+)>’ => ‘page/view’,

Можна например так:

SiteController.php





    public function actionResolveUrl($url) {

        if (empty($url))

            return new CHttpException(404, 'The requested page doesn\'t found');


        // first check for static url

        if (($page = StaticPage::model()->find('url=:url', array(':url' => $url)))) {

            $this->layout = 'main';

            $this->render('static', array('page' => $page));

            Yii::app()->end();

        }


        return new CHttpException(404, 'The requested page doesn\'t found');

    }




main.php




// это для юрл в виде site.com/about.html 

'<url:[^\/]+>'=>array('site/resolveUrl','urlSuffix'=>'.html'),