Неправильный способ передачи параметров для разбитой на страницы логической конструкции HABTM в cakephp? - PullRequest
0 голосов
/ 03 февраля 2012

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

public function restaurants($restaurantType) {

$this->set('title', $this->params['id'].' restaurants in and near Gulf Shores, AL');
$f=$this->Restaurant->Cuisine->find('all', array(
            'conditions'=>array(
                    'Cuisine.cuisine_type'=>$restaurantType
                    )
            )
    );
$this->set('restaurantType', $f);

}

Это, очевидно, не работает. Я не знаю, как назвать мою переменную, а торт постоянно говорит мне, что аргумент для restaurant () отсутствует. Все, что мне нужно, это чтобы URL http://www.somesite.com/restaurants/seafood показывал мне все рестораны с морепродуктами kitchen_type. Вместо этого он ничего не возвращает. У меня была эта логика контроллера раньше:

$this->paginate['Restaurant']['Cuisine']=array(
            'limit'=>9,
            'order' => 'RAND()',
            'contain'=>array(
                    'User'=>array('id'),
                    'Cuisine',
                    'Location',
                    'Image',
                    'Coupon'=>array('promo_code', 'description')
                    ),
            'conditions'=>array(
                    'Cuisine.cuisine_type'=>$this->params['id']
                    'Restaurant.active'=>1

                    )   
        );
    $data = $this->paginate('Restaurant');
    $this->set('restaurantType', $data);

и это дало мне ВСЕ в моей базе данных. и все равно выдает аргумент пропущенной ошибки.
Во-вторых, это отношения HABTM. Я прочитал в этой теме переполнения стека , что мне нужно было делать вручную. Итак, вот оно:

 public $paginate=array(
    'joins' => array(
         array( 
           'table' => 'restaurants_cuisines', 
           'alias' => 'RestaurantsCuisine', 
           'type' => 'inner',  
           'conditions'=> array('RestaurantsCuisine.restaurant_id = Restaurant.id') 
       ), 
       array( 
           'table' => 'cuisines', 
           'alias' => 'Cuisine', 
           'type' => 'inner',  
           'conditions'=> array( 
               'Cuisine.id = RestaurantsCuisine.cuisine_id'
               )
           ) 
    )
);

Я думаю, что эта часть права, потому что я не получаю ничего странного от этого. Я думаю, что просто не знаю, как правильно передать параметр. Любая помощь будет очень ценится!

ОБНОВЛЕНИЕ Вот моя новая, улучшенная индексная функция:

 public function index($restaurantType) {



$this->paginate['Restaurant']['Cuisine']=array(
        'limit'=>9,
        'order' => 'RAND()',
        'contain'=>array(
                'User'=>array('id'),
                'Cuisine',
                'Location',
                'Image',
                'Coupon'=>array('promo_code', 'description')
                ),
        'conditions'=>array(
                'Cuisine.cuisine_type'=>$this->params['id'],
                'Restaurant.active'=>1

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

1 Ответ

0 голосов
/ 03 февраля 2012

Проблема в том, что у вас нет контроллера в этом URL.Обычно Cake ожидает такую ​​структуру:

http://www.somesite.com/controller_name/action_name/id

Так что в вашем сценарии, если у вас есть RestaurantController, я бы переименовал метод restaurants в index (в противном случае вы получите дубликат restaurantsв URL):

http://www.somesite.com/restaurants/index/seafood

РЕДАКТИРОВАТЬ:

Ваш index метод должен иметь возможность обрабатывать вызов без аргументов, подарок он не можетк.Если вы укажете значение по умолчанию, ошибка об отсутствии аргументов не будет отображаться, если к URL не добавлен тип.

<?php
  public function index($restaurantType=null) {
    //Rest of your method's code
  }
?>
...