перенаправление на условия после сохранения записи - PullRequest
1 голос
/ 30 октября 2010

У меня есть контроллер пользователей, в котором, если я добавлю пользователя, которого я хочу перенаправить на основе типа пользователя, который пользователь выбирает при создании своей учетной записи

, ситуация:

таблица пользователей

id

name

usertype_id

Форма добавления пользователя имеет поле выбора для типа пользователя, у меня есть два типа пользователей: учителя и ученики (каждая другая таблица), модель, контроллер) если пользователь выбирает учителя, которого я хочу перенаправить на / teacher / add / $ id, если пользователь выбирает студента, на которого я хочу перенаправить: / student / add / $ id

это то, что яесть атм, но это не сработает, очевидно

<?php
class UsersController extends AppController {
    var $name = 'Users';

    function add() {
    if (!empty($this->data)) {
        $this->User->create();
        if ($this->User->save($this->data)) {
            $id = $this->User->id;
            if ($this->User->usertype_id=='1')
            {
                $this->redirect(array('students/add/'.$id));
            } elseif ($this->User->usertype_id=='2') {
                $this->redirect(array('teachers/add/'.$id));
            } else {
                $this->Session->setFlash(__('The user could not be saved. Please, try again.', true));
            }
        } else {
            $this->Session->setFlash(__('The user could not be saved. Please, try again.', true));
        }
    }
    $usertypes = $this->User->Usertype->find('list');
    $this->set(compact('usertypes'));
}

}
?>

1 Ответ

2 голосов
/ 30 октября 2010

Я почти уверен, что проблема заключается в предположении, что, поскольку $this->User->id существует, $this->User->usertype_id также должен существовать, чего нет. Я столкнулся с этой проблемой, когда впервые начал работать с CakePHP. :)

Если тип пользователя был передан через форму добавления, вам необходимо проверить массив данных:

Изменить

if ($this->User->usertype_id=='1')

К

if ($this->data['User']['usertype_id'] == '1')

Если это не сработает (я не могу вспомнить, очищается ли $this->data после успешного сохранения), вам следует сохранить значение до сохранения, например:

function add() {
    if (!empty($this->data)) {
        $usertype_id = $this->data['User']['usertype_id'];
        $this->User->create();
        if ($this->User->save($this->data)) {
            $id = $this->User->id;
            if ($usertype_id == '1') {
                $this->redirect(array('students/add/'.$id));
            } elseif ($usertype_id == '2') {
                // the rest remains the same

Добавление
Вместо того, чтобы использовать конкатенацию в вашем перенаправлении, для меня это выглядит чище:

$this->redirect(array('controller' => 'teachers', 'action' => 'add', $id));

Но я думаю, это просто предпочтение.

Приложение 2
У меня есть несколько дополнительных советов по поводу очистки вашего контроллера и переноса всей логики на модель. Таким образом, вы можете повторно использовать код с других контроллеров в будущем, и ваш текущий контроллер будет легче читать. Я бы изменил весь метод, чтобы он выглядел так:

// this is in /controllers/users_controller.php
function add() {
    if (!empty($this->data)) {
        $saved_user = $this->User->save_user($this->data);
        if ($saved_user['success']) {
            $this->redirect(array(
                'controller' => $saved_user['controller'],
                'action' => 'add',
                $this->User->id
            ));
        }
    }
    $this->Session->setFlash(__('The user could not be saved. Please, try again.', true));
    $usertypes = $this->User->Usertype->find('list');
    $this->set(compact('usertypes'));
}

// this is in your model, /models/user.php
function save_user($data) {
    $this->create;
    $usertype_id = $data['User']['usertype_id'];
    return array(
        'controller' => ($usertype_id == '2') ? 'teachers': 'students';
        'success' => $this->save($data),
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...