cbuttoncolum Delete

Ciao,

ho un problema con i cbuttoncoloum messi in una gridview

senza cambiare link view e update mi funzionano mentre il delete mi da un errore

400,'Invalid request. Please do not repeat this request again

come si pùo risolvere?

vedo che fa riferimento al seguente codice:

public function actionDelete($id)

{


	if(Yii::app()->request->isPostRequest)


	{


		// we only allow deletion via POST request


		$this->loadModel($id)->delete();





		// if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser


		if(!isset($_GET['ajax']))


			$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));


	}


	else


		throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');


}

Sembra che non fai un request di tipo POST…

Prova a rimovere


if(Yii::app()->request->isPostRequest)

giusto grazie era banale

Grazie ancora

Confermo che anche a me ha dato lo stesso errore. A questo punto vorrei far notare una cosa: il modulo ha come method=“post” dunque non mi è ben chiaro perchè dia quell’errore. Io ho appena scaricato l’ultima versione. Non credo sia un “caso”.

Questo e il metodo isPostRequest()




 public function getIsPostRequest()

 {

  return isset($_SERVER['REQUEST_METHOD']) && !strcasecmp($_SERVER['REQUEST_METHOD'],'POST');

 }



e posibile che il tuo server no ha questa variabile $_SERVER[‘REQUEST_METHOD’] ?

Prima di Yii usavo controllare la count($_POST). Se Yii facesse lo stesso? Di fatto si possono effettuare richieste che sono in contemporanea get e post:




<form ... action="index.php?r=site/page" method="post">

...

<input type="text" name="prova" />

...

</form>



ed avere sia $_GET["r"] che $_POST["prova"];

E’ più corretto fare come fa Yii che controlla REQUEST_METHOD ma count($_POST) non dovrebbe essere trascurata. Che ne pensate?

Adesso faccio una domanda stupida …: non è che, per assurdo, "POST" viene confuso da "post"?

La variabile $_SERVER[‘REQUEST_METHOD’] e uno standard per questo e usata anche in Yii… qui e la prima volta che qualchuno riporti che questo non lavora…

a proposito… hai provato a vedere che cosa contiene questa variable da te?

Provo subito e ti so dire.

Ho modificato actionDelete in questo modo:




    public function actionDelete($id) {

      if(Yii::app()->request->isPostRequest) {

        $this->loadModel($id)->delete();

        if(!isset($_GET['ajax']))

          $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));

      }

      else

      {

        var_dump($_SERVER['REQUEST_METHOD']);

        exit();

        //throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');

      }

    }



Mi restituisce


string(3) "GET"

. Il problema, ora, è riuscire a capire come mai accade questo.

PS. Ho messo exit(); per via del fatto che l’eccezione mi avrebbe mostrato solamente:


Error 400

Invalid request. Please do not repeat this request again.

Vuol dire che non si tratta di un POST request ma di un GET request ?

Posta qui il codice della view dove chiami la CGridView…


<?php $this->widget('zii.widgets.grid.CGridView', array(

    'id'=>'iscrizioni-grid',

    'dataProvider'=>$model->search(),

    'filter'=>$model,

    'columns'=>array(

      'id',

      'id_evento',

      'ragionesociale',

      'provincia',

      'riferimento',

      'telefono',

      /*

		'fax',

		'email',

      */

      array(

        'class'=>'CButtonColumn',

      ),

    ),

  )); ?>

Ed ecco l’HTML generato:


<div id="iscrizioni-grid" class="grid-view">

<div class="keys" style="display:none" title="/projectsrl.com/index.php?r=iscrizioni/admin"><span>15</span></div>

<div class="summary">Displaying 1-1 of 1 result(s).</div>

<table class="items">

<thead>

<tr>

<th id="iscrizioni-grid_c0"><a href="/projectsrl.com/index.php?r=iscrizioni/admin&amp;Iscrizioni_sort=id">ID</a></th><th id="iscrizioni-grid_c1"><a href="/projectsrl.com/index.php?r=iscrizioni/admin&amp;Iscrizioni_sort=id_evento">Id Evento</a></th><th id="iscrizioni-grid_c2"><a href="/projectsrl.com/index.php?r=iscrizioni/admin&amp;Iscrizioni_sort=ragionesociale">Ragione Sociale</a></th><th id="iscrizioni-grid_c3"><a href="/projectsrl.com/index.php?r=iscrizioni/admin&amp;Iscrizioni_sort=provincia">Provincia</a></th><th id="iscrizioni-grid_c4"><a href="/projectsrl.com/index.php?r=iscrizioni/admin&amp;Iscrizioni_sort=riferimento">Riferimento (Sig. Sig.ra)</a></th><th id="iscrizioni-grid_c5"><a href="/projectsrl.com/index.php?r=iscrizioni/admin&amp;Iscrizioni_sort=telefono">Recapito telefonico</a></th><th class="button-column" id="iscrizioni-grid_c6">&nbsp;</th></tr>

<tr class="filters">

