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

lunes, 2 de junio de 2008

Problemas con find('list') y generateList deprecado en CakePHP 1.2

La verdad a la hora de crear un arreglo de opciones para una lista (select en HTML) tuve problemas ya que en la versión 1.2 de CakePHP la función generateList está deprecada.

Bueno la primera opción que ví fue la de utilizar la función find('list'), pero los resultados no fueron los más deseados. Buscando en los grupos de cake tratando de encontrar alguna sintaxis específica para esta función me encontré con otra solución, que aquí les dejo:

2.    $foo = $this->Usuario->TipoUsuario->find('all');
3. $tipo_usuarios = Set::combine($foo, '{n}.TipoUsuario.id', '{n}.TipoUsuario.nombre');
4. //Si ese objeto tiene una relacion por ejemplo de $belongsTo con el modelo
5. //actual, por ejmplo Usuario con TipoUsuario podemos setear directamente
6. //la lista con la siguiente funcion
7. $this->set(compact('tipo_usuarios'));

Actualización
Con el aporte que hizo José Lorenzo Rodrígues en sus comentarios la otra opción con la función find('list') quedaria así:

    $this->Usuario->TipoUsuario->displayField = 'nombre';
$tipo_usuarios = $this->Usuario->TipoUsuario->find('list');
//Si ese objeto tiene una relacion por ejemplo de $belongsTo con el modelo
//actual, por ejmplo Usuario con TipoUsuario podemos setear directamente
//la lista con la siguiente funcion
$this->set(compact('tipo_usuarios'));


Saludos ...

viernes, 30 de mayo de 2008

Funciones deprecadas o con otras opciones CakePHP 1.2

Estuve viendo un poco y leyendo la documentación y me encuentro con algunas funciones deprecadas o que cambiaron de la version 1.2 de CakePHP con respecto a la 1.1.

