CakePHP один вид для многих типов результатов - PullRequest
0 голосов
/ 31 января 2012

У меня есть некоторая логика контроллера:

public function seafood() {
$this->set('title', 'Seafood restaurants in and near Gulf Shores, AL');

$this->paginate['Restaurant']=array(
        'limit'=>9,
        'order' => 'RAND()',

        'conditions'=>array(

                'Restaurant.active'=>1,
                'Restaurant.seafood'=>'Seafood'
                )   
    );
$data = $this->paginate('Restaurant');
$this->set('seafood', $data);




}

Это повторяется, как 13 раз, с 13 различными страницами просмотра, помеченными как "морепродукты, набережная, стейк-хаус" и т. Д. Представление точно такое же, всеТо же самое на самом деле, за исключением того, что контроллер должен найти по конкретному типу ресторана.Может ли кто-нибудь объяснить мне, как я могу просто сделать один файл просмотра, который будет отображаться по адресу www.site.com/restaurants/seafood?

По правде говоря, все мои страницы результатов представляют собой некоторые вариации этого,Я приказываю торт разбить (и обычно содержать) данные модели, а затем вставить их в представление, которое почти идентично (с пиктограммой или двумя отличиями) всем остальным страницам.Я создаю сайт, который является одним из тех «вещей, которые можно увидеть и увидеть в x пляжном городке», поэтому у меня есть рестораны, места для ночлега, магазины, ночные клубы, поля для гольфа и т. Д. (Это везде).

Мой босс дал мне этот гигантский веб-сайт для создания, и я действительно не очень хорошо знаю логику программирования.Я хотел бы придерживаться концепции «СУХОЙ», чтобы действительно научиться этому материалу.

ОБНОВЛЕНИЕ

Хорошо, я убедился, что мои маршруты содержали это вfile:

Router::connect('/restaurants/:action', array('controller'=>'restaurants'));

Я сохранил свой файл seafood.ctp, затем вынул свою функцию seafood () и вставил в нее:

 public function restaurants($restaurantType) {

$this->set('title', $restaurantType.' restaurants in and near Gulf Shores, AL');

$this->paginate['Restaurant']=array(
        'limit'=>9,
        'order' => 'RAND()',

        'conditions'=>array(

                'Restaurant.active'=>1,
                'Restaurant.seafood'=>$restaurantType
                )   
    );
$data = $this->paginate('Restaurant');
$this->set($restaurantType, $data);
}   

Когда я получил доступ к странице на www.site.com/restaurants/seafood торт сказал мне, что мой контроллер пропустил метод морепродуктов ().Что я пропустил?

Ответы [ 2 ]

1 голос
/ 02 февраля 2012

Попробуйте это:

Router::connect('/restaurants/:restaurantType', array('controller'=>'restaurants', 'action' => 'restaurants'));

Причина, по которой он этого не находит, в том, что вы все еще используете стандартный параметр: action. Вам просто нужно изменить его, чтобы действие оставалось таким же, чтобы оно передавалось в действие в качестве параметра.

1 голос
/ 31 января 2012

Почему бы вам просто не дать действию контроллера общее имя, например

public function restaurant($restaurantType) {

// Pass the parameter in via the URL for the restaurant type and use that parameter 
// as your find condition as well as the value for the title of the page

}

И тогда ваш URL для ссылки на страницу будет выглядеть http://www.whatever.com/restaurant/seafood

...