2010-10-22 62 views
1

好的,所以我對CakePHP很新穎。這是設置:通過窗體傳遞參數給控制器(CakePHP)

我有一個模型(預約)和控制器(ReservationController)。

我想提供一個簡單的add()功能。

請求URL是:www.example.com/reservations/add/3

凡在此預留爲事件的ID。 到目前爲止,這麼好。問題是,形式構造是這樣的:

<h2>Add reservation</h2> 
<?php echo $form->create('Reservation'); 
echo $form->input('first_name'); 
echo $form->input('last_name'); 
echo $form->input('email'); 
echo $form->input('tickets_student'); echo $form->input('tickets_nstudent'); 
echo $form->end('Add');?> 

當我點擊發送按鈕,請求URL變得簡單www.example.com/reservations/add/,事件ID丟失。

我已經在控制器抓住ID現在解決了它,並使其可到窗體:

// make it available for the form 
$this->set('event_id', $eventid); 

,然後在表格:

$form->create('Reservation',array('url' => array($event_id))); 

它的工作原理,但它讓我覺得有點難看。沒有更簡單的方法來確保表單POST動作獲取到當前的url,而不是沒有id的url嗎?

回答

6

Nik's answer如果網站不在服務器的public_html根目錄下將失敗。

這個答案是更加堅實:

<?php echo $form->create('Reservation',array('url'=>'/reservation/add/'.$data['id']));?> 
3

按照最嚴格的約定,閱讀一個像/reservations/add/3這樣的URL就會讓人困惑。您要求ReservationsControllerReservation模型採取行動,但將其傳遞給事件ID。撥打電話/reservations/edit/3遠不那麼令人困惑,但由於id的值「3」會被假定爲預留標識符,所以您的情況也是錯誤的。

本質上,你最好提出一個模糊的請求。這是創建預定的簡單形式,並且預訂必須與事件相關聯。在「傳統」場景中,表單將允許用戶從某種列表中選擇一個事件。畢竟,在這種情況下,外鍵(可能是event_id)實際上只是保留的另一個屬性。該列表必須在控制器中填充;這通常通過撥打find('list')完成。

如果你已經知道你想要創建預訂的事件(你顯然是這樣做的),那麼我可能會選擇在表單中使用隱藏字段的類似方法。您仍然必須像在做一樣設置控制器中的值,但最終的結果是更多的Cake-y。隱藏字段將被命名爲data[Reservation][event_id](同樣,我假設您的外鍵字段的名稱)。

+0

我同意你的看法,因爲我用同樣的形式在我的項目添加和編輯,這將是混亂的,但如果@Forceflow使用兩個單獨的行動,我相信它會好的,因爲他只會在添加動作時傳遞這個變量。然後在編輯中他會知道事件,並且不需要在URL中傳遞。但是,我們的假設中有太多的假設。 :) – 2010-10-22 15:30:46

1

你可以做到以下幾點:

$form->create('Reservation',array('url' => $this->Html->url())); 

這樣從URL中所有變量將在表單動作:)加入

1

正如羅布·威爾克森指出,問題是你的URL路徑沒有按」 t準確地描述正在執行的操作。當您想要編輯預訂時,會變得更加混亂:/reservations/edit/6。現在URL中的數字意味着不同。

我用於這種情況的URL約定(適用於您的特定情況)是/events/3/reservations/add。它需要更多的前期來配置你的路線,但我發現它在路上的清晰度是優越的。

樣品routes.php

Router::connect(
    '/events/:event_id/reservations/:action', 
    array('controller'=>'reservations','action'=>'index'), 
    array(
     'pass' => array('event_id'), // pass the event_id as a param to the action 
     'event_id' => '[0-9]+', 
     'actions'=>'add|index' // only reverse-routes with 'action'=>'add' or 
           // 'action'=>'index' will match this route 
    ) 
) 
// Usage: array('controller'=>'reservations','action'=>'add','event_id'=>3) 

Router::connect(
    '/events/:event_id/reservations/:id/:action', 
    array('controller'=>'reservations'), 
    array(
     'pass' => array('id'), // pass the reservation id as a param to the action 
     'id' => '[0-9]+', 
     'event_id' => '[0-9]+', 
     'actions'=>'edit|delete' // only reverse-routes with 'action'=>'edit' or 
           // 'action'=>'delete' will match this route 
    ) 
) 
// Usage: array('controller'=>'reservations','action'=>'edit','event_id'=>3,'id'=>6) 

在您的通話FormHelper::create,你必須指定你最想跟着反向路由的,但同樣的前期成本將在未來支付股息。通常情況下,更好地明確Cake,而不是希望它的automagic始終正常工作,特別是隨着應用程序複雜性的增加。

1
$form->create('Reservation',array('action' => 'add',$eventId); 

,並在控制器:

function add($eventId = null) 
    { 

      if($eventId == null) 
      { 
       // error state 
       throw new NotFoundException('Invalid id'); 
      } 

    ... 

    } 

我做這一切的時候。

+1

您應該更正條件中的評估與分配錯誤。 =) – 2010-10-22 17:04:24

+0

謝謝 - 我剛剛下班,沒有真正的藉口;)+1 – Leo 2010-10-22 17:23:44

相關問題