Estou com o seguinte problema, preciso/quero atualizar os registros apenas via Yii::app()->request->isPostRequest na actionUpdate da gridView, assim como é feito com o delete na actionDelete.
Este recurso é para evitar a edição via url, caso o usuário tente acessar o registro ele é redirecionado para a page 404.
Tentei por na grid assim:
admin.php - CGridView
...
'update'=>array(
'label'=>'update',
'url'=>'Yii::app()->createUrl("registro/update", array("id"=>$data->id))',
'options'=>array( // this is the 'html' array but we specify the 'ajax' element
'ajax'=>array(
'type'=>'POST',
'url'=>"js:$(this).attr('href')", // ajax post will use 'url' specified above
),
),
),
...
RegistroController
public function actionUpdate($id)
{
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(Yii::app()->request->isPostRequest)
{
$model=$this->loadModel($id);
if(isset($_POST['Registro']))
{
$model->attributes=$_POST['Registro'];
if($model->save()){
Yii::app()->user->setFlash('success',"Operação realizada com sucesso!" );
$this->refresh();
}
}
$this->render('update',array(
'model'=>$model,
));
}else
throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');
}
mais sem sucesso. Ele redireciona direto para a page 404.
'ajax'=>array(
'type'=>'POST',
'url'=>"js:$(this).attr('href')", // ajax post will use 'url' specified above
'data'=>array("id"=>$data->id)
),
Eu não me aprofundei bem no $id que está nas novas atualizações do Yii, que está sendo usando no actionUpdate($id) e loadMode($id) e actionDelete($id), no geral ele busca o $_GET[‘id’], não fiz os testes com $_POST[‘id’].
Pelo que vi aqui ele não funciona sem ter o success, porém quando eu uso o success ele "quebra" a extensão EJuiComboBox(exibindo o dropDown e o inputText separados) que uso na pesquisa num form acima, mais mesmo assim ele não passa pelo if(Yii::app()->request->isPostRequest), da Page 404.
=\
Editado
Se ele utiliza o $_GET[‘id’] no delete, porque então eu não consigo deletar um registro via url, tendo que clicar no botão de remove do CGridView ?
Não sei como fazer no CGridView, mais era bom se cada botão tivesse um <form> envolvendo ele, ai isso resolveria o problema. Só que ae não sei se a class CButtonColumn aceita adicionar tags antes dos botão.
Ou senão você mesmo pode mesmo criar uma coluna e renderizar o <form> com o botão e um <input type="hidden"/> com o ID mocado.
public function actionUpdate($id)
{
$model=$this->loadModel($id);
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['id'])){
if(isset($_POST['Registro']))
{
$model->attributes=$_POST['Registro'];
if($model->save()){
Yii::app()->user->setFlash('success',"Operação realizada com sucesso!" );
$this->refresh();
// $this->redirect(array('view','id'=>$model->id));
}
}
}
$this->render('update',array(
'model'=>$model,
));
}
Verifiquei com o firebug e ocorreu tudo bem, ele chegou na action.
Também dei um throw new CHttpException para verificar se realmente estava passando pelo if(isset($_POST[‘id’])) e ele passou de boa.
Agora fica a pergunta, como usar este ajaxLink dentro da grid e como renderizar a página de update?
É justamente uma regra que eu quero adicionar ao action do controller. Mais para tanto, eu preciso que o update não seja via GET, seja POST ou ajax por exemplo.
A idéia do Newerton se encaixa no que eu quero, se eu conseguir criar um form em uma column da pra fazer o que eu quero de boa.
Agora o que eu queria saber é, como é construída a chamada ao action delete que utiliza o if(Yii::app()->request->isPostRequest). Sabendo como que faz isso da pra fazer com o update e outros actions
O mesmo acontece quando uso o CHtml::link, ele atualiza a grid porém não renderiza a página de update…
Funcionou de boa Newerton, muito obrigado pela ajuda cara.
To me acabando de rir aqui (rindo pra não chorar ), se liga… se eu fizer isso com este botão eu vou ter que fazer com todos os outros botões desta e de todas as outras grids pro sistema fazer o que eu quero hehehhe me lasquei.
Fiz assim pra usar imagem no lugar do simples botão:
Bom se é isso a sua finalidade, vai precisar fazer em todos os model, mais se não me engano tem como você fazer um Helper, e criar 1x essa função e usar somente nas CGridView.