Curso interno sobre Akelos

Septiembre 1, 2009

Jhon y Ronny nos están honrando hoy con un pequeño curso sobre Akelos, el framework PHP con el cual van desarrollando OpenC2C y otras aplicaciones desde hace tiempo.

jhon-akelos

ronny-akelos

El framework Akelos, aparte de ofrecer funcionalidades basadas en el modelo de Ruby on Rails (mucho más que CakePHP), ofrece una gestión integrada de pruebas automatizadas (generación de esqueletos de pruebas), gestión de internacionalización y creación automatizada de esqueletos de objetos (incluyendo interfaces CRUD – Create Read Update Delete).

Este capacitación interna viene frente a un proyecto de desarrollo grande en el cual vamos a estar trabajando a lo largo del mes de Septiembre.


Subir archivos usando AKelos Framework + validaciones respectivas

Mayo 6, 2009

En este post el objetivo es conocer un poco más sobre este poderoso Framework y todas sus bondades, para ello en esta sección voy a compartir con ustedes como subir archivos al servidor y las validaciones respectivas (tamaño, tipo, extension, etc).

Primero como todos sabemos interactuamos con la vista para cargar el archivo a subir, en formato Akelos:

<p><label for=”screenshot_file”>_{Image}</label><br />
<?= $form_tag_helper->file_field_tag(‘screenshot[file]‘); ?> <i>_{Only accepts JPG, JPEG, PNG or GIF (no animation)}</i>
</p>
<p><label for=”screenshot_title”>_{Image description}</label><br />
<?php  echo $active_record_helper->input(’screenshot’, ‘title’,array(‘maxlength’=>50))?>
</p>

Luego interactúa el controlador primero guardando el nombre del archivo en BD y enviando los datos del archivo en un array a una función dentro del modelo, recojemos los valores POST:

@$fileuploaded = $this->params['screenshot']['file'];
@$this->params['screenshot']['file'] = $this->params['screenshot']['file']['name'];

Enviamos lo datos a la funció setUploadedFile:

$this->Screenshot->setUploadedFile($fileuploaded);

Seteamos la variable para realizar el save() en Akelos:

$this->Screenshot->setAttributes($this->params['screenshot']);

Finalmente ahora el trabajo depende del modelo screenshot.php:

function setUploadedFile($var) {
$this->uploadedfile = $var;
}

Ahora validamos:

function validateOnCreate() {
if ($this->getErrorsOn(‘file’) === false) {
try{
$safe_extension = array(‘png’,'jpeg’,'jpg’,'gif’,'JPG’,'GIF’);  // solo acepta estas extensiones (bueno para imagenes)

if ($this->uploadedfile['error'])
throw new Exception($this->t(‘Error while uploading file!’));

@$path_parts = pathinfo($this->uploadedfile['name']);
if (!empty($path_parts['extension'])) {
if (!in_array($path_parts['extension'],$safe_extension))
throw new Exception($this->t(‘Invalid file type in pictures.’));  // validamos la extension del file
}

} catch (Exception $e) {
$this->addError(‘file’,'<span style=”color:red”>’.$e->getMessage().’</span>’);
}
}
if ($this->hasErrors()) return false;
else return true;
}

Ahora creamos una funcion para parsee el nombre del archivo y lo guarde en el campo file (por ejempo) de la BD:

function beforeCreate(){
@$path_parts = pathinfo($this->uploadedfile['name']);
if (!empty($path_parts['basename'])) {
$name_length = 31 – strlen($path_parts['extension']);
$this->uploadedfile['name'] = AK::randomString($name_length).’.’.$path_parts['extension'];
$this->set(‘file’, $this->uploadedfile['name']);
}
return true;
}

Ahora usamos una función para guardar el file en nuestro servidor.

function afterCreate(){
$root = ‘ruta_path’;
$target_path_root = $root;
AK::make_dir(substr($target_path_root,0,-1)); // crea el directorio si no existe

$target_path = $target_path_root.basename($this->uploadedfile['name']);
move_uploaded_file($this->uploadedfile['tmp_name'], $target_path); // lo copia
return true;
}

Y por últomo una función para elimianr en caso de hacer un destroy():

function beforeDestroy(){
$path = ‘ruta_path’;
@unlink($path.$this->get(‘file’));
return true;
}

Ojo: no cambiar el nombre de las funciones (son propias de Akelos), y si quiero actualizar mi imagen uso en vez de Create -> Update.

Espero que sea de ayuda para aquellos que quieren iniciarse con Akelos, luego explicaré como convertir una imagen a thumbnail.


Como solucionar el conflicto entre JQuery y Prototype usando Akelos PHP Framework

Enero 8, 2009

Como sabemos JQuery y Prototype son frameworks escritos en Javascript que permiten simplificar la manera de interactuar con documentos HTML orientándose al desarrollo sencillo y dinámico de aplicaciones web.

Akelos PHP Framework es una plataforma de desarrollo de aplicaciones web basado en el MVC (Modelo Vista Controlador) desarrollado por Bermi Ferrer, el cual contiene las buenas prácticas permitiendo simplificar el tiempo de implementación.

Bueno después de esta pequeña introducción, vamos a nuestro caso:

A veces queremos manejar eventos, desarrollar animaciones y agregar interacción con la tecnología AJAX a nuestras aplicaciones web y para ello decidimos usar JQuery, pero como Akelos por defecto usa el Prototype hay un probrema de compatibilidad, entonces para poder solucionar este problema:

Para nuestro ejemplo nos vamos al directorio view / layouts porsupuesto dentro de nuestra aplicación y seleccionamos main.tpl (puede ser otro tpl, pero se recomienda que sea en el principal).
La librería Prototype ya está funcionando así que la llamamos:

<%= javascript_include_tag ‘prototype’ %>
<%= javascript_include_tag ’scriptaculous’ %>
<%= javascript_include_tag ‘editam’ %>

Luego después de haber instalado nuestra librería JQuery en (se recomienda en este directorio) : public / javascripts / jquery.js la llamamos en nuestro tpl:

<%= javascript_include_tag ‘jquery’ %>
<%= javascript_include_tag ‘treeview’ %>
(un plugin jquery de ejemplo)

Al final de las llamadas Prototype y Jquery ingresamos esta pequeña línea de código:

<script>jQuery.noConflict();</script>

Ah y no te olvides de cambiar el caracter “#” por “jQuery”, por ejemplo:

Antes:

function change_visibility(url,container){
#(container).html(‘<b style=”color:blue”>_{Updating}…</b>’);
#(container).load(url);
}

Despues:

function change_visibility(url,container){
jQuery(container).html(‘<b style=”color:blue”>_{Updating}…</b>’);
jQuery(container).load(url);
}

Y ya está solucionado el problema de trabajar con estos dos grandes frameworks.

Nota: Todas las llamadas a los scripts se deben ingresar antes del script que evita el conflicto.