Передача параметров через форму в контроллер (CakePHP) - PullRequest
1 голос
/ 22 октября 2010

Хорошо, я довольно новичок в CakePHP.Это настройка:

У меня есть модель ( Reservation ) и контроллер, ( ReservationController ).

I'mпытаясь предоставить простую функциональность add ().

URL-адрес запроса: www.example.com/reservations/add/3

Где 3 - это идентификаторсобытие, для которого это бронирование.Все идет нормально.Проблема в том, что форма построена так:

 <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/, и идентификатор события теряется.

Теперь я решил эту проблему, взяв идентификатор в контроллере и сделав его доступным для формы:

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

А затем в форме:

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

Это работает, но мне кажется немного уродливым.Нет ли более простого способа убедиться, что действие формы POST выполняется для текущего URL-адреса вместо URL-адреса без идентификатора?

Ответы [ 5 ]

7 голосов
/ 10 ноября 2011

Ответ Ника не удастся, если веб-сайт не находится в корневом каталоге сервера public_html.

Этот ответ более твердый:

<?php echo $form->create('Reservation',array('url'=>'/reservation/add/'.$data['id']));?>
3 голосов
/ 22 октября 2010

Следуя строжайшему соглашению на мгновение, чтение URL-адреса, подобного /reservations/add/3, может привести к путанице.Вы вызываете ReservationsController, чтобы действовать по модели Reservation, но передаете ему идентификатор события.Вызов /reservations/edit/3 гораздо менее запутан, но так же неверен для вашей ситуации, поскольку значение id, "3", будет считаться идентификатором резервирования.

По сути, вы в лучшем случае делаете двусмысленный запрос.Это простая форма для создания бронирования, и эта бронь должна быть связана с событием.В «традиционном» сценарии форма позволит пользователю выбрать событие из какого-либо списка.В конце концов, внешний ключ, в данном случае, вероятно, event_id, действительно является еще одним свойством резервирования.Список должен быть заполнен в контроллере;обычно это делается с помощью вызова find( 'list' ).

Если вы уже знаете событие, для которого вы хотите создать резервирование (что вы, очевидно, делаете), то я, вероятно, выберу аналогичный метод использованияскрытое поле в форме.Вы все еще должны установить значение в контроллере так же, как вы делаете, но конечный результат немного более Cake-y.Скрытое поле будет иметь имя data[Reservation][event_id] (опять же, я предполагаю имя вашего поля внешнего ключа).

2 голосов
/ 22 октября 2010
$form->create('Reservation',array('action' => 'add',$eventId);

и в контроллере:

    function add($eventId = null)
    {

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

    ...

    }

Я делаю это все время.

1 голос
/ 22 октября 2010

Как предполагает Роб Уилкерсон, проблема в том, что ваш 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 обычно лучше быть явным, чем надеяться, что его автоматика всегда работает корректно, особенно с ростом сложности вашего приложения.

1 голос
/ 22 октября 2010

Вы можете сделать следующее:

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

таким образом все переменные из URL будут добавлены в действие формы:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...