Проверить форму из другой модели - PullRequest
0 голосов
/ 26 июля 2011

У меня есть модель проекта, которая связана с моделью вопроса и моделью ответа.В project / view / я добавил форму для вставки нового вопроса, и она отлично работает.Но если я отправляю форму с ошибкой, она проверяется внутри / question / add.Я хочу, чтобы эти ошибки валидации отображались в проекте / представлении / странице.Как я могу это сделать?

Спасибо!

КОД:

    function add() {
    if (!empty($this->data)) {
        $this->Question->create();
        if ($this->Question->save($this->data)) {
            $this->Session->setFlash(__('The question has been saved', true));
            $this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash(__('The question could not be saved. Please, try again.', true));
        }
    }
}

ФОРМА:

<?php echo $this->Form->create('Question', array('action' => 'add'));?>
<fieldset>
    <legend><?php __('Add Question'); ?></legend>
<?php
    echo $this->Form->input('text');
    echo $this->Form->hidden('Project', array('value' => $project['Project']['id']));
?>
</fieldset>
<?php echo $this->Form->end(__('Submit', true));?>

Они оба похожи, так какони были испечены пирогом.

Ответы [ 3 ]

1 голос
/ 27 июля 2011

Редактировать: хорошо, чтобы обеспечить правильное разделение модели: поскольку вы хотите отобразить ошибки проверки на страницах проектов / представления, вам все равно необходимо опубликовать данные в проектах / view / $ id (в противном случае вам придется иметь дело с перенаправление на реферера). Вы можете написать метод addQuestionForProject ($ data) в модели вопросов, переместить туда код сохранения и вызвать этот метод в проектах / просмотре кода контроллера.

<?php echo $this->Form->create('Question', array('controller'=>'projects','action' => 'view',{your project id here}));?>

контроллер проектов

function view($id=null) {
if(!$id)$this->redirect(array('action' => 'index'));
if (!empty($this->data)) {
    if ($this->Project->Question->addQuestionForProject($this->data)) {
        $this->Session->setFlash(__('The question has been saved', true));
    } else {
        $this->Session->setFlash(__('The question could not be saved. Please, try again.', true));
    }
}
// read your project record here
}

Я не уверен, что торт может автоматически обнаруживать ошибки проверки в этом случае (вероятно, может); но если нет, вы можете передать ошибки обратно из addQuestionForProject и отобразить их самостоятельно.

Другой способ - использовать вызов ajax, поэтому вы можете отправить запрос непосредственно в questions / add и вернуть массив ошибок (в формате xml, json или просто в формате html), но вам придется отображать ошибки самостоятельно.

1 голос
/ 26 июля 2011

Насколько я понял, вы хотите показывать ошибки проверки на странице просмотра вместо добавления представления.

    if ($this->Question->save($this->data)) {
        $this->Session->setFlash(__('The question has been saved', true));
        $this->redirect(array('action' => 'index'));
    } else {
        $this->Session->setFlash(__('The question could not be saved. Please, try again.', true));
        $this->Session->write('errors', $this->Question->validationErrors); //or you could use $this->Question->invalidFields()
        $this->redirect(array('controller' => 'projects', 'action' => 'view', $this->data['Project']['id']));
    }

Теперь в поле зрения echo ($ this-> Session-> read ('errors'));

0 голосов
/ 27 июля 2011

Я просто сделал то, что предложил Ehtesham, и это сработало!

In questions_controllers.php:

function add() {
    if (!empty($this->data)) {
        $this->Question->create();
        if ($this->Question->save($this->data)) {
            $this->Session->setFlash(__('The question has been saved', true));
            $this->redirect($this->referer());
        } else {
            $this->Session->setFlash(__('The question could not be saved. Please, try again.', true));
            $this->Session->write('question_error', $this->Question->invalidFields());
            $this->redirect($this->referer());
        }
    }
}

projects_controller.php:

function beforeFilter () {
    if ($this->Session->check('question_error')) {
        $this->Project->Question->validationErrors = $this->Session->read('question_error');
        $this->Session->delete('question_error');
    }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...