Nada es indispensable, siempre hay algo que lo puede remplazar

log de Cakephp 1.2

2008-05-23 15:26:54-05

PHP

Aquí les dejo el log de la platica sobre Cakephp que el buen amigo aarkerio dio en el canal de la mononeurona el dia 23 de mayo al medio dia.


El tema de #mononeurona.org es: ?Bienvenid@ a la Mononeurona! || ?Despabila tu mononeurona y comparte tu conocimiento! || Registra tu nick: "/msg nickserv register your-password" || Sandbox: http://mononeurona.org.pastebin.com || Vista la p?gina oficial:

 

(12:01:45) aarkerio: bueno vamos a empezar
(12:01:49) doclinux: ok
(12:01:50) aarkerio: Bueno antes que nada en estos ejemplos estoy usando debian SID como OS, gnome-terminal como terminal y emacs como editor, pero se puede usar Gedit o Kate o Jedit o el que prefieran. Si van a usar emcas instalen el paquete php-elisp para que les pinte el código en PHP.
(12:01:51) Black_Soul: vale ya tengo que irme despues checo el log, suerte
(12:02:00) aarkerio: by black!
(12:02:15) aarkerio: bye! I mean
(12:02:30) aarkerio: como todos ustedes ya saben CakePHP es el RubyOnRails para PHP, MVC y todas esas cosas
(12:02:51) ramanugan: en la version estable al hacer el bake de una vista marcar un error : algo relacionado con un metodo llamado getDisplayField() , en el modelo tiene una relacion belongsTo.... si elimino la relacion si hace la vista bien...alguna sugerencia ?
(12:02:55) aarkerio: alguien tiene una duda sobre MVC?
(12:02:58) ramanugan: nop
(12:03:06) doclinux: nop
(12:03:53) alimon: no
(12:03:55) Fulano: yo si pero luego investigo por que no eh seguido tus talleres sorry
(12:04:05) aarkerio: Actualmente CakePHP 1.2 que es la versión con la que vamos a trabjar está en desarrollo, vamos a instalar la version 1.2 desde su repositorio en subversion
(12:04:10) mapache74 [n=austrumi@189.158.42.141] ha entrado en la sala.
(12:04:29) aarkerio: vamos a necesitar los siguientes paquetes
(12:04:31) aarkerio: sudo apt-get install subversion cakephp-instaweb php5 php5-pgsql postgresql
(12:05:24) doclinux: yo si hice la tarea y ya esta :-)
(12:05:33) Fulano: yo tambien hice esos puntos:D
(12:06:14) aarkerio: vamos a crear un directorio tmp en nuestro $HOME
(12:06:16) aarkerio: mkdir tmp
(12:06:40) aarkerio: nos metemos a ese dir y ahi bajamos las fuentes de cakephp 1.2
(12:06:58) aarkerio: svn co https://svn.cakephp.org/repo/branches/1.2.x.x/ myproject
(12:08:59) aarkerio: todos ya tenemos las fuentes abajo?
(12:09:04) doclinux: sip
(12:09:19) aarkerio: nos metemos al dir myproject
(12:09:39) aarkerio: y le damos un ls -l
(12:09:51) aarkerio: veremos cuatro directorios
(12:10:05) Fulano: sip
(12:10:06) aarkerio: el de docs ya sabemos
(12:10:49) aarkerio: "vendors" es para colocar código de terceras partes, cake son las librerías de CakePHP, esa directorio nunca se toca pues es el framework, este directorio es el CORE. El direcorio donde verdaderamente trabajamos es "app". Este directorio podría llmarse de otra manera por ejemplo "mycms" y nada cambiaría, la ventaja es que podemos tener varios projectos "muapp", "app3", "otracosa " usando las mismas librerías CORE para todos estos proyectos
(12:10:49) aarkerio: , asi para actualizar CakePHP sólo lo hacemos en un sólo directorio.
(12:11:41) aarkerio: bueno nos metemos al dir app
(12:11:52) aarkerio: y damos
(12:12:02) aarkerio: cakephp-instaweb
(12:13:26) aarkerio: Bueno con nuestro browser nos colocamos en http://localhost:3000, y ya podemos ver a cakephp, lo primero que veremos es el mensaje Please change the value of 'Security.salt' in app/config/core.php. Entonces abrimos el archivo app/config/core.php,
(12:13:41) aarkerio: pueden usar Gedit
(12:14:09) aarkerio: este archivo core,php guarda varias configuraciones, en este caso buscamos donde dice Configure::write('Security.salt'
(12:14:25) aarkerio: este es un string de seguridad que CakePHP usa para generar las sesiones, ninguna aplicación de CakePHP debe tener este string igual asi que lo edtamos borrando y agregando algunos caracteres del string.
(12:14:49) aarkerio: Si una aplicación pasa de Desarrollo a Producción es bueno guardar una copia de este string en un lugar seguro pues si alguien lo cambia los passwords cifrados de la base de datos ya no funcionan.
(12:15:24) aarkerio: si guardamos y recargamos en el browser ya no vemos el mensaje del Salt
(12:16:11) aarkerio: otra opción de este archvo core.php es Configure::write('debug', 2);
(12:16:26) aarkerio: que define el nivel de debug de CakePHP, cuando la aplicación esta en desarrollo puede estra en 1,2 o 3 cuando la aplicación está ya en producción por seguridad debe estar en cero.
(12:16:36) mapache74 ha salido de la sala ("Leaving").
(12:17:14) aarkerio: Si esta en 1 el debug sólo envia los mensajes de error, si está en 2 envia los mensajes de error y las consultas SQL y si está en 3 envía todo eso
(12:17:35) aarkerio: y además todas las variables de ambiente, las opciones 2 y 3 envian un chingó de información por lo cual generalmente el debug para el desarrollo está en 1
(12:17:40) ramanugan: oye aarkerio... no es por mala onda, pero ni somos tontos y vas muy lento
(12:18:13) aarkerio: bueno vamos a crear nuestra base de datos
(12:18:13) aarkerio: createdb -E UNICODE DBCAKE
(12:19:03) aarkerio: editamos el archivo config/database.php.default y lo salvamos compo database.php, el array $default debe estar así:
(12:19:20) aarkerio: public $default = array(
(12:19:20) aarkerio: 'driver' => 'postgres',
(12:19:20) aarkerio: 'persistent' => false,
(12:19:20) aarkerio: 'port' => 5432,
(12:19:20) aarkerio: 'host' => 'localhost',
(12:19:21) aarkerio: 'login' => 'postgres',
(12:19:23) aarkerio: 'password' => '9mexik00L',
(12:19:25) aarkerio: 'database' => 'DBCAKE',
(12:19:28) aarkerio: 'prefix' => '',
(12:19:30) aarkerio: 'schema' => 'public',
(12:19:33) aarkerio: 'encoding' => 'UTF-8'
(12:19:35) aarkerio: );
(12:19:37) aarkerio: Ahora en el browser ya debe verse el mensaje "Cake is able to connect to the database."
(12:19:52) ramanugan: si... asi es.
(12:21:24) aarkerio: vamos a crear las siguientes tablas:
(12:21:25) aarkerio: http://www.mononeurona.org/scripts/cake/blog.sql.txt
(12:21:36) spynes [n=chatzill@static-adsl201-232-95-118.epm.net.co] ha entrado en la sala.
(12:21:36) modo (+v spynes ) por ChanServ
(12:23:23) monouser611312 [n=monouser@201.137.208.253] ha entrado en la sala.
(12:23:29) aarkerio: todos ya tenemos las tablas en la BD?
(12:23:50) alimon: si
(12:23:51) ramanugan: si
(12:25:29) aarkerio: vamos a crear nuestro primer model:
(12:25:31) aarkerio: http://www.mononeurona.org/scripts/cake/entries.php.txt
(12:25:57) aarkerio: la parte del modelo y dominio debe ser la parte más grande de nuestra aplicación
(12:26:05) aarkerio: es donde está la lógica principal
(12:26:14) ramanugan: no recomiendas usar bake ?
(12:27:00) ramanugan: para generar los modelos, controladores y vistas ?
(12:27:01) aarkerio: a mi bake me truena, además sólo hace algunas cosas
(12:27:19) ramanugan: ???
(12:27:37) aarkerio: como en la mayoría de los casos, es mejor hacerlo a manita
(12:27:42) ramanugan: no estaria de mas dar una explicacion de como usar el bake
(12:27:53) ramanugan: me ha sacado de apuros varias veces
(12:28:11) ramanugan: sobre todo al escribir codigo de manera mecanica
(12:28:25) ramanugan: solo hay que escribir codigo sustancial
(12:28:30) ramanugan: no crees ??
(12:29:08) aarkerio: si lo he usado pero a mi me truena seguido y sólo crea esqueletos
(12:29:24) aarkerio: por ejemplo debería crear los scrumbs y las validaciones jS
(12:29:53) aarkerio: si tienes vistas y controladores más estructurados es mejor heredar esos que los que crea bake
(12:29:56) ramanugan: jjajja... ok, aunque no entiendo el por que de tu negativa, es una herramienta, que funciona bien ... usandola como se debe
(12:30:32) aarkerio: también Dreamweaver en algunos casos puede ser útil, pero yo no uso DW
(12:30:55) ramanugan: ok... ya no insisto mas
(12:31:21) ramanugan: uso emacs y vim... abrorrezco el dreamwebos
(12:31:22) aarkerio: bueno vamos a ver nuestro modelo Entry
(12:31:37) aarkerio: por que si es muy útil? hace muchas cosas?
(12:31:52) aarkerio: usandolo como se debe
(12:31:56) ramanugan: jajajajaja
(12:31:59) Fulano: jajaja
(12:32:02) ramanugan: sin palabras
(12:32:10) Fulano: ya sigue aarkerio
(12:32:23) ramanugan: si ya sigue
(12:32:28) Fulano: luego pelean en los blog's
(12:32:34) ramanugan: si eso es
(12:32:37) ramanugan: sigue
(12:32:38) ramanugan: por favor
(12:32:40) Fulano: y que cada quien defienda su parte
(12:32:42) aarkerio: anyhow las conveciones de Cake sobre modelos es: plura en BD singular en el nombre del modelo
(12:33:06) aarkerio: es decir si tenemis la tabla "users" el modelo es User
(12:33:31) aarkerio: si tenemos la tabla "entries" el modelo es Entry con mayúscula al inicio
(12:33:51) aarkerio: hay algunas excepciones como en la tabla "news"
(12:34:19) aarkerio: no se puede usar New porque es palabra reservada por lo cual el modelo es "News"
(12:34:36) aarkerio: siempre es mejor nombrar las tablas en inglés
(12:35:15) ramanugan: y si tengo una db heredada con los nombre en castellano ?
(12:35:17) aarkerio: como vemos el modelo Entry tiene tres dos asociaciones
(12:35:48) aarkerio: lo dejas en castellano
(12:36:04) aarkerio: dos asociaciones perdón
(12:36:21) aarkerio: $belongsTo y $hasMany
(12:36:39) aarkerio: como ustedes saben Cake usa el patrón de diseño ActiveRecord
(12:37:18) aarkerio: este patrtón permite integrar los elementos de un mundo relacional (SQL) a un mundo orientado a objetos (OOP)
(12:37:42) aarkerio: "envuelve" las tablas haciendolas objetos con métodos
(12:38:25) aarkerio: en la relación belongsTo se define que este objeto pertenece a otros dos objetos User y Theme
(12:39:14) aarkerio: por otro lado la relación hasMany (tiene muchos) especifica que tiene muchos elementos con el Objeto Comment
(12:39:40) aarkerio: la tabla entries sirve para guardar las entradas de nuestro blog
(12:40:30) aarkerio: en el objeto Entry vemos otro array: $validate
(12:40:39) doclinux: :-s ya me perdí : tengo que crear un directorio Entry y un archivo Entry y dentro un archi vo o ahi el Entry.php ?
(12:41:08) aarkerio: no hay que colocar el archivo entry.php en el directorio app/models/
(12:41:32) aarkerio: en ese directorio van los modelos
(12:42:16) doclinux: ok
(12:42:56) aarkerio: si nos colocamos en app/ y damos un ls -l
(12:43:15) aarkerio: veremos esto
(12:43:17) aarkerio: drwxr-xr-x 4 manuel manuel 146 2008-05-23 12:09 config
(12:43:17) aarkerio: drwxr-xr-x 4 manuel manuel 34 2008-05-23 12:09 controllers
(12:43:17) aarkerio: -rw-r--r-- 1 manuel manuel 953 2008-05-23 12:09 index.php
(12:43:17) aarkerio: drwxr-xr-x 4 manuel manuel 27 2008-05-23 12:09 locale
(12:43:17) aarkerio: drwxr-xr-x 5 manuel manuel 51 2008-05-23 12:09 models
(12:43:19) aarkerio: drwxr-xr-x 3 manuel manuel 29 2008-05-23 12:09 plugins
(12:43:20) aarkerio: drwxr-xr-x 6 manuel manuel 57 2008-05-23 12:09 tests
(12:43:24) aarkerio: drwxr-xr-x 7 manuel manuel 67 2008-05-23 12:09 tmp
(12:43:25) aarkerio: drwxr-xr-x 4 manuel manuel 30 2008-05-23 12:09 vendors
(12:43:27) aarkerio: drwxr-xr-x 9 manuel manuel 101 2008-05-23 12:09 views
(12:43:28) aarkerio: drwxr-xr-x 7 manuel manuel 137 2008-05-23 12:09 webroot
(12:43:35) aarkerio: el dir config es para la configuración
(12:43:54) aarkerio: en controllers van los controladores
(12:44:13) aarkerio: en locales vas los langs si queremos nuestra aplicación en varios idiomas
(12:44:27) alimon ha salido de la sala (quit: Read error: 104 (Connection reset by peer)).
(12:45:00) Fulano: sip
(12:45:01) aarkerio: en el dir tests van los unit testing de nuestra aplicación
(12:45:28) aarkerio: si han usado extremme programming han escuchado sobre los PHP UT
(12:45:46) aarkerio: en tmp están los logs y el cache de cake
(12:45:54) aarkerio: en views van las vistas
(12:46:17) aarkerio: el directorio webroot es el DOCUMENT_ROOT de cake
(12:46:49) aarkerio: es decir lo que está adentro de webroot es lo que vemos en el browser, los demás dirs no son accesibles desd internet
(12:46:57) aarkerio: lo que hace a cake más seguro
(12:47:18) aarkerio: en el dir vendors van las classes php externas a cake
(12:47:34) aarkerio: por ejemplo los captcha o los archivos que generan los PDF
(12:48:09) aarkerio: al trabajar con Cake vamos a estar consultando el API :
(12:48:11) aarkerio: http://api.cakephp.org/classes.html
(12:48:39) aarkerio: para saber los métodos y los parámetros que esperan
(12:49:27) Fulano: si te leemos
(12:49:54) aarkerio: vamos a crear una vista en cakephp
(12:50:44) aarkerio: en este caso vamos a crear una poágina estática creando el archivo app/views/pages/aboutme.ctp
(12:50:49) Roa: :O
(12:50:57) aarkerio: las vistas tienen la extensión .ctp
(12:51:37) aarkerio: "cake template"
(12:51:46) aarkerio: adentro de aboutme.ctp
(12:52:10) aarkerio: vamos a abrir un bloque php y adentro colocamos
(12:52:38) aarkerio: e($html->div(null, 'about me'));
(12:53:00) aarkerio: guardamos y nos colocamos en http://localhost:3000/pages/aboutme
(12:53:14) aarkerio: en las vistas de cakephp se usan los helpers
(12:53:36) aarkerio: que son clases que nos ayudan a generar código html bien formateado
(12:53:55) aarkerio: en este calse estamos usando el helper $html
(12:54:14) aarkerio: podemos ver su API:
(12:54:15) aarkerio: http://api.cakephp.org/class_html_helper.html
(12:54:19) Fulano: listo
(12:54:35) aarkerio: ademas estamos usando una función de cake e()
(12:54:55) aarkerio: que simplement hace "echo" a lo que este adentro
(12:55:14) aarkerio: el método div crea un div
(12:55:29) aarkerio: podemos usarlo asi:
(12:56:03) aarkerio: e($html->div('titsection', 'about me', array('style'=>'border:1px dotted orange')));
(12:56:35) Fulano: sip
(12:56:42) aarkerio: para eso por supesto debemos tener una clase titsection definida en nuestro archivo CSS somo veremos más adelante al importar nuestras
(12:56:47) aarkerio: hojas de estilos
(12:57:17) aarkerio: los helpers por lo general tiene este array al final para colocar valores al tag
(12:57:33) aarkerio: podemos usar
(12:57:42) aarkerio: e($html->para('titsection', 'about me', array('style'=>'border:1px dotted orange')));
(12:57:49) aarkerio: para parrafos
(12:58:09) aarkerio: echo $html->link('Nombre', 'ruta');
(12:58:15) aarkerio: para crear ligas
(12:58:31) aarkerio: echo $html->img('img.png');
(12:58:34) aarkerio: para imagenes
(12:58:37) aarkerio: etcétera
(12:59:03) aarkerio: la idea es que no no salgamos de php para teclear html
(12:59:09) aarkerio: que siempre es medio tedioso
(12:59:37) aarkerio: bueno ya saben, las paginas estáticas van en /views/pages/
(12:59:52) aarkerio: vamos a crear nuestro controlador
(13:00:01) aarkerio: los controladores van el dir controllers
(13:00:22) aarkerio: y se nombran entries_controller.php users_controller.php
(13:00:24) Fulano: sip
(13:00:27) aarkerio: themes_controller.php
(13:00:32) aarkerio: etcétera
(13:01:01) aarkerio: el archivo:
(13:01:03) aarkerio: http://www.mononeurona.org/scripts/cake/entries_controller.php.txt
(13:01:22) aarkerio: los guardamos en nuestro dir controllers
(13:02:09) aarkerio: los controladores tratan los "inputs" de la aplicación, estis inputs provienen de URLs o de formularios
(13:02:56) aarkerio: lo primero que vemos en nuestro controlador es uses('sanitize');
(13:03:14) ***Roa interesante platica alguien guardara log?
(13:03:22) aarkerio: que carga las clases para limpiar los valores que entran a la BD
(13:03:54) Fulano: ctrl+e? y ctrl+c si aqui es = sip yo
(13:04:00) aarkerio: tenemos un método display:
(13:04:02) aarkerio: public function display()
(13:04:02) aarkerio: {
(13:04:02) aarkerio: $this->pageTitle = 'Mi blog';
(13:04:02) aarkerio: $this->layout = 'blog';
(13:04:02) aarkerio: $conditions = array('Entry.status'=>1);
(13:04:05) aarkerio: $fields = array('Entry.id','Entry.title','Entry.theme_id','Entry.comments','Entry.created','Entry.body', 'Theme.theme');
(13:04:08) aarkerio: $order = 'Entry.id DESC';
(13:04:10) aarkerio: $limit = 10;
(13:04:12) aarkerio: $data = $this->Entry->findAll($conditions, $fields, $order, $limit);
(13:04:14) aarkerio: $this->set('data', $data);
(13:04:16) aarkerio: }
(13:04:58) aarkerio: este método es ejecutado através del URL del browser pues cake tiene un dispatcher que hace bonitos los urls
(13:05:23) aarkerio: es decir si en su navegador ponen
(13:05:24) aarkerio: http://localhost:3000/entries/display
(13:05:55) aarkerio: están diciendo "del controlador entries ejecuta el método display()"
(13:06:15) ramanugan: aja
(13:06:17) aarkerio: estpe método display como vemos hace varias cosas
(13:06:36) aarkerio: pone el título de la página con el atributo $this->pageTitle
(13:06:45) aarkerio: define el layout
(13:07:20) aarkerio: esta linea $this->layout vamos a comentrala pues aun no tenemos ningún layout "blog"
(13:08:12) aarkerio: los valores de $conditions, $fields, $order y $limit
(13:08:27) aarkerio: "arman" la consulta al modelo
(13:08:46) aarkerio: Cakphp automaticamente carga el model $this->Entry
(13:09:19) Fulano: si continua
(13:09:28) aarkerio: que es una extensión de la clase madre Model:
(13:09:30) aarkerio: http://api.cakephp.org/class_model.html
(13:09:45) aarkerio: por lo tanto ttiene el método findAll()
(13:10:00) aarkerio: para que encuentre todos los registros en la tabla
(13:10:31) aarkerio: una vez que tengo los datos en la vasriable multidimensional $data
(13:10:45) aarkerio: sólo falta pasarlos a la vista
(13:10:55) aarkerio: con el método $this->set()
(13:11:41) aarkerio: pero aun no tenemos una vista
(13:11:55) aarkerio: vamos a crear el directrtio app/views/entries
(13:12:13) aarkerio: y adentro vamos a colocar la vista display.ctp
(13:12:15) aarkerio: http://www.mononeurona.org/scripts/cake/display.ctp.txt
(13:12:35) aarkerio: es decir que el nombre de la vista debe ser el mismo que el nombre del método del controlador
(13:14:02) aarkerio: algo chido en cakephp es la función debug() esta función presenta la información de una array bien formateada en la pantalla
(13:14:16) aarkerio: como el nopmbre sugiere se usa mucho para el debug
(13:14:38) aarkerio: se puede usar en la vista el controlador o el modelo para saber qué es lo que hay un en array
(13:14:46) aarkerio: en este caso esta comentada
(13:16:24) Fulano: si continua
(13:16:41) aarkerio: en este caso el array data debería estra vacia
(13:16:58) aarkerio: pues no hay ningún registro en esa tabla
(13:17:29) aarkerio: bueno vamos a meter algunos registros a nuestro modelo Entry
(13:17:49) aarkerio: en el controlador entries_controller.php.txt
(13:18:01) aarkerio: tienen un método admin_add
(13:18:40) aarkerio: para acceder a este método en el url sería asi:
(13:18:57) aarkerio: http://localhost:3000/admin/entries/add
(13:19:09) aarkerio: pero para ello debemos editar el archivo core.php
(13:19:44) aarkerio: Configure::write('Routing.admin', 'admin');
(13:19:58) aarkerio: ese linea debe estar descomentada
(13:20:09) aarkerio: noten que puede tener otro valor como:
(13:20:19) aarkerio: Configure::write('Routing.admin', 'restricted');
(13:20:27) aarkerio: Configure::write('Routing.admin', 'zonadelamuerte');
(13:20:31) aarkerio: u otra cosa
(13:21:02) aarkerio: pero las vistas tambien deberian ser zonadelamuerte_add.ctp
(13:21:13) aarkerio: todo bien?
(13:21:27) Fulano: sip
(13:22:39) aarkerio: bueno vamos por nuestro archivo admin_add.ctp
(13:22:40) aarkerio: http://www.mononeurona.org/scripts/cake/admin_add.ctp.txt
(13:23:03) aarkerio: y lo colocamos en app/views/entries/
(13:24:10) Fulano: listo
(13:24:40) aarkerio: el método admin_add también define un layout:
(13:24:41) aarkerio: $this->layout = 'admin';
(13:25:01) aarkerio: es buena idea que la sección admin tenga su propio layout
(13:25:37) aarkerio: lo layouts van colocados en app/view/layouts
(13:25:46) aarkerio: y también tienen la extensión .ctp
(13:26:22) aarkerio: vamos a ir por el layout admin:
(13:26:23) aarkerio: http://www.mononeurona.org/scripts/cake/admin.ctp.txt
(13:26:54) aarkerio: el layout tiene la variable $title_for_layout;
(13:27:18) aarkerio: que es la que ponemos en el controlador con $this->pageTitle
(13:27:34) aarkerio: if ( isset($javascript) ):
(13:27:34) aarkerio: echo $html->charset('UTF-8');
(13:27:34) aarkerio: echo $javascript->link('prototype');
(13:27:34) aarkerio: echo $javascript->link('scriptaculous.js?load=effects');
(13:27:35) aarkerio: endif;
(13:27:44) aarkerio: es para cuando trabajamos con ajax
(13:28:04) aarkerio: if ( isset($javascript) ): revisa que el helper javascript este colocado
(13:28:40) aarkerio: cakephp tiene helpers para varias cosas y también nostors podemos crear nuestro propios helpers
(13:29:04) aarkerio: la parte más imprtante d e los layouts es echo $content_for_layout;
(13:29:24) aarkerio: $content_for_layout es el resultado del proceso de la vista
(13:30:19) aarkerio: el el layout usamos
(13:30:21) aarkerio: echo $html->css("admin");
(13:30:35) aarkerio: que carga nuestra hoja de estilos
(13:30:54) aarkerio: las hojas de estilos van en el dir app/webroot/css/
(13:31:17) aarkerio: hay que colocar ahi:
(13:31:18) aarkerio: http://www.mononeurona.org/scripts/cake/admin.css
(13:32:00) aarkerio: ahora si ya podemos ver el resultado de pnernos en localhost:3000/admin/entries/add/
(13:32:00) aarkerio: debe ver un formulario
(13:32:23) aarkerio: la vista admin_add.ctp es un formulario
(13:32:57) alimon [n=jircii@189.153.245.22] ha entrado en la sala.
(13:33:34) aarkerio: noten que en le método admin_add del controlador hay un:
(13:33:35) aarkerio: if ( !empty($this->data['Entry']) ):
(13:33:47) aarkerio: es decir que no hay valores del formulario
(13:34:00) aarkerio: y por lo tanto se debe armar los datos para el select con:
(13:34:08) aarkerio: $this->set('themes', Set::combine($this->Entry->Theme->find('all', array('order' => 'theme')), "{n}.Theme.id","{n}.Theme.theme"));
(13:34:22) monouser80444 [n=monouser@189.153.245.22] ha entrado en la sala.
(13:34:26) aarkerio: Noten qne hacemos una consulta anidada: $this->Entry->Theme->find(
(13:34:41) monouser80444 ha salido de la sala (quit: Client Quit).
(13:34:42) aarkerio: podemos hacerlo porque el modelo Entry posee una relación con el modelo Theme
(13:35:29) aarkerio: es decir que en la vista debemos recibir una array $themes
(13:35:46) aarkerio: que esl que usamos en echo $form->select('Entry.theme_id', $themes, null, null, false)
(13:35:59) aarkerio: todo claro hasta aqui?
(13:36:43) ramanugan: yes, sr
(13:37:10) Fulano: si continua
(13:38:29) aarkerio: si llenamos y enviamos el formulario volevemos al método admin_add pero ahora si entramos a la zona :
(13:38:31) aarkerio: $this->Sanitize = new Sanitize;
(13:38:31) aarkerio:
(13:38:31) aarkerio: $this->Sanitize->paranoid($this->data['Entry']['title']);
(13:38:31) aarkerio:
(13:38:32) aarkerio: $this->Sanitize->html($this->data['Entry']['body']);
(13:38:42) aarkerio: que limpia el array
(13:39:10) aarkerio: en la vida real aqui tendriamos que tener algo asi como :
(13:39:32) aarkerio: $this->data['Entry']['user_id'] = $this->Auth->user('id');
(13:39:54) aarkerio: para saber que usuario está agregando la entrada
(13:40:17) aarkerio: recuerden que si queremos saber que es lo que hay en el array podemos verlos asi:
(13:40:29) aarkerio: die(debug($this->data));
(13:40:52) aarkerio: Cakephp posee un componente llamado Security
(13:41:19) aarkerio: que hace más seguros los formularios pues crea randoms en las vistas y los verifica en el admin_add
(13:41:44) aarkerio: luego tenemos la parte del código:
(13:41:45) aarkerio: $this->Entry->create();
(13:41:46) aarkerio:
(13:41:46) aarkerio: if ($this->Entry->save($this->data["Entry"])):
(13:41:46) aarkerio: $this->flash('Story has been added', '/admin/entries/listing');
(13:41:46) aarkerio: endif;
(13:42:04) aarkerio: $this->Entry->create(); prepara el modelo para la inserción
(13:42:32) aarkerio: $this->flash('Story has been added', '/admin/entries/listing'); pone un mensaje en la pantalla con un link
(13:42:59) aarkerio: vale la pena hacer notar que este flash() si el debug es 0
(13:43:26) aarkerio: redirecciona autoamtiocamente ala página señalada, pero si el debug es mayor a 0 no lo hace
(13:44:44) aarkerio: como supondrán necesitamos la vista:
(13:44:44) aarkerio: http://www.mononeurona.org/scripts/cake/admin_listing.ctp.txt
(13:45:07) aarkerio: esta vista despliega las entradas de nuestro blog
(13:45:43) aarkerio: usamos el helper : $html->tableHeaders(
(13:46:09) aarkerio: y luego html->tableCells($tr,
(13:46:29) aarkerio: para evitarnos lo de los <td> <tr> y todo eso
(13:47:12) aarkerio: en la celda se crean links: $html->link('Edit', '/admin/entries/edit/'.$val['Entry']['id']
(13:47:44) alimon: ok
(13:47:54) aarkerio: necesitamos la vista:
(13:47:56) aarkerio: http://www.mononeurona.org/scripts/cake/admin_edit.ctp.txt
(13:48:13) aarkerio: que es casi igual a admin_add.ctp pero tiene un
(13:48:20) aarkerio: echo $form->hidden('Entry.id');
(13:48:36) aarkerio: en el método public function admin_edit($entry_id = null) del controlador
(13:48:44) aarkerio: $this->data = $this->Entry->read(null, $entry_id); // charge data for edit
(13:49:00) aarkerio: es el que carga los datos en el formulario de edición
(13:49:44) aarkerio: por favor remuevan $this->data['Entry']['user_id'] = 1; del método admin_edit
(13:50:00) aarkerio: se me paso: no tiene nada que hacer ahí
(13:50:08) ramanugan: regreso
(13:50:20) Fulano: jajaja
(13:50:45) ramanugan: voy por una chela... gustan ??
(13:51:01) ramanugan ha salido de la sala (quit: "Leaving.").
(13:51:51) aarkerio: han podido insertar los registros?
(13:53:27) aarkerio: en nuestro controller sólo nos falta el método para borrar registros:
(13:53:29) aarkerio: public function admin_delete($id)
(13:53:29) aarkerio: {
(13:53:29) aarkerio: if ( $this->Entry->del($id)):
(13:53:29) aarkerio: $this->flash('The entry has been deleted.', '/admin/entries/listing');
(13:53:29) aarkerio: endif;
(13:53:30) aarkerio: }
(13:53:32) ramanugan [n=areyes@132.247.33.204] ha entrado en la sala.
(13:53:33) modo (+v ramanugan ) por ChanServ
(13:53:37) aarkerio: public function admin_delete($id)
(13:53:37) aarkerio: {
(13:53:38) aarkerio: if ( $this->Entry->del($id)):
(13:53:40) aarkerio: $this->flash('The entry has been deleted.', '/admin/entries/listing');
(13:53:42) aarkerio: endif;
(13:53:44) aarkerio: }
(13:53:57) aarkerio: no necesitamos vista para el delete
(13:54:54) aarkerio: todos ya tienen registros en su modelo Entry?
(13:55:14) aarkerio: alguno se atoró o hay dudas?
(13:55:39) ramanugan: nop... hasta el momento voy bien
(13:55:41) doclinux: sip me atore un poco y voy atrasado, pero ahi voy
(13:56:46) aarkerio: algo importante que mencionar encuanto a los modelos es que hay que evitar hacer relaciones bidireccionales
(13:57:00) monouser649206 [n=monouser@190.56.140.14] ha entrado en la sala.
(13:57:12) aarkerio: es decir si ya definimos que Entry hasMany Comment
(13:57:43) aarkerio: no hay que poner belongsTo = Entry en el modelo Comment
(13:58:08) ramanugan: ha-aa Dios por que ??
(13:58:28) aarkerio: porque sino se hace una recursión y se carga un chingo la memoria y las páginas se hace más lentas
(13:58:52) ramanugan: ok...
(13:58:58) aarkerio: si necesitan ir por datos del model Comment hagnlo através del modelo Entry:
(13:59:14) aarkerio: $Entry->Comment->findAll()
(14:00:48) aarkerio: para los que ya tienen datos en Entry ahora si vamos por nuestro layout para el blog:
(14:00:49) aarkerio: http://www.mononeurona.org/scripts/cake/blog.ctp.txt
(14:01:50) aarkerio: para este layout necesitarán las hoja de estilo:
(14:01:52) aarkerio: http://www.mononeurona.org/scripts/cake/estilos.css
(14:03:17) aarkerio: descomenten $this->layout del método display() y ya podrán ver su estilo
(14:03:35) aarkerio: también podrán ver la lista de entradas de su blog
(14:04:13) aarkerio: pausa de cinco minutos para ir por café
(14:04:32) Fulano: ok
(14:04:37) Fulano: por que ya me hablaron y me perdi
(14:05:11) Fulano: quien va al corriente?
(14:05:42) alimon ha salido de la sala (quit: "alimon has no reason").
(14:06:00) monouser649206 ha salido de la sala (quit: "Ahi se ven!").
(14:09:46) ramanugan: yo voy al corriente
(14:10:14) Fulano: y los demas?
(14:10:35) ramanugan: buena pregunta
(14:10:46) Fulano: yo me atraze y me perdi :(
(14:11:07) Fulano: todo por que me vinieron a preguntar de una impresora :'(
(14:11:10) ramanugan: no os apureis... el log lo van a publicar
(14:11:20) ramanugan: eso creo
(14:11:54) Fulano: si si lo haran
(14:12:01) Fulano: de donde eres?
(14:13:09) ramanugan: de mexico
(14:13:11) ramanugan: y tu ?
(14:13:37) Fulano: oax, mexico
(14:14:39) aarkerio: bueno ya sólo nos falta ver lo del logeo
(14:14:52) ramanugan: yuju ''''
(14:14:56) monouser611312 ha salido de la sala (quit: "Ahi se ven!").
(14:15:06) aarkerio: vamos a ver un archivo que es app/app_controller.php
(14:15:50) aarkerio: este archivo sirve para definir métodos y atributos que deseamos en TODOS los controladores
(14:16:56) aarkerio: entonces en este archivo vamos a usar y configurar el componente Auth
(14:17:07) aarkerio: que es el que define qué usuarios pueden ver qué metodos
(14:17:14) aarkerio: vamos por el archivo:
(14:17:15) aarkerio: http://trac.mononeurona.org/karamelo/browser/trunk/app/app_controller.php
(14:17:30) aarkerio: hasta bajo hay un link "Plain Text"
(14:17:42) aarkerio: que lo abre en gedit y lo guardamos en app/
(14:18:24) aarkerio: en est archivo tenemos unh método public function beforeFilter() que es esepcial en los controladores de Cake
(14:18:54) aarkerio: este métod se ejecuta ANTES que cualquier otro, antesd que display() o admin_add() o admin_listing
(14:19:16) aarkerio: en este archivo cargamos los componentes que queremos en toda la aplicación
(14:19:24) aarkerio: public $components = array('Auth', 'Cookie', 'Session');
(14:19:47) aarkerio: y ya no tenemos que ponerlos en cada controlador, lo mismo con los helpers
(14:19:54) aarkerio: public $helpers = array('Html', 'Form', 'Session');
(14:20:26) aarkerio: antes de continuar con Auth se me olvidaba algo
(14:20:44) aarkerio: en el archivo app/config/routes.php
(14:21:14) aarkerio: se define el controaldor/método que son el "home" de la aplicación
(14:21:40) aarkerio: en este archivo tienen:
(14:21:42) aarkerio: Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
(14:22:33) aarkerio: pero ahora que tenemos "entries/display" y ese debería ser el home de nuestro blog
(14:22:41) aarkerio: entonces cambiamos esa linea por
(14:22:54) aarkerio: Router::connect('/', array('controller' => 'entries', 'action' => 'display'));
(14:23:24) aarkerio: y ya entonces httpo://localhost:3000 muestra las entradas de nuestro blog
(14:23:37) aarkerio: se entiende?
(14:24:26) ramanugan: perfecto !!
(14:24:42) aarkerio: bueno volvamos a Auth y app_controller.php
(14:25:05) aarkerio: como deciamos beforeFilter define a Auth, veamos la configuración:
(14:25:08) aarkerio: $this->Auth->fields = array('username' => 'email', 'password' => 'pwd');
(14:25:21) aarkerio: define que campos de la base de datos son el login/password
(14:25:30) aarkerio: en este caso el email y el pwd
(14:25:42) aarkerio: $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
(14:26:06) aarkerio: donde redirecciona luego del login exitoso, en nuestroi caso debería ser:
(14:26:35) aarkerio: no, no, ese está bien
(14:26:54) aarkerio: ahorita creamos la vista login.ctp para el logeo
(14:27:03) aarkerio: luego tenemos :
(14:27:04) aarkerio: $this->Auth->loginRedirect = array('controller' => 'news', 'action' => 'display');
(14:27:12) aarkerio: nuestro caso:
(14:27:21) aarkerio: $this->Auth->loginRedirect = array('controller' => 'entries', 'action' => 'display');
(14:27:54) aarkerio: tenemos $this->Auth->deny('*'); es decir que TODOS los métodos están prohibidos por default
(14:28:13) aarkerio: la indicación $this->Auth->authorize = 'controller';
(14:29:16) aarkerio: señalla que cada controlador definirá sus permisos con el método beforeFilter() y con isAuthorized()
(14:30:38) aarkerio: vamos a necesitar el users_controller.php :
(14:30:39) aarkerio: http://www.mononeurona.org/scripts/cake/users_controller.php.txt
(14:32:29) Fulano ha salido de la sala (quit: "Ahi se ven!").
(14:32:30) aarkerio: una vez definido el Auth component en app_controller.php si queremos ver /entries/display veremos que Cake ya no nos deja
(14:32:53) aarkerio: y nos envia a /users/login
(14:33:29) aarkerio: necesitamos agregar un método al controlador entries_controller.php
(14:33:31) aarkerio: public function beforeFilter()
(14:33:31) aarkerio: {
(14:33:31) aarkerio: parent::beforeFilter();
(14:33:31) aarkerio: $this->Auth->allow(array('display','view'));
(14:33:31) aarkerio: }
(14:34:12) aarkerio: esté método beforeFilter en el controlador define que los métoso display y view pueden ser ejecutados por cualquiera
(14:36:09) aarkerio: necesitamos crear el directorio app/view/users
(14:36:15) aarkerio: y ahi colocar la vista:
(14:36:17) aarkerio: http://www.mononeurona.org/scripts/cake/login.ctp.txt
(14:37:53) aarkerio: si movieron el Salt no podrán logearse, coloquen el debug en 2, vean la comparación de strings y actualizen su base de datos con ese valor:
(14:38:34) aarkerio: UPDATE users SET pwd='la_cadena_hash_aqui';
(14:38:41) aarkerio: se entiende ?
(14:40:20) aarkerio: es decir la cadena que tienen en pwd de la tabla users ya no tendrá el mismo hash
(14:40:34) aarkerio: se pudo?
(14:50:06) ramanugan: si... y los demas ?
(14:50:18) ramanugan: si se pudo..!
(14:50:21) ramanugan: y los demas ?????
(14:52:37) doclinux: yo me quede atrasado y ya no pude seguir, voy a revisar el log y les platico que tal me fue :-(
(14:52:57) aarkerio: creo que ya sólo quedamos tu y yo ramanugan , estás desarrolland algo en Cake en tu chamba?
(14:53:38) ramanugan: si he hecho varias cosas
(14:53:49) ramanugan: pero siempre he usado la version estable
(14:54:08) ramanugan: jejejeje
(14:54:43) doclinux: pues yo estoy tratando de crear un simple CRUD para control de documentos pero me pierdo con los singulares y plurales
(14:54:44) ramanugan: no me he animado a poner en produccion la version 1.2
(14:54:46) ramanugan: de cake
(14:55:03) ramanugan: hazlo en espaniol
(14:55:28) ramanugan: hay un archivo que se llama inflections.php
(14:56:06) ramanugan: ahi castellanizar los nombre de los modelos
(14:56:08) aarkerio: si yo empecé con la 1.2 porque era noviembre y pensaba que por mayo ya estaría, pero se han tardado un poco más
(14:57:17) ramanugan: asi es...
(14:57:25) aarkerio: doclinux, estás subiendo docs al server?
(14:58:27) doclinux: no
(14:58:58) doclinux: ??
(14:59:44) doclinux: los documentos son PDFs XLSs :-( y DOCs en carpetas por anio
(15:00:02) doclinux: controlados por la aplicación cake
(15:00:57) doclinux: ya le eche un ojo al inflection.php, gracias
(15:01:02) aarkerio: y en que te estás atorando?
(15:02:30) doclinux: en que la base de datos tiene varias tablas (tipo de docto) (tema, subtema etc) y en el alta solo me aparece el id y no el campo de descripción de tema subtema etc)
(15:03:58) ramanugan: puedes pegar tu modelo y la vista de (tipo de docto) ....?
(15:04:22) ramanugan: solo la vista del add
(15:05:52) aarkerio: es 1.1 o 1.2?
(15:05:55) doclinux: no la tengo a la mano, porque estoy desde una lap fuera de la red de la chamba :-( en la chamba esta muy restringido el acceso al exterior, luego te la mando pá ver si puedes echarme una mano >:-)
(15:06:09) ramanugan: okas...
(15:06:37) doclinux: es 1.1
(15:07:16) aarkerio: 0k, parece que ya no hay quorum
(15:07:30) ramanugan: a que te refieres ?
(15:07:31) doclinux: parece
(15:07:38) aarkerio: then I will go to eat something, bye!
(15:07:45) ramanugan: espera
(15:07:52) doclinux: tres horas es un buen
(15:07:54) ramanugan: yo tambien tengo hambre
(15:07:57) doclinux: okas
(15:08:04) ramanugan: pero no vas aclarar las dudas ?
(15:09:52) aarkerio: sure, cuáles dudas?
(15:11:11) doclinux: pos yo ya me voy, gracias Manuel y ramanugan ;-)
(15:11:19) ramanugan: ok...
(15:11:34) ramanugan: gracias por la expocision
(15:11:43) ramanugan: muy buena... excelente
(15:13:32) aarkerio: sale, que estés bien ramanugan , nos estamos leyendo
(15:13:43) ramanugan: ok
(15:13:46) ramanugan: =

Permalink: http://www.mononeurona.org/users/entry/saidjose/1351


Comments Comentblogs:
1.- blacksoul blacksoul wrote:

Gracias por el log saidjose!

2008-05-23 20:15:16-05
2.- asarch asarch wrote:

¡Dios te lo de en hijos!

2008-05-23 21:07:18-05
3.- cibat cibat wrote:

cuantos hijos valdrá un log? mmm, o mejor dicho, cuantos logs valdran un hijo ? :P

2008-05-23 21:17:15-05

New Comentblog

Captcha



Login



Remember me:
saidjose
Said Tamez Lorenzana
33 años.
Proyecto de Ingeniero Ambienta de la Universidad Autónoma de Tamaulipas, México.
Entusiasta del software libre en cualquier sistema. Aficionado a CIV III y cuando no estoy jugando, me gusta perder el tiempo leyendo todo lo relacionado a Linux, BSD y software libre de windows. Soy papa de un hermoso niño de tres meses, sigo pensando que el café y el te son las mejores bebidas que Dios le dio al mundo.

cars education environment hacking music arts
Powered by:
Despabilando la MonoNeurona.org
Livechat

<-Nombre
teosho wrote:
el medio ambiente, sobre el manejo de residuos. Qué tal esta el campo actualmente? Me conviene estudiar en México o en extranjero?
on 21/10/07

teosho wrote:
Oye, que tal. Estoy por terminar la carrera de Ingenieria Química y estoy interesado estudiar una maestria aplicada en
on 21/10/07

¿Qué estuve haciendo?
Comiendo unas barritas y tomando cafe, mientras leo la pagina de la Mononeurona
1 hour, 23 minutes ago
Viendo el video de Hug a Developer
4 days, 2 hours ago
Cerrando el changarro, nos vemos mas tarde
5 days, 20 hours ago
Tendre que leer a Stephen Hauwkin para entender lo del micro hoyo negro
1 week, 2 days ago
Seria fantastico que se posteara algun manual sobre
1 week, 6 days ago
recarga de cartuchos
1 week, 6 days ago
Nel es traficante de cafe y te
2 weeks, 2 days ago
Nel Mandrake da soporte técnico
2 weeks, 3 days ago
Tomando una taza de cafe negro, tengo mucho sueño
3 weeks ago
Se antoja el pollo con brocoli, otras verduaras salteadas en mantequilla Hum
3 weeks, 2 days ago
Galerias
FirefoxjEdit.orgGimpOpenOffice.orgHacker
Top
Colectivo MonoNeurona.org © 2002-2008.