Как сохранить параметры URL при сбое проверки формы CakePHP - PullRequest
3 голосов
/ 17 марта 2010

Я новичок в cakephp и пытаюсь написать с ним простое приложение, однако я застрял с некоторыми проблемами проверки формы.

У меня есть модель с именем "Person", которая имеет много объектов "PersonSkill". Чтобы добавить PersonSkill к человеку, я настроил его так, чтобы он вызывал URL:

http://localhost/myapp/person_skills/add/person_id:3

Я проходил через person_id, потому что хочу отобразить имя человека, для которого мы добавляем навыки.

Моя проблема в том, что если проверка не пройдена, параметр person_id не сохраняется до следующего запроса, поэтому имя человека не отображается.

Метод add на контроллере выглядит следующим образом:

function add() {        
    if (!empty($this->data)) {          
        if ($this->PersonSkill->save($this->data)) {
            $this->Session->setFlash('Your person has been saved.');
            $this->redirect(array('action' => 'view', 'id' => $this->PersonSkill->id));
        }       
    } else {
        $this->Person->id = $this->params['named']['person_id'];
        $this->set('person', $this->Person->read());        
    }
}   

В моем файле person_skill add.ctp я установил скрытое поле, в котором хранится person_id, например:

echo $form->input('person_id', array('type'=>'hidden','value'=>$person['Person']['id']));

Есть ли способ сохранить параметр url person_id при сбое проверки формы, или есть лучший способ сделать это, которого я полностью пропускаю?

Любой совет будет принят с благодарностью.

Ответы [ 2 ]

6 голосов
/ 18 марта 2010

Метод FormHelper :: create () позволяет настроить URL-адрес в атрибуте действия создаваемого тега формы.

Вы хотите убедиться, что текущий URL-адрес используется, поэтому вы отправляете на тот же URL-адрес, и если проверка не удалась, именованный параметр person_id все еще там.

Попробуйте что-то вроде этого:

echo $form->create('PersonSkill', array('url' => $this->params['named']));

CakePHP должен объединить именованные параметры, то есть массив ('person_id' => 3) с текущим контроллером и действием, и вернуть тот же URL-адрес, что и вы.

Кстати, вы также хотите прочитать сведения о человеке и сделать их доступными в представлении, если $ this-> data не пуста, поэтому я потерял бы оператор else в контроллере и просто получил бы:

function add() {        
    if (!empty($this->data)) {          
        if ($this->PersonSkill->save($this->data)) {
            $this->Session->setFlash('Your person has been saved.');
            $this->redirect(array(
                'action' => 'view',
                'id' => $this->PersonSkill->id
            ));
        }       
    }
    $this->Person->id = $this->params['named']['person_id'];
    $this->set('person', $this->Person->read());        
}   
0 голосов
/ 17 марта 2010

Вы можете вручную проверить данные, а затем использовать свои собственные параметры перенаправления для сохранения параметров URL. Например.,

if( !empty( $this->data ) ) {
 if( $this->PersonSkill->validates() ) {
  if( $this->PersonSkill->save( $this->data ) {
   ...
  }
  else { // invalid data
   $this->redirect( array( 'action' => 'view', 'id' => $this->PersonSkills->id ) );
  }
 }
}

Из руководства по валидации в контроллере на http://book.cakephp.org/view/410/Validating-Data-from-the-Controller

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