Confirmação De Dados Antes De Salvar

Bom dia a todos!

Estive olhando aqui no forum se existia algo semelhante e não consegui encontrar.

Meu caso é o seguinte:

Preciso que os dados sejam exibidos para o usuário confirmar ou voltar para editar (tipo um sistema de inscrição de concurso), só assim após ele confirmar grava no banco.

Tentei inserir um direcionamento para a view.php no método beforeSave() e não consegui. Estava pensando em usar sessão para isso, porém queria saber se alguém já passou por algo semelhante e/ou existe alguma forma mais automática de fazer.

Obrigado.

Boas,

Suponho que depois do utilizador preencher o formulário e submete que os os dados tenham que ser validados no modelo certo?

Proponho então que mantenha o código semelhante ao por omissão no actionCreate com a excepção de depois de ser efetuado o


if ($model->validade()) 

não seje chamada o método


$model->save()

mas sim um redirecionamento para outra página com todos os parâmetros do formulário a serem enviados.

Dessa forma é só preencher os inputs com esses valores.

Depois é fazer o submit normal e verificar se o pedido é um $_POST na nova action e fazer o procedimento normal.

Se não quiser chamar outra action então quando é feito o primeiro submit do formulário você pode sempre por os campos a disabled e perguntar de novo para confirmar os dados e só quando o segundo click é efetuado no submit é que os dados serão validados/inseridos de forma normal.

Cumprimentos,

SilverPT

É exatamente isso, não posso salvar no banco enquanto o usuário não confirmar isso.

No caso, teria que passar o objeto $model todo para a view correto?

Tentei fazer aqui, como se fosse direcionado para página update que eu chamei de confirm.

Más ainda não compreendi como redirecionaria a página. Seguem os códigos:

Controller:





 public function actionCreate() {

  if ($model->validate()) {

              

               // $this->render('confirm',array('model'=>$model));

                $this->redirect('confirm',array('model'=>$model));

             }

}


    public function actionConfirm($id) {

        $model = $this->loadModel($id);


        // Uncomment the following line if AJAX validation is needed

        // $this->performAjaxValidation($model);

    

        if (isset($_POST['Requisicao'])) {

            $model->attributes = $_POST['Requisicao'];

            if ($model->save())

                $this->redirect(array('view', 'id' => $model->id_requisicao));

        }


        $this->render('confirm', array(

            'model' => $model,

        ));

    }



view confirm.php




<?php

$this->breadcrumbs=array(

	'Requisicaos'=>array('admin'),

	$model->id_requisicao=>array('view','id'=>$model->id_requisicao),

	'Atualizar',

);


$this->menu=array(

	//array('label'=>'List Requisicao', 'url'=>array('index')),

	array('label'=>'Create Requisicao', 'url'=>array('create')),

	array('label'=>'View Requisicao', 'url'=>array('view', 'id'=>$model->id_requisicao)),

	array('label'=>'Manage Requisicao', 'url'=>array('admin')),

);

?>


<h1>Update Requisicao <?php echo $model->id_requisicao; ?></h1>


<?php echo $this->renderPartial('_form', array('model'=>$model)); ?>




Poderia me passar algum exemplo melhor? Não entendi a diferença do método render() e do método redirect();

Obrigado

Ora vamos com calma,

Você tem várias hipóteses, mas o seu problema principal é que quando renderiza a página para confirmar os dados os dados não estão a ser passados.

O código que mostrou está um pouco baralhante, mas o que você precisa de fixar é que para validar não é necessário gravar na BD, mas para renderizar outra view com os dados, ou você os passa para essa view, ou então grava antes os dados na DB ,mas mete lá um campo booleano que diga se foi confirmado ou não.

Não sei o que você pretende fazer, se é preciso persistir os dados mesmo que o utilizador não os confime, mas caso seje:




public function actionCreate(){

  $model=new <Modelo em questao>;


  if (isset($_POST['Requisicao'])) {

    $model->attributes = $_POST['Requisicao'];

            

     if ($model->validate()){

       $model->confirmado = FALSE;

        if ($model->save())

            $this->redirect(array('confirm', 'id' => $model->id));

     }

  }


  $this->render('create',array(

	'model'=>$model,

  ));


}


public function actionConfirm($id){


  $model=$this->loadModel($id);


  if(isset($_POST['Requisicao'])){

    $model->attributes=$_POST['Requisicao'];

    if($model->validate()){

      $model->confirmado = TRUE;

      if($model->save())

        $this->redirect(array('<controller>/<action>'));

    }

  }


  $this->render('confirm',array(

     'model'=>$model,

  ));

}




Agora na actionConfirm na view, você iria colocar os tais campos para o utilizador confirmar os mesmos e repare na variável de controlo $model->confirmado.

Se o objetivo da app for restringir ou permitir o acesso a determinados conteúdos consoante os dados tenham sido confirmados ou não, você apenas necessita de verificar se o atributo confirmado é TRUE ou FALSE.

[size=“1”]E já agora, não cheguei a testar o código acima, por se tiver algum erro corrija pf ::)

[/size]

Cumpts,

SilverPT