2016-10-26 4 views
1

Я хотел бы реализовать некоторую настраиваемую маршрутизацию на моем сайте, которая в конечном итоге станет поиском базы данных для определения возвращаемого содержимого. Я смотрел на this example, который не работает должным образом (в основном потому, что он был для SS2).Пользовательская маршрутизация без переопределения основной CMS-маршрутизации

У меня есть главный routes.yml:

--- 
Name: mysiteroutes 
After: 
    - 'framework/routes#coreroutes' 
--- 
Director: 
    rules: 
    'create//$Action': 'CreateController' 
    'profile//$Person/$Action/': 'ProfileController' 

Мой _config.php:

Director::addRules(2, array(
    '$URLSegment//$Action/$Detail/$Option' => 'BaseController', 
)); 

Мой BaseController:

class BaseController extends ModelAsController { 

    public function getNestedController() { 
     if ($this->getRequest()->params('URLSegment') =='Test') { 
      return new ProfileController(); 
     } else { 
      return parent::getNestedController($this->getRequest()->params('URLSegment')); 
     } 
    } 
} 

Мой ProfileController:

class ProfileController extends Controller { 

    private static $allowed_actions = array(
     'test' 
    ); 

    public function index(SS_HTTPRequest $request) { 
     return $this->renderWith(array("ProfileHomePage", "Page")); 
    } 

    public function test(SS_HTTPRequest $request) { 
     print_r($request->params()); 
     return $this->renderWith(array("ProfileHomePage", "Page")); 
    } 
} 

Это нормально работает без динамического маршрута, но я хотел бы что-нибудь поймать (например) /example/ проверить, есть ли для него запись db (через пользовательский скрипт, который я еще не написал), если не маршрутизировать его cms (т.е. проверьте, существует ли для него предопределенный маршрут, а затем, если перед ним есть страница, перед возвратом 404). Как я могу это достичь?

Я пробовал '$URLSegment//$Action/$Detail/$Option': 'ProfileController', который я мог правильно направить и загрузить пользовательские шаблоны, но это означало, что /admin/, /create/ и другие предопределенные маршруты не будут работать.

+0

Может быть, вы хотите __магические методы? – Deep

+0

Это больше связано с маршрутизацией и не переопределяет основные функции, не уверен, как методы __magic помогут исправить это? – Rudiger

+0

Вам нужны динамические маршруты. Вы можете передать сегмент URL или часть uri или полный запрос в метод __get() для пользовательских вызовов для любых ваших (pre/post/partial) -routes. И здесь вы можете иметь отдельную конфигурацию. – Deep

ответ

0

Вот способ сделать это, хотя может быть лучше:

--- 
Name: mysiteroutes 
--- 
Director: 
    rules: 
    'create//$Action': 'CreateController' 
    'profile//$Person/$Action': 'ProfileController' 
--- 
Name: modelascontrollerroutes 
After: '#rootroutes' 
--- 
Director: 
    rules: 
    '': 'HomePage_Controller' 
    '$URLSegment//$ID': 'BaseController' 

Базовый контроллер:

class BaseController extends ModelAsController { 

    public function getNestedController() { 
     $params = $this->getRequest()->params(); 
     if (/*check for $params['URLSegment'] here */) { 
      //return custom controller 
     } else { 
      return parent::getNestedController(); 
     } 
    } 
} 

Пример пользовательского контроллера:

class PersonController extends Controller { 

    private static $allowed_actions = array(
    ); 

    public function index(SS_HTTPRequest $request) { 
     return $this->renderWith(array("PersonHomePage", "Page")); 
    } 
} 
Смежные вопросы