将参数通过表单传递给Controller(CakePHP)

时间:2010-10-22 13:48:09

标签: php cakephp forms parameters

好的,所以我是CakePHP的新手。这是设置:

我有一个模型(预订)和一个控制器,( ReservationController )。

我正在尝试提供一个简单的add()功能。

请求网址为:www.example.com/reservations/add/3

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');?>

当我点击发送按钮时,请求网址变为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?

5 个答案:

答案 0 :(得分:7)

如果网站不在服务器public_html root中,

Nik's answer将失败。

这个答案更加坚实:

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

答案 1 :(得分:3)

按照最严格的惯例,阅读像/reservations/add/3这样的网址会让人感到困惑。您正在呼吁ReservationsControllerReservation模型执行操作,但会将其传递给事件ID。调用/reservations/edit/3远不那么令人困惑,但是因为id值“3”将被假定为预留标识符,因此您的情况也是如此。

基本上,你最多只是提出了一个含糊不清的请求。这是创建预订的简单表单,并且预订必须与事件相关联。在“传统”场景中,表单将允许用户从某种列表中选择事件。毕竟,在这种情况下,外键(可能是event_id)实际上只是预订的另一个属性。该列表必须填入控制器中;这通常是通过find( 'list' )电话完成的。

如果您已经知道要创建预约的事件(您显然这样做),那么我可能会选择在表单中使用隐藏字段的类似方法。你仍然必须像你正在做的那样在控制器中设置值,但最终的结果是更多的蛋糕。隐藏字段将命名为data[Reservation][event_id](同样,我假设您的外键字段的名称)。

答案 2 :(得分:2)

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

并在控制器中:

    function add($eventId = null)
    {

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

    ...

    }

我一直这样做。

答案 3 :(得分:1)

您可以执行以下操作:

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

这样,来自url的所有变量都将添加到表单action:)

答案 4 :(得分:1)

正如Rob Wilkerson所说,问题是您的URL路由无法准确描述正在执行的操作。当您想要编辑预订时,它会变得更加混乱:/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而不是希望它的自动化始终正常工作,尤其是当应用程序的复杂性增加时。