[Resolvido] Criação interna de um registro

Me passaram pra fazer uma operação de SALVAR E NOVO sendo que iria copiar alguns campos do registro que foi salvo para o novo.

Então resolvi criar um registro novo e depois mostrar ele

mas não ta criando…

O código é este


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


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


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

            $model->scenario = 'register';

            if ($model->save()) {

                if ($_POST['Tarefa']['salva_e_novo'] === '1') {


                    $Nova = new Tarefa('register');

                    $Nova->Cod_Conta = $model->Cod_Conta;

                    $Nova->Data_Entrega = $model->Data_Entrega;

                    $Nova->Cod_Contato = $model->Cod_Contato;

                    $Nova->Cod_Vendedor = $model->Cod_Vendedor;

                    $Nova->Cod_Usuario_Cadastrou = $model->Cod_Usuario_Cadastrou;

                    $Nova->Cod_Usuario_Editou = $model->Cod_Usuario_Editou;


                    $Nova->scenario = 'register';

                    $Nova->save();


                    $nr = $Nova->Cod_Tarefa;


                    $this->redirect(array('tarefa/update/'.$nr));*/


                    // Código antigo

                    // $this->redirect(array('create'));

Ocorre tudo bem (pelo menos até o SAVE) mas vou ver e não é criado o registro…

=====================================================

Obs… Já conseguiu criar ele. (era só passar false dentro so save)

Mas ainda não to conseguindo mostrar ele depois de criado

na mesma operação

a linha que não ta funcionando é esta

$this->redirect(array(‘tarefa/update/’.$nr));

onde nr$ obtenho assim

$nr = $Nova->Cod_Tarefa;

UP

Não consegui resolver ainda… :unsure:

Mais uma upadinha, de leve…

ainda não resolvi essa parada

Olá Xavious

Tente utilizar o id do registro:


$this->redirect(array('tarefa/update/'.$id));

Cheers

Essa tabela não tem um campo chamado id

no lugar dele tem o Cod_Tarefa

Eu obtenho o nr do novo registro por esta linha


$nr = $Nova->Cod_Tarefa;

E ele traz o nr certo

mas na linha que ele deveria mostrar o registro em modo de edição, não funciona

Olá Xevious,

Poste o seu método "update" de sua Controller "Tarefa" para verificarmos qual é o problema.

Abs

eu uso o Create do Controller Tarefa, que antes ao clicar em Salvar e Novo, ele simplesmente abria uma nova página para lançar uma nova tarefa.

Agora eles querem que tenham já alguns campos preenchidos da tarefa que foi salva quando se clicou em SALVAR E NOVO.


    public function actionCreate()

    {

        $model = new Tarefa('register');


        $model->Operacional = Yii::app()->user->checkAccess('operacional') ? '1' : NULL;


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


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

            $model->Cod_Crm = Yii::app()->user->Cod_Crm;


            if ($model->save()) {

                if ($_POST['Tarefa']['salva_e_novo'] === '1') {


                    $Nova = new Tarefa('register');

                    $Nova->Cod_Conta = $model->Cod_Conta;

                    $Nova->Data_Entrega = $model->Data_Entrega;

                    $Nova->Cod_Contato = $model->Cod_Contato;

                    $Nova->Cod_Vendedor = $model->Cod_Vendedor;

                    $Nova->Cod_Usuario_Cadastrou = $model->Cod_Usuario_Cadastrou;

                    $Nova->Cod_Usuario_Editou = $model->Cod_Usuario_Editou;


                    $Nova->scenario = 'register';

                    $Nova->save();


                    $nr = $Nova->Cod_Tarefa;


                    $this->redirect(array(Yii::app()->baseUrl.'/tarefa/update/'.$nr));


                    // $this->redirect(array('create'));

                }

                $this->redirect(array('index'));

            }   

        }


        // Atalho, na edicao de conta, para cadastro de nova tarefa

        if (isset($_GET['Conta'])) {

            $conta = Conta::model()->findByPk(array('Cod_Cadastro'=>$_GET['Conta'], 'Cod_Crm'=>Yii::app()->user->Cod_Crm));

            if(isset($conta->Cod_Cadastro) && !empty($conta->Cod_Cadastro)) {

                $model->Cod_Conta = $conta->Cod_Cadastro;

            }

        }


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

            'model'=>$model,

        ));

    }



O trecho novo do código que fiz começa em $Nova = new Tarefa(‘register’);

e termina em $this->redirect(array(Yii::app()->baseUrl.’/tarefa/update/’.$nr));

Atualmente da essa mensagem de erro


Você não está autorizado a realizar essa operação. (C:\xampp\htdocs\studiofiscal2.com.br\crm\yii-1.1.14.f0fee9\framework\web\auth\CAccessControlFilter.php:182)


#0 C:\xampp\htdocs\studiofiscal2.com.br\crm\yii-1.1.14.f0fee9\framework\web\auth\CAccessControlFilter.php(145): CAccessControlFilter->accessDenied(Object(WebUser), 'Voc?? n??o est?...')

#1 C:\xampp\htdocs\studiofiscal2.com.br\crm\yii-1.1.14.f0fee9\framework\web\filters\CFilter.php(38): CAccessControlFilter->preFilter(Object(CFilterChain))

#2 C:\xampp\htdocs\studiofiscal2.com.br\crm\yii-1.1.14.f0fee9\framework\web\CController.php(1145): CFilter->filter(Object(CFilterChain))

