Mostrando entradas con la etiqueta CakePHP. Mostrar todas las entradas
Mostrando entradas con la etiqueta CakePHP. Mostrar todas las entradas

lunes, 30 de enero de 2012

Sumar varios campos usando Jquery

El problema es el siguiente:

Tengo varios campos (inputs) de valores que debo agregar dinámicamente.  y estos valores deben ser sumados en un campo  TOTAL.

Una solución con JQuery es la siguiente:


   $('.valorequipo').live('keyup',function(){
       var add = 0;
        $('.valorequipo').each(function(){
            add += Number($(this).val());
         
        });
         $('#CompraTotalcompra').val(add);
    });
En este caso todos los inputs que quiero sumar de ben tener la clase "valorequipo".
Nótese que en lugar de "bind()" se usa "live()". Esto es por que los campo se van agregando dinámicamente. Si se usara bind(), solo se sumarían los campos presente en el formulario al momento de ejecutar el script.

jueves, 20 de octubre de 2011

Sumar campos en Cakephp y retornar la suma

Lo primero que se me ocurrió para resolver este problema era hacer una consulta find('list), y luego recorrer el arreglo sumando en una variable acumuladora y devolver el resultado.
Esto es sencillo pero resulta poco elegante.

Una mejor solución es incluir en la búsqueda una función de MySQL  y tumar los resultados directamente desde la búsqueda.
Y ya que únicamente necesito un valor, en lugar de find, uso la función field que devuelve un único valor en lugar de un array.

para resumir la cosa quedaría así.


$params = array('equipo_id'=>$equipo_id, 'numero_equipo'=>$numero, 'obra_id'=>$obra_id, 'fecha >'=>$fecha_ini, 'fecha <'=>$fecha_fin);
        $datos = $this->field('SUM(total)', $params  );
return $datos;
Aquí el truco es poner SUM('campo') ya que si la consulta, según las condiciones retorna varios campos, se suman y se devuelve únicamente el resultado.
Si se pone como parámetro de field, simplemente el nombre del campo, retornará la primera coincidencia si alguna.

miércoles, 15 de junio de 2011

Es mejor usar funciones de mysql para calcular un cunpleaños

El problema es sencillo:
Se desea mostrar de una lista de empleados el empleado que cumpla años el día de hoy.

Como primera opción se pensó en recorrer toda la lista de empleados en la vista haciendo explode() de la fecha y comparando el día y mes. Pero esta opción además de ser tediosa agregaría mucho código en la vista que no seria solo para mostrar los datos sino para calcular un resultado lo caual iría en contra de la filosofía MVC.

Asi que la mejor opción, al menos para mi, fue obtener desde el controlador un arrglo con los empledos que cumplieran años en el día actual.

El código seria más o menos asi:

$this->set('cumplen', $this->Empleado->find('all', array('conditions'=>array('date_format(fecha_nacimiento,\'%m%d\') = date_format(now(),\'%m%d\')'))));
De esta manera se estrían comparando cadenas como '0615' para junio 15 de cualquier año.

También podrían combinarse con opciones como field o containable para traer solo los datos que sean necearios.

sábado, 16 de abril de 2011

El símbolo # no es un parámetro valido como argumento en Cakephp

Y de hecho en ninguna otro framework php o aplicación web ya que es el símbolo que hace referencia a la misma pagina o a algún marcador en la misma.

Así que: el código:

$this->Html->link('#', array('action'=>'index'));

Realmente no dispara la acción index del controlador sino que te lleva a inicio de la pagina, nada más.

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