Intercettare errore actionDelete

Sto cercando di intercettare un eccezione (voluta) lanciata su actionDelete di un controller, ma a differenza di tutte le altre eccezioni che vengono gestite dal SiteController dal metodo actionError, questa viaggia per conto suo.

Sembra che Yii per default tratti gli errori causati da tentavivo di cancellazione via ajax, cioè compare una sorta di form sovrapposta alla schermata precedente con un messaggio astruso (tutto lo stack delle chiamate) invece di reindirizzarmi alla solita paginetta di errore che posso modificare come voglio io.

Come si gestisce la personalizzazione dell’errore da cancellazione?

Faccio una piccola correzione di tiro: la cancellazione parte da un componente CGridView con il click su un CButtonColumn.

Questo da il via ad un operazione ajax tutta su finestre di popup.

Se la riga cancellata ha dei record collegati allora parte il messaggio di violazione di foreign key, ed è esattamente quello che voglio, solo vorrei personalizzare il messaggio di errore che compare sulla finestra di popup.

In quello attuale c’è tutto lo stack delle chiamate.

Ma se sai che darà un’eccezione, perché la fai causare? Non è un’eccezione: mi sfugge il criterio. In ogni caso, se sai che dovrai mostrare questo popup, puoi sovrascrivere direttamente il bottone della delete in modo che non faccia nessuna chiamata ajax. Che ne dici?

Ho due tabelle, collegate da foreign key.

L’utente può cancellare un record della tabella principale, ma solo se non ci sono record sulla tabella secondaria (foreign key delete restrict).

Se l’utente cerca di cancellare i dati dalla tabella principale quando ci sono dei record sulla tabella secondaria vorrei riuscire a mandare un messaggio di warning personalizzato, tipo “Non puoi cancellare questo record finchè ci sono record relazionati a questo” (ovviamente meglio di così).

Sono riuscito a risolvere con l’override della funzione ajaxUpdateError della CGridView, anche se non è ancora come lo vorrei, ma solo perchè devo imparare a fare delle formettine con javascript/jquery più belle.

Interessante. Come posso fare?

Ti rimando a questo wiki che ho scritto tempo fa: puoi sovrascrivere i bottoni del wiki, personalizzandoli riga per riga.

http://www.yiiframework.com/wiki/290/change-buttons-on-our-cgridview-extending-yii/

io l’ho gestita così una situazione simile:

esempio: sto cancellando una tipologia di progetto che è stata già selezionata per alcuni progetti.

a livello di db volutamente ho lasciato l’ON DELETE su NO ACTION.

quando vado a cancellare questa tipologia giustamente yii mi mostra l’eccezione che viene fuori dal db.

la gridview l’ho settata in questa maniera:




'class'=>'CButtonColumn',

  'template'=>'{update}{delete}',

  'afterDelete'=>'function(link,success,data){ if(success) $("#statusMsg").html(data); }',



nel controller:




public function actionDelete($id)

{

   try{

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

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

	Yii::app()->user->setFlash('success','Eliminazione avvenuta correttamente.');

	 else

	 echo "<div class='flash-success'>Eliminazione avvenuta correttamente.</div>";

   }catch(CDbException $e){

	$l_p = Model::model()->findAllByAttributes(array('tipo_progetto'=>$id));

	echo "<div class='flash-error'><b>Errore</b> - Questa tipologia di progetto è stata selezionata per i seguenti progetti:";

	echo '<ul>';

           foreach ($l_p as $p){

	     echo '<li>'.$p->titolo_progetto.'</li>';

	   }

	echo '</ul>';

	echo '</div>';

   }

}



che ne dici?

Oppure puoi riscrivere la funzione delete del model, in questo modo fai il controllo e se necessario fai parent::delete altrimenti mandi un messaggio di errore