miércoles, 27 de junio de 2012

CakePHP: Llenando un combo box

Aca estoy iniciando con mis primeros pasos en este framework que hasta el momento pinta muy bien. La documentación que existe en el sitio oficial donde exponen un caso de ejemplo desarrollando un blog es verdaderamente muy útil. Solamente me quedé un poco atascado en el desarrollo de mi propio ejemplo queriendo llenar un combo box.

En mi caso quería tener una pantalla para agregar una mascota seleccionando la raza a la que pertenece.  Para ello necesito poder mostrar las razas que se encuentran en una tabla aparte de la de mascotas.

Al final la solución que encontré fue la de importar la clase modelo "Raza" para poder hacer un "find" y mandar los resultados a la vista utilizando una notación especial para que se ajuste bien a un combo box.

Controlador

<?php
App::import('Model', 'Raza');

class MascotasController extends AppController {
    public $helpers = array('Html', 'Form');
    
    public function add() {  
        if ($this->request->is('post')) {
           // Código para salvar la mascota.
        } else {
            $raza = new Raza();          
            $razas = $raza->find('list', array(       
                  'fields' => array('Raza.id', 'Raza.nombre')
            ));
            $this->set('razas', $razas);         
        }
    }
}

Vista

<h1>Agregar Mascota</h1>
<?php
echo $this->Form->create('Mascota');
echo $this->Form->input('nombre');
echo $this->Form->input('raza', array(
    'type'    => 'select',
    'options' => $razas,
    'empty'   => false
));
echo $this->Form->end('Guardar Mascota');
?>

miércoles, 6 de junio de 2012

Imprimir contenido en ventana aparte

Código mostrando como mandar a imprimir un contenido en una ventana aparte cerrandola inmediatamente. Funciona para todos los navegadores (en teoría).
<html>
<head>
<script language="javascript">
function printDiv() { 
 var divToPrint = document.getElementById('printArea');
 newWin= window.open();
 newWin.document.write(divToPrint.innerHTML); 
 newWin.document.close();
 newWin.focus();
 newWin.print();
 newWin.close();
}
</script>

</head>

<body>
 <div id="printArea">
  Print all content here!
 </div>
 <a href="#" onclick="printDiv()">Print!</a>
</body>

</html>

lunes, 30 de abril de 2012

JavaScript: Parar/Iniciar un Gif animado


Hace un poco surgió la pregunta en el equipo si se podría controlar con JavaScript el ciclo de un Gif animado. Controlar al menos el parar y reiniciar la animación.

En mi búsqueda por Internet encontré que no se puede hacer directamente, pero sí se puede usar un truco que es reemplazar la imagen del Gif animado con una imagen estática. Inclusive encontré un código con Canvas que permite generar dinámicamente una imagen estática de un Gif animado. Solo funciona si el browser soporta HTML5.

Este sería el código:

<html>
<head>
<script>
function is_gif_image(i) {
    return /^(?!data:).*\.gif/i.test(i.src);
}

function freeze_gif(src) {
 i = document.getElementById(src);
    var c = document.createElement('canvas');
    var w = c.width = i.width;
    var h = c.height = i.height;
    c.getContext('2d').drawImage(i, 0, 0, w, h);
    try {
        i.src = c.toDataURL("image/gif"); // if possible, retain all css aspects
    } catch(e) { // cross-domain -- mimic original with all its tag attributes
        for (var j = 0, a; a = i.attributes[j]; j++)
            c.setAttribute(a.name, a.value);
        i.parentNode.replaceChild(c, i);
    }
}

function unfreeze_gif(id, src) {
 i = document.getElementById(id);
    i.src = src;
}

</script>
</head>
<body>
<img id="rotator" src="rotation.gif" />
<br />
<input value="Freeze!" type="button" onclick="freeze_gif('rotator')" />
<input value="Unfreeze!" type="button" onclick="unfreeze_gif('rotator', 'rotation.gif')" />
</body>
</html> 

martes, 24 de abril de 2012

Linux Shell: Uso en disco duro

Este comando de Unix/Linux está genial para listar el espacio usado en disco duro de todas las carpetas del primer nivel donde se ejecuta. En particular me fue útil para averiguar el espacio que estamos usando en una cuenta FTP.

du -hc --max-depth=1