22 mar 2008

CakePHP: aggiunta di editor WYSIWYG di Ext JS (parte 3)



Dopo aver aggiunto i form in Ext JS alla nostra applicazione, rimaneva il fatto che editando un post, le modifiche effettuate venivano salvate in un nuovo post invece che aggiornare il contenuto del primo post.

Tale problema appariva di difficile soluzione in quanto, prima di aggiungere Ext JS, tutto funzionava correttamente e non capivo quali modifiche avessero portato a tutto ciò. Dopo numerosi tentativi (basti pensare che sono arrivato a scrivere più di 200 post per cercare di individuare l’origine del problema!) ho usato delle funzioni di CakePHP che potessero aiutarmi in fase di debug come la funzione log che scrive l’output sul file error.log nella cartella tmp/logs della nostra applicazione CakePHP. Ve ne propongo un esempio:

$titolo = $this->data['Post']['title'];
$this->log('ecco cosa contiene title_'.$titolo);



In questo modo sono arrivato a capire dove stava l’errore: nella prima applicazione il form per editare un post conteneva un campo di tipo hidden con l’id del post:

hidden('Post/id'); ?>



che veniva inviato al controller tramite il metodo POST.

Nella seconda versione con l’editor Ext JS invece avevo inserito l’id del post da modificare all’interno della funzione submit nel file myFormEDIT.js:

form_user.form.submit({
url: 'http://'+host+'/cake/app2/posts/edit2?id='+id,



pertanto l’id veniva passato al controller tramite il metodo GET.

Questo causava dei problemi perché – come ho scoperto poi – i campi passati con POST al controller sono accessibili direttamente, mentre quelli passati in GET no, essendo memorizzati in un array. Si veda questo esempio tratto da http://manual.cakephp.org/chapter/controllers:

$this->params['url']
 
Stores the current URL requested, along with key-value pairs of get variables. For example, if the URL /posts/view/?var1=3&var2=4 was called, $this->params['url'] would look like this:
 
[url] => Array
 
(
 
	[url] => posts/view
 
	[var1] => 3
 
	[var2] => 4
 
)



Modificando opportunamente la funzione edit2 nel file posts_controller.php nel seguente modo è stato finalmente risolto anche questo problema:

function edit2($id = null) {
Configure::write('debug', '0'); //turn debugging off; debugging breaks ajax
$this->layout = 'Ajax'; //set the layout to Ajax so the ajax doesn't break
 
if (empty($this->data)) {
$this->Post->id = $id;
$this->data = $this->Post->read();
$this->set('success', '{success:true}'); //this is a json statement. EXT forms need this to know if things worked
}
else {
$tmp = $this->params['url'];
$temp = $tmp['id'];
$this->Post->id = $temp;
 
if ($this->Post->save($this->data['Post']))
$this->set('success', '{success:true}'); //this is a json statement. EXT forms need this to know if things worked
}
}



Per concludere devo aggiungere che forse sarebbe opportuno inserire nella documentazione di CakePHP che la funzione save, la quale si occupa di salvare i dati presi in input sul database, viene eseguita anche quando i dati passati non sono corretti o completi (nel nostro caso appunto l’id non veniva inizializzato, eppure la funzione save scriveva ugualmente sul database, ma creava un nuovo post con un nuovo id!).

Tags: , , , ,

Leave a Reply

Message:

  • Ricerca

    or
  • Language

  • Categorie

  • Delicious

  • Statistiche


    Warning: Illegal string offset 'timestamp' in /home/mhd-01/www.micheledallatorre.it/htdocs/blog/wp-content/plugins/firestats/firestats-wordpress.php on line 1081

    Warning: Illegal string offset 'timestamp' in /home/mhd-01/www.micheledallatorre.it/htdocs/blog/wp-content/plugins/firestats/firestats-wordpress.php on line 1081

    Warning: Illegal string offset 'timestamp' in /home/mhd-01/www.micheledallatorre.it/htdocs/blog/wp-content/plugins/firestats/firestats-wordpress.php on line 1081

    Warning: Illegal string offset 'timestamp' in /home/mhd-01/www.micheledallatorre.it/htdocs/blog/wp-content/plugins/firestats/firestats-wordpress.php on line 1081
    • Pages displayed : 33362
    • Unique visitors : 18465
    • Pages displayed in last 24 hours : 0
    • Unique visitors in last 24 hours : 0