UPDATE: i codici sotto riportati sono incompleti a causa di problemi con wordpress. Provvederò quanto prima a sistemarli.
Eravamo rimasti ai problemi di interazione tra il form di Ext JS e CakePHP.
Ecco la soluzione:
- similmente a quanto fatto per la funzione add creiamo nel file posts_controller.php le due funzioni edit ed edi2:
function edit($id = null) {
//carico i dati del post
$this->data = $this->Post->read();
// uso set per passare i dati alla view
$this->set(‘data’, $this->data);
}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 breakif (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
{
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}
else {
$this->set(’success’, ‘{success:false}’); //EXT forms need this to know if something went wrong}
}
}Da notare l’uso nella funzione edit di read per caricare i dati del post in memoria e di set per passare questi dati alla view.
- nella view edit.thtml andremo a scrivere il seguente codice:
$myTextArea = addslashes($data['Post']['body']);
$myTextArea = preg_replace(“/\n/”,”\\n”,$myTextArea);
$myTextArea = preg_replace(“/\r/”,”\\r”,$myTextArea);
?>var titolo=”;
var body=”;link(‘myFormEDIT’); ?>Quanto scritto non fa altro che fare l’escape del messaggio contenuto nel post (per evitare situazioni spiacevoli che causano errori di sintassi), salvarlo nella variabile myTextArea ed assegnare quest’ultima alla variabile body definita in javascript; tale variabile, insieme a quella titolo, verrà usata nel form di Ext JS. Infine carichiamo il file javascript myFormEDIT.js che si occuperà della renderizzazione del form in Ext JS.
- il file myFormEdit.js differisce dal form usato per la funzione add solamente per due righe, collocate rispettivamente nell’item textfield e nell’item htmleditor (ovvero il campo di testo per il titolo e la textarea per il contenuto del post): con la riga value:titolo assegniamo al textfield il contenuto della variabile titolo definita al punto 2., similmente con la riga value:body assegniamo all’htmleditor il contenuto della variabile body.
Per chiarire quanto spiegato finora descriviamo brevemente il flusso dell’applicazione per la funzione edit:
- cliccando su Edit viene caricata la view edit.thtml che renderizza il form tramite il file myFormEDIT.js
- a questo punto facciamo le nostre modifiche al post e lo salviamo. Quando clicchiamo su Save viene chiamata la view edit2.thtml che restituisce
{success:true} - il file myFormEDIT.js pertanto mostra un messaggio di alert comunicando l’avvenuto salvataggio (“It worked!”) e rindirizza l’utente alla lista dei posts ricaricando la pagina.
Al momento sto lavorando affinchè i post editati non vengano non salvati in un nuovo post e sto cercando di capire perchè l’applicazione si comporti, nonostante il codice sia lo stesso, in modo differente se caricata in locale o in remoto.