before_validation_on_create

Hola:
he heredado una B.D. quie tiene como claves primarias el campo 'codigo' en lugar de 'id'...
Em principo toda va bien, y deseo completarla sin tener que cambiar los nombres de los campos .....
El primer problema que tengo es que DIEZ tablas son autonuméricas, y dado que existen eventos del tipo 'before_validation_on_create', quiero poder asignar yo el valor siguiente del autonumérico.. otra opción sería evitar que Kumbia los valide como campo no nulo, y me lo deje pasar, pues MySQL luego le asignará el valor que le toque.... AL intentar asignarle yo un valor hago:
class Impresora extends ActiveRecord {
public function after_enable_insert () {
$Impresora->codigo = 1;
}
public function before_validation_on_create () {
Flash::success('voy a buscar valor');
$this->codigo = $this->maximum('codigo','codigo <> 99999');
// $Impresora->codigo = $Impresora->maximum('codigo','codigo <> 99999');
// $this->$Impresora->codigo = $this->$Impresora->maximum('codigo','codigo <> 99999');
// this->$db->fetch_one('select max(codigo) from dispositivo where codigo <> 99999');
Flash::success('He buscado valor');
Flash::success('He encontrado valor'+$this->Impresora->codigo);
}

el caso es que recibo el error:
Notice: Undefined variable: Impresora in /data1/www/acido2/apps/default/models/impresora.php on line 21

¿Cómo hago regerencia al campo codigo del formulario, para asignarle un valor, y cómo lo busco?
Estoy probando de varias modos y nada de nada....
El cambiar los campos de nombre no me interesa.... de paso aprendo a utilizar eventos que deberían dejarme hacer lo que quiero....¿No?
muchas gracias de antemano......
y gracias por el FrameWork... muy cómodo pero al principio siempre me atranco .....

Juan Carlos.

Comentarios

  • Bueno el error esta claro esa variable no existe y menos como un objeto, en tal caso como estas en la misma clase solo necesitas hacer $this->campo (Esto POO)

    Esta no la entendí...
    ¿Cómo hago regerencia al campo codigo del formulario, para asignarle un valor, y cómo lo busco?
  • edited 11:32
    Muchas gracias....
    no tenía claro cómo hacer referencia al campo y ya me has respondido:
    $this->id (¿qué tonteria!)

    Y he visto cómo buscar el siguiente valor en la BD si quería yo asignarlo:
    $this->id = $this-> maximum('id','id <> 99999')+1;

    He puesto los campos autonuméricos como 'id' y estoy haciendo pruebas, pero no me deja modificar el valor 'id' asíque he vuelto con los campo 'codigo' no autonumerico.
    Como he visto que en los formularios en 'Visualizar' no se ven los registros que tienen un valor 'null' en un comboBox, me he creado valores 'Desconocido / Inexistente', con valor '99999' en el campo clave primaria (de als tablas maestras) y así se ven todos los registros... Por eso quiero cambiar yo este valor cuando voy a añadir, y hago:

    public function before_validation_on_create () {
    Flash::success('voy a buscar valor');
    $this->codigo = $this-> maximum('codigo','codigo <> 99999')+1;
    Flash::success('He buscado valor');
    Flash::success($this-> maximum('codigo','codigo <> 99999')+1);
    }
    Lo que me parece muy extraño es que, dado que estoy en la opción 'Adicionar', si pongo un valor que ya existe, en lugar de decirme que ya existe el valor, o duplicidad de claves, me dice 'Se insertó correctamente el registro', pero lo que está haciendo es una actualizacion del registro que ya existe, lo que puede llevarme a error y modificar valores que existen.
    Sólo si pongo un valor en el campo 'codigo' que no existe como '12345', entonces Kumbia me busca lo que hay en before_validation_on_create y hace lo que yo quiero...
    ¿ Es normal este comportamiento de que no me añade sino que actualiza el registro existente en lugar de intentar añadir y logicamente dar error pues ya existe esa clave?
    Espero haberme explicado....
  • Lo que sucede es que con ese callback que estas utilizando es llamado cuando el registro no existe, es decir un registro nuevo, como alternativa a este metodo puedes utilizar before_validation_on_update o before_update ambos metodos reseñados en la documentacion de kumbia en la pág. 59.