#3 C:\xampp\htdocs\studiofiscal2.com.br\crm\yii-1.1.14.f0fee9\framework\web\filters\CInlineFilter.php(58): CController->filterAccessControl(Object(CFilterChain))

#4 C:\xampp\htdocs\studiofiscal2.com.br\crm\yii-1.1.14.f0fee9\framework\web\filters\CFilterChain.php(130): CInlineFilter->filter(Object(CFilterChain))

#5 C:\xampp\htdocs\studiofiscal2.com.br\crm\yii-1.1.14.f0fee9\framework\web\CController.php(291): CFilterChain->run()

#6 C:\xampp\htdocs\studiofiscal2.com.br\crm\yii-1.1.14.f0fee9\framework\web\CController.php(265): CController->runActionWithFilters(Object(CInlineAction), Array)

#7 C:\xampp\htdocs\studiofiscal2.com.br\crm\yii-1.1.14.f0fee9\framework\web\CWebApplication.php(282): CController->run('error')

#8 C:\xampp\htdocs\studiofiscal2.com.br\crm\yii-1.1.14.f0fee9\framework\base\CErrorHandler.php(331): CWebApplication->runController('site/error')

#9 C:\xampp\htdocs\studiofiscal2.com.br\crm\yii-1.1.14.f0fee9\framework\base\CErrorHandler.php(204): CErrorHandler->render('error', Array)

#10 C:\xampp\htdocs\studiofiscal2.com.br\crm\yii-1.1.14.f0fee9\framework\base\CErrorHandler.php(129): CErrorHandler->handleException(Object(CHttpException))

#11 C:\xampp\htdocs\studiofiscal2.com.br\crm\yii-1.1.14.f0fee9\framework\base\CApplication.php(732): CErrorHandler->handle(Object(CExceptionEvent))

#12 [internal function]: CApplication->handleException(Object(CHttpException))

#13 {main}

Xevious, não sei se entendi bem o que você deseja. Você que clicar no NOVO e o sistema automaticamente vai inserir e deixar já na tela alguns campos preenchidos. Se por acaso for isso, você pode fazer assim:

No seu controller na function Create você pode deixar assim:





    public function actionCreate() {

        $model = new Tarefa;       

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

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

            if ($model->save())

                Yii::app()->user->setFlash('success', 'Inserido com Sucesso!');

            Yii::app()->user->setFlash('error', 'Atenção! Erro na Inserção..');

            $this->redirect(array('create', 'Cod_Conta' => $model->Cod_Conta,

                'Data_Entrega' => $model->Data_Entrega,

                'Cod_Contato' => $model->Cod_Contato,

                'Cod_Vendedor' => $model->Cod_Vendedor,

                'Cod_Usuario_Cadastrou' => $model->Cod_Usuario_Cadastrou,

                'Cod_Contato' => $model->Cod_Contato,

            ));            

        }

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

            'model' => $model,

        ));

    }



No seu _form você pode incluir as seguintes linhas:





    <?php if (Yii::app()->user->hasFlash('success')): ?>

        <div class="flash-success">

        <?php echo Yii::app()->user->getFlash('success'); ?>

    </div>

    <?php elseif (Yii::app()->user->hasFlash('error')): ?>

            <div class="flash-error">

        <?php echo Yii::app()->user->getFlash('error'); ?>

        </div>

    <?php endif; ?>


<?php echo $form->errorSummary($model); ?>




<?php

            if (isset($_GET['Cod_Conta']) && !empty($_GET['Data_Entrega'])&& !empty($_GET['Cod_Contato'])&& !empty($_GET['Cod_Vendedor'])&& !empty($_GET['Cod_Usuario_Cadastrou'])) {

                $model->Cod_Conta = $_GET['Cod_Conta'];

                $model->Data_Entrega = $_GET['Data_Entrega'];

                $model->Cod_Contato = $_GET['Cod_Contato'];

                $model->Cod_Vendedor = $_GET['Cod_Vendedor'];

                $model->Cod_Usuario_Cadastrou = $_GET['Cod_Usuario_Cadastrou'];

            }

    ?>



Como disse acima, não sei se é isso que querias, mais caso seja fica a dica…

oLÁ dARTH Xevious,

O problema que você postou ocorre porque você está chamando o Action "Update" e deve não tê-la configurado nas regras de acesso do método "Rules" de sua controller(), mude então sua chamada conforme segue abaixo e realize as implementações necessárias no método "Create" de sua Controller:


$this->redirect(array(Yii::app()->baseUrl.'/tarefa/create/'.$nr));

Exemplo Do acessRules apenas para conhecimento caso você mantenha o ‘/update/’ em sua chamada:





public function accessRules()

	{

		return array(




			array('allow', 

				'actions'=>array('view','create','update'),

				'users'=>array('@'),

			),


			array('deny',  // deny all users

				'users'=>array('*'),

			),


		);

	}






Abs

Deu certo, fiz uns pequenos ajustes mas deu certinho

Obrigado também Davi Crystal, apesar de não ter chegado a testar tua solução

Já tava quase a um mes com essa tarefa encalhada, simplesmente me esqueci que poderia enviar os dados via GET e coloca-los na tela.

Esta estratégia vai me servir também pra outra tarefa que to fazendo agora :D