2014-01-30 2 views
0

В настоящее время я создаю веб-приложение, которое имеет две модели, модели доноров и пожертвований соответственно. Он имеет несколько пользовательских ролей. Когда пользователь штата сначала регистрирует донора, я хочу, чтобы он был перенаправлен в другую форму, которая позволяет ему заполнять детали пожертвования (донор регистрируется после успешного первого пожертвования).CakePHP - контроллер или контроллер нет?

Елки всех, я должен создать контроллер пожертвования, от которого я бы перенаправлять пользователя с помощью:

return $this->redirect(array('controller'=>'donations','action'=>'add')); 

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

$this->Session->write('id', $this->Donor->id); 

таким образом, пользователь перенаправляется на «пожертвования/добавить» в URL, и это работает прекрасно .. Однако я думаю, что это имеет некоторые недостатки. Я блуждал, должен ли я создать другое действие внутри контроллера-донора под названием «add_donation», которое будет иметь соответствующий «вид». Идея состоит в том, чтобы иметь возможность сформировать URL-адрес такого типа: «donors/add_donation/4» (4 - donor_id!) Этот URL-адрес следует за этой конструкцией: «controller/action/id»

Если кто-то может пролить некоторый свет на лучших практиках или описывать любые предостережения для моего решения (первое, используя сеанс и т. д.), пожалуйста, помогите брату! Я глубоко признателен вам! Заранее спасибо!

+0

Какую версию тортов вы используете и почему вы отметили три из них? –

+0

Его более вероятно получить ответ (больше последователей). Моя текущая версия - 5.4.12, хотя .. извините, если это неприемлемая вещь, но я отчаянный здесь! – LogixMaster

+0

@ user2678538 просто добавьте дополнительную проверку - когда вы используете: '' donors/add_donation/4 '(4 - donor_id!) 'Сравните пройденный' donor_id' с тем, который был в 'Session-> Auth', так что невозможно обмануть донора. : D Это будет возможно, только если пользователь выполнил вход! Или еще лучше, введите идентификатор пользователя из '$ this-> Auth-> user();' –

ответ

2

После вы сохранили данные, которые вы можете сделать это в DonorsController:

$this->redirect(array(
    'controller' => 'donations', 
    'action' => 'add', 
    $this->Donor->getLastInsertId() 
)); 

Там нет необходимости возвращать редирект, это бесполезно, потому что вы попадаете. Обратите внимание, что мы передаем последний вставленный идентификатор записи как get param в перенаправление. The redirect method контроллера вызывает по умолчанию _stop(), который вызывает exit().

CakePHP3: There is a discussion about changing that default behavior in 3.0. Похоже, в CakePHP 3.0 перенаправление() по умолчанию больше не будет выходить().

DonationsController:

public function add($donorId = null) { 
    // Get the donor to display it if you like to 
    if ($this->request->is('post')) { 
    $this->request->data['Donation']['donor_id'] = $donorId; 
    // Save code here 
    } 
} 

Я бы не использовать сессию здесь, специально не сохраняя его в совершенно бессмысленное и родовое значение с именем «ID». Если вообще я буду использовать всегда значимые имена и пространства имен, например, Donor.lastInsertId в качестве ключа сеанса.

Не всегда ясно, куда положить вещи, если они связаны, но эмпирическое правило гласит, что все должно идти в том домене, к которому они принадлежат, что довольно ясно в этом случае ИМХО.

Edit: Оставляя это изменение здесь только если кто-то нуждается в ней - это не соответствует сценарию использования спрашивающего. Если у вас есть пользователь, вошедший в на данном этапе, измените функцию add, чтобы проверить, если идентификатор пользователя передается так же, как тот, вошедшего в:

DonationsController:

public function add($donorId = null) { 
    // Get the donor to display it if you like to 
    if ($this->request->is('post')) { 
     if ($this->Auth->user('id') != $donorId) { 
      throw new InvalidArgumentException(); 
     } 
    $this->request->data['Donation']['donor_id'] = $donorId; 
    // Save code here 
    } 
} 
+0

, пожалуйста, примите мою благодарность! Спасибо, что ответил, а также вышел за рамки моего вопроса! Я не думал о передаче id из метода перенаправления! Спасибо! – LogixMaster

+0

@Borislav Я думаю, вы неправильно поняли сценарий ... Текущий пользователь не будет донором на этом этапе, но это будет персонал банков крови! – LogixMaster

+0

@ пользователь2678538 хорошо. Тогда мои замечания ошибочны. Я не понял неправильно - вы не упомянули об этом. :) Удалит мое редактирование. –

-1

Вы можете использовать также один и тот же контроллер, используя больше моделей с использованием. Или вы также можете попросить другого контроллера с Ajax и morover, чтобы получить ответ с Json.

+0

Спасибо за ваш ответ! Однако меня это немного беспокоит. Разве не слишком сложно использовать ajax и json в этом случае, учитывая, что это должен быть довольно простой процесс ?! (2 контроллера) – LogixMaster

+0

Я не знаю, какая цель имеет ваш сайт, но aniway метод, который наиболее часто используется сегодня, - это сделать простым шагом, без какой-либо переадресации. Вы можете, например, зарегистрировать первый stepp, передать другой шаг, используя fancybox ... перенаправление, на мой взгляд, не лучшее решение, так как я не вижу использования для привлечения многих контроллеров, так как вы можете сделать это без ajax, например, вы можете использовать запрос метода, который позволяет выполнять запрос другим контроллерам, получающим массив в качестве ответа. – user2711870

+0

Я согласен с тобой! Я не большой поклонник перенаправления себя .. но это не многоступенчатая форма регистрации. В принципе, персоналу будет предложено заполнить первые данные пожертвования, как только зарегистрируется донор. Но вторая форма (вид), где я перенаправляю после регистрации, также будет использоваться в других случаях всякий раз, когда донор жертвует кровь, и пожертвование записывается! :) – LogixMaster

Смежные вопросы