miércoles, 23 de marzo de 2011

Los inputs maracados como "disabled" no son enviados con el formulario.

Hoy estuve dando vueltas un par de horas tratando de averiguar porqué no se me estaba guardado correctamente la información de un formulario que recién el día de ayer parecía funcionar a las mil maravillas.

La repuesta, muy sencilla: había marcado una etiqueta html input tipo texto con la propiedad disabled="disabled", lo que hace que esta no pueda ser editada por el usuario, pero tampoco sea enviado como datos del formulario.

Desde la perspectiva del HTML tiene sentido este comportamiento, ya que si el valor no puede der modificado por el usuario, yo ya sé el contenido y no tiene sentido enbviarlo conlos datos del formulario; pero desde un punto "dinámico" del asunto es posible que ese valor sea generado por el servidor y quiero mostrarlo o bien quiero bloquearlos después de hacer cálculos en el Cliente.

¿Solución? Crear un campo tipo "hidden" que copie el valor del campo deshabilitado y procesarlo en lugar de este.

Asi de sencillo.

martes, 22 de marzo de 2011

Para validar indices únicos de 2 campos

Generalmente es fácil hacer la comprobación si un valor que se va a insertar en una columna es único, es decir no será un valor repetido en esa columna.

Pero cuando el indice único esta compuesto por 2 campos digamos nombre y apellido y no quiero que se repita esa combinación, CakePHP, no cuenta son una regla isUnique explicita para estos indices compuestos.

¿La solución?

Crear una función de validación  propia que haga esto por nosotros.
Cómo no soy un experto en CakePHP y menos en PHP, depues de dar tratar de construirla yo mismo por un par de horas, decidi buscar alguna solución ya probada pues segurament eno soy el unico con ese problema. He aqui la solución:

Agregar la siguiente función el el modelo que contiene la combinación de campos a validar.


function checkUnique($data, $fields) {
    if (!is_array($fields)) {
            $fields = array($fields);
        }
        foreach($fields as $key) {
            $tmp[$key] = $this->data[$this->name][$key];
        }
    if (isset($this->data[$this->name][$this->primaryKey]) && $this->data[$this->name][$this->primaryKey] > 0) {
            $tmp[$this->primaryKey." !="] = $this->data[$this->name][$this->primaryKey];
        }
    //return false;
        return $this->isUnique($tmp, false); 
    }

LUego en el mismo modelo en la variable $validate, llamar esta función de validación par AMBOS campos:


'field1' => array(
                'checkUnique' => array(
                    'rule' => array('checkUnique', array('field1', 'field2')),
                    'message' => 'This field need to be non-empty and the row need to be unique'
                ),
            ),
'field2' => array(
                'checkUnique' => array(
                    'rule' => array('checkUnique', array('field1', 'field2')),
                    'message' => 'This field need to be non-empty and the row need to be unique'
                ),
            ),


Y hago énfasis en AMBOS capos pues en algún blog indicaban lo mismo pero omitían el segundo campo y así parece no funcionar, al menos para mi.

Fuente original:
http://stackoverflow.com/questions/3445483/validation-rule-for-a-composite-unique-index-non-primary