2009-11-17 11 views
11

Ho un modello in cui ho bisogno di fare un po 'di elaborazione prima di salvare (o in alcuni casi con una modifica), ma non di solito quando si modifica semplicemente. In effetti, se eseguo l'elaborazione sulla maggior parte delle modifiche, il campo risultante sarà errato. In questo momento, sto lavorando al callback beforeSave del modello. Come posso sapere se provengo dalla modifica o aggiunta?Come posso sapere se mi trovo in beforeSave da una modifica o da una creazione? CakePHP

Frank Luke

risposta

19
function beforeSave() { 
    if (!$this->id && !isset($this->data[$this->alias][$this->primaryKey])) { 
    // insert 
    } else { 
    // edit 
    } 
    return true; 
} 
+0

Grazie. Ha funzionato perfettamente –

+1

Un modo leggermente migliore per farlo è piuttosto che usare il test "! Isset", utilizzare il test "vuoto". In questo modo, se il campo della chiave primaria nell'array di dati esiste, ma è vuoto (come a volte accade quando si condivide la vista di aggiunta e modifica), esso lo riconosce comunque come salvataggio di un nuovo record. –

+0

Questo non funziona per me su cakephp3. Per la versione Cakephp 3, visitare https://stackoverflow.com/a/25589117/1152756 – jpruizs

9

Questo è fondamentalmente lo stesso come risposta neilcrookes', tranne che sto usando empty() come il test, al contrario di !isset().

Se esiste una chiave di array, ma è vuota,! Isset restituirà false, mentre empty restituirà true.

Mi piace usare lo stesso file di visualizzazione per aggiungere e modificare, per mantenere il mio codice ASCIUTTO, il che significa che quando si aggiunge un record, il tasto 'id' sarà ancora impostato, ma non manterrà nulla. Cake gestisce questo fine, ma la versione neilcrookes del codice non la riconoscerà come add, poiché la chiave primaryKey è impostata nell'array di dati (anche se non contiene nulla). Quindi, cambiando! Isset per svuotare solo i conti per quel caso.

function beforeSave() { 
    if (!$this->id && empty($this->data[$this->alias][$this->primaryKey])) { 
    // insert 
    } else { 
    // edit 
    } 
    return true; 
} 
Problemi correlati