2km Workshop: Desenvolvimento ágil com o CakePHP

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    1 Group

    2km Workshop: Desenvolvimento ágil com o CakePHP - Presentation Transcript

    1. Workshop 1: Desenvolvimento ágil com o CakePHP Uma introdução ao framework CakePHP e suas contribuições para o desenvolvimento ágil.
    2. Agenda Apresentação   Motivação   Desenvolvimento ágil   Princípios de desenvolvimento ágil   Recursos ágeis do CakePHP   O padrão MVC   O padrão ORM   Validações   Aplicação exemplo (Ajax blog)   Como aproveitar melhor tudo isso?   Agradecimentos  
    3. Agenda
    4. Apresentação A 2km é uma empresa mineira especializada no   desenvolvimento ágil de soluções para web utilizando software livre. +20 projetos utilizando o CakePHP nos últimos 12   meses. Desenvolveu projetos para empresas e organizações como   Record Minas, PMDB-MG, Orca veículos entre outras.
    5. Apresentação Carlos Pires (Cadu) é bacharel em ciência da computação.   Desenvolve e é apaixonado pela web e por software livre desde 1999. Trabalhou com Java(JEE) por mais de 6 anos em diversas empresas da capital mineira. Ultimamente tem se dedicado ao CakePHP e à jQuery. Quando não está andando de bike, está estudando línguas (inglês e espanhol), curtindo um samba de raíz ou tomando uma cervejinha com os amigos. Daniel Golgher é tecnólogo em Processamento de Dados, Bacharel em   Sistema de Informação e Especialista em Engenharia de Software. Desenvolve em PHP desde 2001. Gosta de software livre, especialmente dos projetos: CakePHP, FreeBSD, MySQL, Apache, PHP, Python dentre outros. Nas horas vagas vai ao cinema com a namorada e passeia com o Baco (São Bernardo).
    6. Agenda
    7. Motivação Divulgar o framework CakePHP   Divulgar os novos cursos da 2km   Retribuir à comunidade de software livre   Combater o código 'espaguete'   Mostrar que programar pode ser divertido!  
    8. Agenda
    9. Desenvolvimento ágil Estórias de usuário   Programação em Pares   Programação orientada ao teste (TDD)   Refatoração (Refactoring)   Reunião em pé (Stand up meeting)   Sprints  
    10. Agenda
    11. Princípios do desenvolvimento ágil COC – Convention Over Con guration   DRY - Don't Repeat Yourself   KISS - Keep It Short and Simple or Keep It Simple Stupid   SoC - Separation of Concerns   YAGNI - You Ain't Gonna Need It  
    12. Agenda
    13. Recursos ágeis do CakePHP MVC [CoC e SoC]   ORM [CoC]   Validação [DRY e KISS]   Testes unitários (SimpleTest) [TDD]   Helpers, Components e Behaviors [DRY]   Geração de código (Bake) [Productivity]  
    14. Agenda
    15. Código espaguete? <div style='display:<?=$valor?$tipo1:$tipo2; ?>'> <? if($flag == 0){ ?> <script> var a = [<?=implode(',',$lista)?>]; <? $SQL = \"SELECT * FROM clientes WHERE 1 ORDER BY data ASC LIMIT 1 OFFSET 1 \" ?> <? }else{ ?> <b> entroh aqui flag= <?=$flag //debugue ?> </b> <? $SQL = \"SELECT * FROM clientes WHERE \".$cond.\" ORDER BY data ASC LIMIT 1 OFFSET \". $flag ?> <script> // var a= [<?=implode(',',$lista_)?>]; <? } ?> // debugue alert(a); <<?php echo '/'.\"script\"; // kuIDaDeNHo c/AxXx bAhRRaxXXxx ?>> </div> Fonte: http://desciclo.pedia.ws/wiki/PHP
    16. Código MVC <?php //Arquivo da Classe de Modelo class Usuario extends AppModel { var $name = 'Usuario'; var $displayField = 'nome'; } ?> models/usuario.php <?php //Arquivo da Classe de Controle class UsuariosController extends AppController { function teste($grupo_id=null){ $usuarios=$this->Usuario->find('list',array('conditions'=>array('grupo_id'=>$grupo_id))); $this->set(compact('usuarios')); } } ?> controllers/usuarios_controller.php <?php //Arquivo da Classe de Visão $form->create('Usuario',array('action'=>'teste')); $form->input('usuario'); $form->end('Enviar'); ?> views/usuarios/teste.ctp
    17. Código em uma camada? <?php $conn = mysql_connect('localhost','root','senha'); mysql_select_db('meu_banco',$conn); $query = 'SELECT id,nome FROM usuarios WHERE grupo=\"'.$_POST['grupo_id'].'\"'; $result = mysql_query($query); ?> <html> <head>...</head> <body> <form action=\"teste.php\"> Selecione o usuário: <select name='usuario'> <?php while($row = mysql_fetch_row($result)){ echo\"<option id=\".$row[0].\">\".$row[1].\"</option>\"; } ?> </select> <input type='submit'> </form> </body> </html> Exemplo de código em uma camada
    18. Agenda
    19. O padrão ORM 1 2 4 3 Tabelas e relacionamentos
    20. O padrão ORM <?php class Produto extends AppModel { 1 var $name=\"Produto\"; 2 var $hasOne = array('Descricao'); var $hasAndBelongsToMany = array('Usuario'); 3 var $belongsTo = array('Categoria' => array( 'className' => 'Categoria', 'foreignKey' => 'categoria_id') 4 ); var $hasMany = array('Comentario' => array( 'className' => 'Comentario', 'foreignKey' => 'comentario_id', 'dependent' => false, 'conditions' => '', 'fields' => '', 'order' => '', 'limit' => ’’ ) ); } ?> Classe do modelo Produto com os relacionamentos
    21. Agenda
    22. Validações var $validate = array( 'login' => array('isUnique' => array( 'rule'=>'isUnique', 'message'=>'Este e-mail já existe na base de dados.'), 'email' => array( 'rule' => 'email', 'message' => 'O campo E-mail deve ser um email válido') ), 'senha' => array( 'rule' => array( 'confirmaSenha', 'senha'), 'message' => 'O campo senha e a confirmação da senha não conferem' ), 'confirma_senha' => array( 'rule' => 'alphanumeric', 'required' => true, 'message'=>'O campo confirmação da senha é obrigatório', 'on'=>'create' ), 'nome' => array( 'rule' => array('between', 2, 64), 'message' => 'O campo nome deve possuir de 2 a 64 caracteres') ); function confirmaSenha($data) { return $data ['senha'] == $this->data ['Usuario'] ['confirma_senha']; } models/usuario.php
    23. Agenda
    24. Aplicação Exemplo: Ajax blog CREATE TABLE `posts` (
 `id` int(10) unsigned NOT NULL auto_increment,
 `title` varchar(50) default NULL,
 `body` text,
 `created` datetime default NULL,
 `updated` datetime default NULL,
 PRIMARY KEY (`id`),
 KEY `title` (`title`)
 ) ENGINE=MyISAM DEFAULT CHARSET=latin1 Estrutura da tabela posts da aplicação exemplo
    25. Ajax blog: Con guração do banco <?php class DATABASE_CONFIG { var $default = array( 'driver' => 'mysql', 'connect' => 'mysql_connect', 'host' => 'localhost', 'login' => 'root', 'password' => 'passwd', 'database' => 'test', 'prefix' => '' ); } ?> Arquivo de con guração do banco: con g/database.php
    26. Ajax blog: Camada de modelo <?php class Post extends AppModel { var $name = 'Post'; } ?> Classe de modelo da tabela posts: models/post.php
    27. Ajax blog: Camada de controle <?php class PostsController extends AppController { var $name = 'Posts'; var $layout = 'ajax_blog'; var $helpers = array ('html', 'javascript', 'ajax', 'time' ); function index() { $this->set ( 'data', $this->Post->find ( 'all' ) ); } function view($id) { $this->layout = 'ajax'; $this->set ( 'data', $this->Post->read (null,$id) ); } function delete($id = null) { if (isset ( $id )) { $id = substr ( $id, 5 ); } $this->Post->del ( $id ); $this->set ( 'data', $this->Post->find ( 'all' ) ); $this->render ( 'list', 'ajax' ); } function add() { if (! empty ( $this->data )) { if ($this->Post->save ( $this->data )) { $this->set ( 'data', $this->Post->find ( 'all' ) ); $this->render ( 'list', 'ajax' ); } } else { $this->render ( 'add', 'ajax' ); } } } ?> Classe de controle dos posts: controllers/posts_controller.php
    28. Ajax blog: Layout padrão <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/ xhtml1-transitional.dtd\"> <html xmlns=\"http://www.w3.org/1999/xhtml\"> <head> <title>CakePHP :: Ajax Blog :: <?php echo $title_for_layout?></title> <?php echo $html->charset(); ?> <?php echo $javascript->link(array('prototype','scriptaculous','zebra_tables')); ?> <?php echo $html->css('css'); ?> </head> <body> <div id=\"container\"> <center><h2>Cake Framework AJAX Demo</h2></center> <div id=\"content\"> <?php echo $content_for_layout?> </div> <div id=\"pb-cake\"> <a href=\"http://www.cakephp.org/\" class=\"simple\"> <?php echo $html->image('cake.power.png',array( 'width'=>\"80\", 'height'=>\"15\", 'alt'=>\"CakePHP :: A Rapid Development Framework\", 'border'=>\"0\")); ?> </a> </div> </div> </body> </html> Layout padrão dos posts: views/layouts/ajax_blog.ctp
    29. Ajax blog: View da index <form action=\"/posts/search\"> <p> <?php echo $html->image('magnify.png', array('alt'=>'Magnify Icon')); ?> <b>Live Search:</b> <input type=\"text\" name=\"livesearch\" id=\"livesearch\" size=\"40\"> <?php echo $html->image('spinner.gif', array('alt'=>'Spinner', 'id'=>'search_spinner', 'style'=>'display:none;')); ?> </p> </form> <?php echo $ajax->observeField('livesearch', array( 'update'=>'post_table', 'url'=>\"/posts/search\", 'frequency'=>1, 'loading'=>\"Element.show('search_spinner');\", 'complete'=>\"Element.hide('search_spinner');stripe();\") ); ?> <div id=\"wastebin\" class=\"wastebin\"> <center><b>Drag the post's title right here.</b></center> <div> <p id=\"indicator\"> <?php echo $html->image('spinner.gif', array('alt'=>'Indicator')); ?> Deleting ... </p> </div> </div> <?php echo $ajax->dropRemote('wastebin', array('accept'=>'title', 'hoverclass'=>'wastebin-active'), array('url'=>'/posts/delete/', 'with'=>'{id:element.id}', 'update'=>'post_table', 'loading'=>'Element.show(\\'indicator\\')', 'complete'=>'Element.hide(\\'indicator\\');stripe();' )); ?> ... Layout da view da index: views/posts/index.ctp
    30. Ajax blog: Elemento da listagem dos posts <td> <div class=\"title\" id=\"post_<?php echo $post['id'];?>\"> <?php echo $html->image('document.gif', array('alt'=>'MagnifyIcon')); ?> <?php echo $post['title']; ?> </div> <?php echo $ajax->drag('post_'.$post['id'], array('revert'=>'true')); ?> </td> <td><?php echo date(\"d/m/Y\", strtotime($post['created'])) ?> </td> <td> <?php echo $ajax->link('View',\"/posts/view/{$post['id']}\", array('fallback'=>'#view', 'update'=>\"post_content\", 'complete'=>\"new Effect.Appear('post_content');\")) ?> | <?php echo $ajax->link('Edit', \"/posts/edit/{$post['id']}\", array('fallback'=>'#edit', 'update'=>\"add_post\", 'complete'=>\"new Effect.Appear('add_post');\")) ?> | <?php echo $ajax->link('Delete', \"/posts/delete/{$post['id']}\", array('fallback'=>'#list', 'update'=>\"post_table\", 'complete'=>\"stripe();\")) ?> </td> Elemento da listagem dos posts: views/elements/ajax_posts_lists.ctp
    31. Agenda
    32. Como aproveitar melhor tudo isso? Fazendo os cursos de desenvolvimento web que a 2km interativa! está lançando:  Curso de CakePHP (Curso mais completo do CakePHP no Brasil - 60 horas) Curso de jQuery (Abordando as novidades da versão   1.3. Em breve) Curso de Padrões Web (em breve)  
    33. Agenda
    34. Agradecimentos Agradecemos a presença de todos neste sábado e esperamos vê-los nos próximos workshops! Dúvidas, críticas, sugestões e doações para: Carlos Pires (e-mail: carlos.pires@2km.com.br / Twitter: @cadu) Daniel Golgher (e-mail: daniel@2km.com.br / Twitter: @golgher) http://www.2km.com.br

    + Carlos PiresCarlos Pires, 7 months ago

    custom

    1389 views, 0 favs, 0 embeds more stats

    Slides do primeiro workshop gratuito da 2km interat more

    More info about this document

    CC Attribution License

    Go to text version

    • Total Views 1389
      • 1389 on SlideShare
      • 0 from embeds
    • Comments 0
    • Favorites 0
    • Downloads 48
    Most viewed embeds

    more

    All embeds

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as inappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel
    File a copyright complaint
    Having problems? Go to our helpdesk?

    Categories

    Groups / Events