Les dejo la lista:
  • Todas las que manejaban forms con el helper html se pasaron al helper form. Pueden ver los cambios en este blog de La Torta en PHP en donde lo explican bien.
  • También la función que utilizabamos para generar listas para los campos select en html llamada generateList() está deprecada. Ahora se utiliza find('list').
    $this->Post->Categoria->find("list")
  • Otra es la función findCount que no estoy seguro si está deprecada pero ahora podemos utilizar find('count')
    $this->Post->find('count', array('conditions' => array('Post.comments_count' => '<>));
  • La función findAll ahora podemos utilizar find('all') para suplantar esta función.
    $this->Post->find('all', array('limit' => 15);
Bueno estas son una pequeña lista que encontré en diferentes blogs y también en algunos proyectos que estoy haciendo.

Saludos ...

jueves, 29 de mayo de 2008

Nuevo Sitio CakePHP-es

El domingo 1 de junio se llevará a cabo una discusión en el irc de cakephp-es. Los temas a discutir serán orientados al nuevo sitio de cakephp-es.

Esperamos que estén presentes la mayoría de los seguidores de este gran framework que nos ayuda cada día en nuestras labores.

La Reunión se llevará a cabo desde las 20 horas (UTC/GMT -5, hora de Panamá).

Para ingresar al irc tienes que ir al servidor freenode.net y el canal es #cakephp-es


Saludos ...

viernes, 23 de mayo de 2008

Proyecto CakePHP Extensions

Estuve pensando en estos días en crear un proyecto en el cual se hiciera una recopilación de las extensiones que la comunidad ha creado para cakephp. Actualmente cree un proyecto (http://www.assembla.com/wiki/show/cake_extensions) en el cual se tiene un repositorio svn para guardar todas las extensiones.

La persona que desee colaborar en esta iniciativo me puede escribir a mi email danilo.dope at gmail dot com o en el irc freenode canal #cakephp-es.

Actualmente estaba trabajando en un helper para mootools y estaba empezando un componente para picasa.

Bueno espero les guste la idea, y ya saben, el que quiera participar solo me avisa.

Saludos ...

jueves, 6 de marzo de 2008

Problemas con bindable y paginate en CakePHP

Últimamente tuve un poco de problemas con los binds y la función paginate de la nueva versión de el marco de trabajo cakephp, la 1.2.

Mi problema surgía cuando quería buscar todos los posts que estuvieran asociados a un tag específico, pero sólo quería traer la relación que el post tenía con Usuario y no la relación con Comentarios. Buscando por ahí me encuentra con una respuesta del Sr. Mariano Iglesias, que dice que la función paginate rehace las relaciones (por esta razón cualquiera unbindModel no funcionaría). En este enlace se puede encontrar información sobre el behavior Bindable. En mi caso la solución fue la siguiente:
  • Creo app_model.php y le agrego:
    var $actsAs = array('Bindable');
  • El método en el controlador post quedó así:
    function tag($id = null){
    if (!$id) {
    $this->Session->setFlash(__('Invalid Tag.', true));
    $this->redirect(array('action'=>'index'));
    }
    $this->layout = 'blog';
    // $this->Post->unbindModel(array('hasMany' => array('TrackPost', 'Comentario'), 'hasAndBelongsToMany' => array('Tag')));
    $this->Post->restrict(false, 'Usuario');
    /*$this->Post->bindModel(array('hasAndBelongsToMany' => array('Tag' => array(
    'joinTable' => 'posts_tags',
    'foreignKey' => 'post_id',
    'associationForeignKey' => 'tag_id',
    'unique' => false,
    'conditions' => 'Tag.id = '.$id)
    )
    ));*/
    $this->Post->Tag->recursive = 2;
    $this->set('existSession', $this->existSession());
    //$this->set('posts', $this->Post->Tag->find(array('Tag.id' => $id)));
    $this->set('posts', $this->paginate('Tag', array('Tag.id' => $id)));
    $this->Post->resetBindable(true);
    }
  • Lo interesante está en las siguientes líneas:
    • $this->Post->restrict(false, 'Usuario'); : esta línea restringe a que Post solo tengo relación con Usuario y el parámetro false hace que todos los cambios que haz hecho de relaciones sean permanentes.
    • $this->Post->resetBindable(true); : reseteo las relaciones para que funcionen como estaban.
Bueno con esto resolví mi problema. Saludos ...

lunes, 3 de marzo de 2008

Cakephp relación HBTM personalizada

Trabajando con CakePHP me encuentro en el manual el típico ejemplo de una relación de muchos a muchos (ejemplo de la relación de posts y tags).

Según la documentación se debe crear un campo select multiple para colocar los tags aquí. Este método no me gustó mucho y decidí hacerlo al estilo de el bloguer de Google, o sea, separar los tags por compas en un campo tipo text.

Mi solución consiste en buscar en la base de datos si los tags que el usuario introdujo existen, de no existir los inserto y obtengo su id. En el modelo post agregué el método beforeSave. Aquí les dejo el código:
public function beforeSave(){
if ($this->data['Tag']['tags'] != ''){ //Campo $form->input('Tag/tags')
$tags = explode(',', $this->data['Tag']['tags']);
foreach($tags as $tag){
$tag = trim($tag);
$tag_find = $this->Tag->findByTagname($tag);
if ($tag_find){
$tag_id = $tag_find['Tag']['id'];
}else{
$tag_ins = array('Tag' => array('tagname' => $tag));
$this->Tag->save($tag_ins);
$tag_id = $this->Tag->getLastInsertID();
}
$this->data['Tag']['Tag'][] = (string) $tag_id;
}
}
unset($this->data['Tag']['tags']);
return true;
}


Para el caso de la acción de editar, coloqué este código en el método:
if (empty($this->data)) {
$this->data = $this->Post->read(null, $id);
foreach($this->data['Tag'] as $tag){
$tags[] = $tag['tagname'];
}
$tags = implode(', ', $tags);
$this->set('tags', $tags);
}

Y en la vista
echo $form->input('Tag/tags', array('label' => 'Tags separados por coma', 'type' => 'text', 'value' => $tags));

Listo, de esta manera utilizamos la relación de muchos a muchos en cakephp, pero a nuestra manera.

Saludos ...

viernes, 11 de enero de 2008

CakePHP y Foxpro

Hace un tiempo me hice la pregunta si podía conectar Visual Foxpro con CakePHP. Había investigado un poco pero no había dado con la solución. Buscando un poco me di cuenta que cake maneja conexiones con adodb (librerías para manejo de base de datos en php). Con estas librerías encontré la solución. Lo lamentable es que hasta ahora solo lo puedo hacer en windows.
Solución:
  • Descarga el paquete adoddb
  • Descomprimelo en la carpeta de vendors.
  • Asegurate de descargar los drivers de odbc para foxpro (enlace).
  • Debemos crear un dns para la base de datos foxpro. Es sumamente sencillo. Solo hay que ir a Panel de Control -> Herramientas Administrativas -> Orígenes de datos ODBC.
  • En la pestaña DNS de usuario daz clic en el botón Agregar y escoges Driver para o Microsoft Visual FoxPro.
  • Te debe salir una nueva ventana en donde debes llenar unos datos:
    • Data Source Name: nombre del dns. Ojo este nombre lo vas a usar en la conexión.
    • Description: la que quieras.
    • Database type: si en el campo path vas a colocar una carpeta donde se encuentran los dbf, entonces colcoas Free Table directory.
    • Listo ya haz creado el DNS.
  • Ahora nos toca modificar el archivo de configuración de la base de datos, database.php así:
    var $default = array('driver' => 'adodb',
    'connect' => 'dnsname', //Esto es el nombre que colocaste en Data Source Name
    'login' => '',
    'password' => '',
    'database' => '',
    'prefix' => ''
    );
  • Con esto ya tenemos una conexión establecida con una base de datos foxpro.
Saludos ...

miércoles, 24 de octubre de 2007

Modificar htaccess para aplicación externa en CakePHP

Si has hecho un sistema en CakePHP y te dicen que tienes que agregar por ejemplo un blog a esa aplicación, pero no tienes que hacerla de cero con cakephp y puede utilizar por ejemplo wordpress, lo único que tienes que hacer crear una carpeta especial para dicha aplicación y agregar una línea al archivo .htaccess del documento raíz. Si tu carpeta se llama blog, la línea que tienes que agregar sería como esta (tomando en cuenta que dentro de blog va estar un index.php de la aplicación):
RewriteRule blog/(.*) - [L]

Con esto el htaccess quedaría de la siguiente manera

RewriteEngine on
RewriteRule blog/(.*) - [L]
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]


Saludos...

Nota: esto lo apliqué en cake 1.1.x

jueves, 20 de septiembre de 2007

Configuración de CakePHP + Smarty

Para utilizar una combinación de CakePHP + Smarty como sistema de templates tenemos que seguir los siguientes pasos:
  1. Se debe descarga la clase smarty.php que es la clase que se va a encargar de conectar cake con smarty. Se debe colocar en la carpeta /app/views/
  2. Debemos decargar los archivos de smarty y descomprimirlos en la carpeta de /app/vendors/ (la carpeta lib es la que debes tomar, o sea, que el contenido de libs debe ir dentro de /app/vendors/smarty/).
  3. Se crea un archivo app_controller.php que se va a guardar en la carpeta /app/ con el siguiente código.


  4. Ahora te toca descargar los helpers los cuales debes colocar en la carpeta /app/views/helpers. Para utilizar estos helpers debes colocar en los controladores la línea var $helpers = array('SmartyHtml','SmartyJavascript'); por ejemplo.
  5. Ahora solo queda crear los controladores con sus vistas las cuales deben llevar la extensión .tpl
  6. También se debe crear un default.tpl siguiendo la sintaxis de smarty dentro de /app/views/layouts/.
  7. En la carpeta /app/tmp debes crear los siguientes directorios:
    • smarty
    • smarty/compile
    • smarty/cache


    Artículo sacado de bakery.cakephp.org

martes, 28 de agosto de 2007

Mambo integrará a CakePHP en su core.

Por una noticia leída en vivaphp me entero de que CakePHP va a ser integrado en el core de la nueva versión de Mambo (la 5.0).
Mambo utilizará la versión 1.2 de Cake y actualmente se encuentra en una versión beta.

Para más información pueden entrar a la noticia expuesta en el sitio de cake bakery o al sitio de mambo.

lunes, 20 de agosto de 2007

Tutorial CakePHP

Bueno aquí les dejo una lista de los tutoriales y manuales que he podido encontrar de CakePHP.
1. Tutorial en español de CakePHP. Enlace

2. IBM tutorial para CakePHP

3. API de CakePHP 1.1.x. Enlace

4. API de CakePHP 1.2.x. Enlace

5. Manual de CakePHP. Enlace

6. Uso de TinyMce Editor dentro de CakePHP. Enlace

Explicación:
El primero es un tutorial totalmente en español para la versión 1.1.x de CakePHP. Los siguientes enlaces todos los archivos están en inglés. Con estos archivos ya podemos comenzar a construir una verdadera aplicación con CakePHP.

En los siguientes posts, haré unas traducciones de artículos encontrados en bakery.cakephp.org
También subiré el código de algunos proyectos que estoy realizando (por ejemplo una galería de imágenes), o como usar los vendors en cakephp (ejemplo phpmailer).

Saludos... ; )