<td><input name="Iscrizioni[id]" type="text"></td><td><input name="Iscrizioni[id_evento]" type="text"></td><td><input name="Iscrizioni[ragionesociale]" type="text" maxlength="250"></td><td><input name="Iscrizioni[provincia]" type="text" maxlength="250"></td><td><input name="Iscrizioni[riferimento]" type="text" maxlength="250"></td><td><input name="Iscrizioni[telefono]" type="text" maxlength="250"></td><td>&nbsp;</td></tr>

</thead>

<tbody>

<tr class="odd"><td>15</td><td>26</td><td>Ciao </td><td>mamma</td><td>guada co</td><td>come </td><td class="button-column"><a class="view" title="View" href="/projectsrl.com/index.php?r=iscrizioni/view&amp;id=15"><img src="/projectsrl.com/assets/b0f16b1d/gridview/view.png" alt="View"></a> <a class="update" title="Update" href="/projectsrl.com/index.php?r=iscrizioni/update&amp;id=15"><img src="/projectsrl.com/assets/b0f16b1d/gridview/update.png" alt="Update"></a> <a class="delete" title="Delete" href="/projectsrl.com/index.php?r=iscrizioni/delete&amp;id=15"><img src="/projectsrl.com/assets/b0f16b1d/gridview/delete.png" alt="Delete"></a></td></tr>

</tbody>

</table>

</div>

Nell HTML generatto dovrebe esserci anche il jQuery responsabile per il deletebutton

Simile a questo:




jQuery('#test-grid a.delete').live('click',function() {

	if(!confirm('Are you sure you want to delete this item?')) return false;

	$.fn.yiiGridView.update('test-grid', {

		type:'POST',

		url:$(this).attr('href'),

		success:function() {

			$.fn.yiiGridView.update('test-grid');

		}

	});

	return false;

});



E qui il tipo del request e settato a POST

Purtroppo il codice è corretto. C’è da dire una cosa … ho aggiunto


<script type="text/javascript"> 

/*<![CDATA[*/

jQuery(function($) {

 

$('.search-button').click(function(){

	$('.search-form').toggle();

	return false;

});

$('.search-form form').submit(function(){

	$.fn.yiiGridView.update('iscrizioni-grid', {

		data: $(this).serialize()

	});

	return false;

});

 

jQuery('#iscrizioni-grid a.delete').live('click',function() {

	if(!confirm('Are you sure you want to delete this item?')) return false;

	$.fn.yiiGridView.update('iscrizioni-grid', {

		type:'POST',

		url:$(this).attr('href'),

		success:function() {

			$.fn.yiiGridView.update('iscrizioni-grid');

		}

	});

	return false;

});

jQuery('#iscrizioni-grid').yiiGridView({'ajaxUpdate':['iscrizioni-grid'],'ajaxVar':'ajax','pagerClass':'pager','loadingClass':'grid-view-loading','filterClass':'filters','tableClass':'items','selectableRows':1});

});

/*]]>*/

</script> 

L’unico intervento che ho fatto nel codice è il seguente:


    /**

     * @return array relational rules.

     */

    public function relations () {

      return array(

        'nome_evento'=>array(self::BELONGS_TO, 'Events', 'id_evento'),

      );

    }

e dunque in diversi posti ho usato questo nuovo campo:

Nella view:


<?php $this->widget('zii.widgets.CDetailView', array(

	'data'=>$model,

	'attributes'=>array(

		'id',

		'nome_evento.description',

		'ragionesociale',

		'provincia',

		'riferimento',

		'telefono',

		'fax',

		'email',

	),

)); ?>

Nella _view:


	<b><?php echo CHtml::encode($data->getAttributeLabel('nome_evento.description')); ?>:</b>

	<?php echo CHtml::encode($data->nome_evento->description); ?>

	<br />

Nell’update:


<?php

$this->breadcrumbs=array(

	'Iscrizioni'=>array('index'),

	substr($model->nome_evento->description, 0,10).' ...'=>array('view','id'=>$model->id),

	'Update',

);

?>

Dovrebbe essere l’unica cosa diversa dal normale codice generato da Yii. Io ho aggiunto questo campo manualmente. C’era forse un modo diverso di aggiungere un riferimento ad una chiave esterna? Possibile che sia quello che, in un modo o nell’altro, “infastidisca” il normale codice di Yii?

tutto OK nell tuo codice…

hai usato mai firefox con firebug… non vedo altro modo di scoprire cosa succede qui…

Uso chrome. Purtroppo non so capire il problema. Se dovessi risolvere ti faccio sapere. Guarda, se vuoi ti passo anche il codice ma non voglio farti lavorare per me. Se fosse un bug sarei molto felice di partecipare in questo modo alla "soluzione".

In verità il problema lo avevo risolto esattamente come hai suggerito tu a sbondi, ovvero commentando "isPostRequest". Però mi sarebbe piaciuto non ricorrere a questo stratagemma.

Amici del forum, abbiamo risolto!!! Nel mio caso, il delete non funzionava correttamente a causa del fatto che avevo inserito del codice javascript nella pagina senza seguire la codifica standard di Yii.

In particolare cosa dava problemi?

In breve… il jQuery era incluso due volte… e per una strana ragione se jQuery e incluso due volte il ajax request invece di essere POST era GET

Nessuna strana ragione =). Lo avevo fatto a mano, compresa cartella assets. Questo andava sicuramente a compromettere qualhe operazione automatica di jquery.