2009-11-17 9 views
11

Tengo un modelo en el que tengo que hacer algún procesamiento antes de guardar (o en algunos casos con una edición) pero no usualmente cuando simplemente estoy editando. De hecho, si realizo el procesamiento en la mayoría de las ediciones, el campo resultante será incorrecto. En este momento, estoy trabajando en la devolución de llamada beforeSave del modelo. ¿Cómo puedo saber si procedo de la edición o agregué?¿Cómo puedo saber si estoy antes de guardar desde una edición o una creación? CakePHP

Frank Lucas

Respuesta

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

Gracias. Funcionó perfectamente –

+1

Una forma ligeramente mejor de hacerlo es usar la prueba 'empty' en lugar de usar la prueba '! Isset'. De esta forma, si el campo de clave principal en la matriz de datos existe, pero está vacío (como ocurre a veces cuando comparte la vista de agregar y editar), aún así lo reconoce como un nuevo registro. –

+0

Esto no funciona para mí en cakephp3. Para la versión de Cakephp 3, consulte https://stackoverflow.com/a/25589117/1152756 – jpruizs

9

Esta es básicamente la misma que la respuesta neilcrookes', excepto que estoy usando empty() como la prueba, en contraposición a !isset().

Si existe una clave de matriz, pero está vacía, entonces! Isset devolverá false, mientras que empty devolverá true.

Me gusta usar el mismo archivo de vista para agregar y editar, para mantener mi código SECO, lo que significa que al agregar un registro, la clave 'id' seguirá configurada, pero no guardará nada. Cake maneja esto bien, excepto que la versión neilcrookes del código no lo reconocerá como un agregado, ya que la clave primaryKey se establece en la matriz de datos (aunque no contenga nada). Entonces, cambiando! Isset para vaciar las cuentas solo para ese caso.

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