    Exito
  • edited 11:32
    Perdón si soy pesado....
    Tengo una clave que no es autonumérica...
    quiero darle yo un valor al añadir, y al aceptar quiero controlar que este valor en la clave primaria no existe...

    PRIMERO: no consiguo inicializarla en (ActiveRecord) initialize o before create ... al menos quiero que coja el valor por defecto que hay en la BD en MySQL y no llego a hacer lo que dice el manual (Kumbia 0.5) (vamos, quiero que ese valor me aparezca en el formulario como varlo por defecto)

    SEGUNDO:si al añadir y pulsar 'aceptar' el código ya existe, yo debo de almgún modo comprobar que ese código ya existe y rechazarlo... ¿cómo sé yo si estoy en 'Añadir' o en 'Modificar'...

    Perdón si las preguntas son 'chorras' es que no me aclaro con cómo validar una inserción que no acabe siendo una actualización.en before_update lo podría hacer, pero mi duda existencial es ¿Cómo sé si estoy en Añadir o en Modificar? He mirado en el código fuente que se genera en el formulario buscando alguna variable pero no veo nada.....


    Dejo el código con las pruebas que he ido haciendo.
    <?php
    class Impresora extends ActiveRecord {
    public function initialize() {
    Flash::success('Entro en initialize');
    $Impresora->codigo=NULL;
    }
    public function before_validation_on_create () {
    Flash::success('Entro en before_validation_on_create');
    $this->codigo = $this-> maximum('codigo','codigo <> 99999')+1;
    }
    public function before_create() {
    Flash::success('Entro en before_create');
    $this->codigo=$this-> maximum('codigo','codigo <> 99999')+1;
    }
    /* se ejecuta before_validation_on_create antes
    public function before_create() {
    Flash::success('Entro en before_create');
    $this->codigo = $this-> maximum('codigo','codigo <> 99999')+1;
    }
    */
    }
    ?>

    <?php
    class ImpresoraController extends StandardForm {
    public $scaffold = true;
    //public static $force = true;
    public function __construct(){
    $this->show_not_nulls(true);
    $this->not_browse('toma_pared','lote');
    $this->set_combo_dynamic('modelo','modeloimpresora','descripcion','column_relation: codigo');
    $this->set_combo_dynamic('ubicacion','ubicacion','descripcion','column_relation: codigo');
    $this->set_combo_dynamic('toma_pared','tomapared','descripcion','column_relation: codigo');
    $this->set_combo_dynamic('lote','lote','descripcion','column_relation: codigo');
    }
    function before_insert() {
    Flash::success('He entrado en before_insert');
    }
    function before_update () {
    Flash::success('He entrado en before_update');
    }
    }
    ?>
    Muchas gracias.....
  • edited 11:32
    Intento controlar que SÓLO se dan de alta registro nuevos con claves que no existe con la funcion 'before_insert':
    <?php
    class Estacion extends ActiveRecord {
    function before_insert() {
    $db->query("select codigo from estacion where codigo='".$this->codigo."'");
    if ($db->num_rows > 0) {
    Flash::error('Este código ya existe... Debes introducir uno nuevo');
    return false;
    } else Flash::error('NO EXISTE');
    }
    }

    ?>

    Pero no me sirve....
    ¿Es que tengo que tener las claves primarias como 'id' autonuméricas a la fuerza???? Se suone que no ¿?

    Muchas gracias....
  • edited 11:32
    El patrón ActiveRecord implementado en Kumbia, requiere un campo "id" que sea autonumérico como llave primaria.

    Estamos trabajando para que en futuras implementaciones esto sea mas flexible.

    Saludos.
Sign In or Register to comment.