2012-01-31 2 views
0

у меня есть какая-то контроллер логика:CakePHP один вид для многих типов результатов

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 beach town», поэтому у меня есть рестораны, места для проживания, покупки, ночные клубы, поля для гольфа и т. Д. (Это повсюду).

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

UPDATE

Хорошо, я уверен, мои маршруты были это в файле:

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

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

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 торте сказал мне, что мой контроллер отсутствовал метод SEAF ООД(). Что я упустил?

+0

Я думаю, вы перепутали ситуацию, пытаясь изменить маршрутизацию. 'Router :: connect ('/ restaurants /: action', array ('controller' => 'restaurants'));' Вы сказали, что принимать все, что приходит после ресторанов, как действие, когда на самом деле «рестораны» - это действие и что происходит после этого параметра, поэтому, естественно, теперь он говорит вам, что он не может найти имя функции 'seafood()' – Jeff

+0

Я удалил правило router :: connect и все еще даю мне морепродукты(), отсутствующие в ошибка контроллера. – huzzah

+0

Каково имя контроллера, на которое указывает ошибка, и имя вашего фактического контроллера? Я думаю, у вас просто проблемы с тем, как вы определяете свои URL-адреса. Это должно быть что-то вроде www.mysite.com/controllername/actionname/parameter. Это то, что ищет торт, когда он анализирует этот URL. – Jeff

ответ

1

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

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

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

+0

Хорошо, после долгих возиться в моем контроллере, используя этот билет. Спасибо! – huzzah

1

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

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

+0

Обновлен OP. – huzzah