<?xml version="1.0" encoding="ISO-8859-1" ?>
<rss version="2.0">
    <channel>
        <title>Digitalminds Blog</title>
        <link>http://www.digitalminds.com.br</link>
        <description>Tecnologia, cultura e um monte de papo furado.</description>
        <language>pt-br</language>
        <copyright>Alguns direitos reservados.</copyright>
        <image>
            <title>digitalminds.com.br</title>
            <url>http://www.digitalminds.com.br/images/logo.gif</url>
            <link>http://www.digitalminds.com.br</link>
        </image>
        <lastBuildDate>Thu, 03 Jul 2008 17:58:21 -0700</lastBuildDate>
        <ttl>20</ttl>
                    <item>
                <title>32Bits contrata (de novo)!</title>
				
				<link>http://www.digitalminds.com.br/posts/3446</link>				
                <description>Olá pessoal. Voltei do silêncio para divulgar mais umas vagas... Minha empresa, a 32Bits™ Criações Digitais está crescendo mais um pouquinho, e estamos contratando dois estagiários com conhecimentos de (x)HTML e css, além de um webdesigner júnior. Pros estagiários, nossas exigências são simples: tem que ser esperto, e tem que gostar de aprender coisas novas. Html e Css são os conhecimentos básicos e essenciais, e outros, especialmente Actionscript, são muito desejáveis. Para a vaga de webdesigner, procuramos alguém que curta a estética web 2.0, e que também seja capaz de programar.Currículos para contato[arroba]32bits.com.br aos meus cuidados, ok? Também é importante ter algum trabalho online pra gente dar uma olhadinha no código. P.S. Nossa empresa fica no centro do Rio, ao lado do metrô Cinelândia e do cinema Odeon. </description>
                <pubDate>Mon, 28 Apr 2008 10:21:56 -0800</pubDate>
            </item>
                    <item>
                <title>Muito trabalho, um mba e mais um infinito de coisas</title>
				
				<link>http://www.digitalminds.com.br/posts/3439</link>				
                <description>Pessoal, não tenho aparecido muito por aqui ultimamente - nossa série está novamente emperrada, com jeito de que não vai sair do lugar. Dessa vez, foram vários motivos: trabalho, mais trabalho, um mba e mais um infinito particular de coisas, incluindo a terceira temporada de Lost. Se eu prometer que a série vai continuar em breve, vocês ainda acreditam? O plano é esse, o problema é o tempo. Antes que vocês apareçam lá em casa com seus ancinhos e picaretas para o linchamento, já peço paciência novamente e uma boa dose de compaixão para com este seu autor. </description>
                <pubDate>Tue, 25 Mar 2008 09:06:44 -0800</pubDate>
            </item>
                    <item>
                <title>O Zen e a arte cavalheiresca da programação orientada a objeto (Parte 22)</title>
				
				<link>http://www.digitalminds.com.br/posts/3421</link>				
                <description>                  O Zen e a arte cavalheiresca da programação orientada a objeto (Parte 22)Para ver os artigos anteriores desta série, clique aqui.Olá amigos. Estamos de volta depois de muita farofa, bacalhau, doce de leite, maionese, pamonha, queijo cavalinha, uma nova geladeira que não chega, livros e muita alegria. Espero que todos tenham passado dias maravilhosos nesse fim-de-ano e que possam ter aproveitado esses dias pra curtir a família e os amigos!Mas chegou a hora de voltar para o batente. Antes que vocês comecem a mandar os já tradicionais emails "Cadê o 22! Queremos o 22!" eu já estou escrevendo mais um capítulo desta série singela, que procura explicar os conceitos mais enrolados de orientação a objetos em uma linguagem que todos aqui possam facilmente entender. E, pra ser bem honesto, os emails cobrando o 22 na verdade já começaram a chegar, então a hora é essa. Não estou reclamando de vocês de forma alguma, caros leitores! A pressão ajuda! Obrigado a todos que cobram, que agradecem, que mandam correções e puxões de orelha, sua contribuição faz disso aqui um lugar melhor.Ah, o Natal. Que loucura que é o Natal. Falar sobre oop aqui no Digitalminds sempre é divertido porque eu tenho que bolar metáforas interessantes pra que o assunto não fique chato no primeiro parágrafo.&amp;nbsp; Então, como não poderia deixar de ser, o artigo de hoje está em clima de Natal. Não, eu não estou maluco, eu sei que o Natal já passou. Mas a segunda semana de janeiro não tem muita coisa interessante pra nos oferecer, a não ser que você conte o Dia de Reis. O DIA DE REIS! É isso! Meu Deus como pude esquecer! Muito bem, senhores, esqueçam o natal. É hora de falar de Belchior (ou Melchior), Gaspar e Baltazar. Não, senhores, não estamos falando de Belchior, nem de Gaspar, ou mesmo de Baltazar. Estamos falando de três magos persas, sacerdotes de Zaratrustra, homens sábios que conheciam profundamente a astrologia e que vislumbraram um sinal - na noite do dia 25 de dezembro do ano 1, souberam pelo brilho da estrela de Belém que um Rei nascera. E para comprovar que a wikipedia é sempre uma diversão, veja este parágrafo:A melhor descrição dos reis magos foi feita por São Beda, o Venerável (673-735), que no seu tratado “Excerpta et Colletanea” assim relata: “Melchior era velho de setenta anos, de cabelos e barbas brancas, tendo partido de Ur, terra dos Caldeus. Gaspar era moço, de vinte anos, robusto e partira de uma distante região montanhosa, perto do Mar Cáspio. E Baltazar era mouro, de barba cerrada e com quarenta anos, partira do Golfo Pérsico, na Arábia Feliz”. Uau. Sábios, caldeus, Ur, Pérsia. Agora que consegui a atenção total e irrestrita de vocês, futuros reis magos da OOP, e cobri todos de Incenso e Mirra, é hora de falar de uma classe importantíssima que ficou faltando no nosso grande esquema das coisas: a venerável classe ModelCollection.Lembram que optamos por simplificar as funcionalidades da classe Model, fazendo com que ela realizasse operações somente em registros únicos no banco de dados? Muito bem, senhores, a classe ModelCollection aparece para nos salvar nos casos em que precisamos trabalhar com conjuntos de registros. Aqui é bom repetir o aviso: esta implementação é diferente da utilizada nos frameworks que utilizam o pattern ActiveRecord, como o Cake. Nestes frameworks todas as operações com registros e conjuntos de registros são feitas pela classe Model e suas subclasses. Assim, um objeto da classe model típico destes frameworks tem funções tanto para buscar, editar, salvar e deletar um registro quanto para buscar conjuntos de registros. Isso faz com que o objeto da classe que estamos usando não tenha um mapeamento direto com os dados que estão no banco. Isso me incomoda muito, pois eu gosto de pensar no objeto como uma coisa, uma representação virtual dos dados que estão no banco. Pra mim é estranho usar o modelo para retornar uma lista de registros. A nossa implementação vai claramente mapear um registro no banco a um objeto da classe correspondente, e um conjunto de registros a uma coleção de objetos da classe correspondente. Exemplo: nossa classe Post. Teremos no banco a tabela Posts, com os campos title e text, por exemplo. Para acessar e alterar&amp;nbsp; o campo de título de um post em nosso framework vamos seguir os seguintes passos:Criar um novo objeto da classe Post fazendo $post = new Post();Carregar os dados do registro que queremos alterar com id número $id&amp;nbsp; usando $post->loadById($id);Mudar o título usando $post->setTitle("Novo Título!");Salvar o post com $post->save();Para criar um novo post, é simples:Criar um novo objeto da classe Post fazendo $post = new Post();Mudar o título usando $post->setTitle("Título do Novo Post!");Mudar o texto usando $post->setText("Texto do Post!");Salvar o post com $post->save();Nessa implementação vamos poder acessar as variáveis do objeto usando getters normalmente, por exemplo, $post->getTitle(); Podemos também criar vários atalhos: o construtor do Post pode receber&amp;nbsp; o Id diretamente e já carregar os dados automaticamente. Podemos implementar a interface ArrayAccess para permitr coisas como print $post['title'] sem nenhuma dificuldade. Enfim. A coisa é boa. Aguardem que vem coisa ótima por aí.Mas até aí, nenhuma novidade. O que muda é a forma de trabalhar com conjuntos de dados. No Cake, esse trabalho seria feito por funções na classe Post que retornariam Arrays contendo vários ítens. E isso deixa tudo confuso, no final das contas. O que proponho é o seguinte:Criar um novo objeto da classe PostCollection fazendo $collection = new PostCollection();Carregar o conjunto de registros usando uma das várias funções disponíveis, por exemplo $collection->loadAll();Muito simples. E agora temos um objeto da classe PostCollection carregado de registros, com métodos super úteis para manipular os dados, paginar, enfim, uma belezinha. E vamos implementar uma coisa sensacional: a interface iterator, disponível na fantástica biblioteca SPL, proveniente de UR, na Pérsia! Mas isso já é assunto para o próximo episódio. Até lá!</description>
                <pubDate>Wed, 09 Jan 2008 11:15:42 -0800</pubDate>
            </item>
                    <item>
                <title>O Zen e a arte cavalheiresca da programação orientada a objeto (Parte 21)</title>
				
				<link>http://www.digitalminds.com.br/posts/3409</link>				
                <description>Para ver os artigos anteriores desta série, clique aqui. Olá amigos. Em nosso último encontro finalizamos nossa primeira análise das classes principais do MVC: Model, View e Controller. Sei que muitos de vocês estão ansiosos para começar a codificar mas ainda temos bastante mufa pra queimar antes de começar a digitar código php!Bom, pra começar, um pouco da história do cinema: quem não se lembra de Sean Connery como o policial irlandês em Os Intocáveis ? E de Kevin Spacey, como o bobalhão "Verbal" em Os Suspeitos ? E de Gene Hackman como o xerife mau, muito mal de Os Imperdoáveis ? Muito bem, o que esses três papéis interpretados por estes grandes atores têm em comum? As três interpretações foram premiadas com Oscars de melhor ator coadjuvante. E por quê todo este papo cinematográfico? É que hoje vamos falar de uma classe coadjuvante que é fundamental em nosso quase-framework: nosso amigo Dispatcher.Muito bem, como já falamos algumas vezes, nosso framework é bastante esperto: ele vai permitir que acessemos métodos de nossos controllers simplesmente interpretando uma URL. Por exemplo, para acessar o método view() do controller BlogPost para ver o post com o id 19 nossa url seria http://nossoblog.com.br/blogpost/view/19Ok, mas quem transforma uma coisa na outra? Quem chama o que? Como isso funciona na prática?Senhores, eu vos apresento a classe Dispatcher, encarregada de interpretar as urls de nossa aplicação e executar os métodos apropriados nos controllers corretos. Ela também vai checar se o controller e o método requisitados realmente existem, e vai apresentar mensagens de erro em caso negativo. Por fim, a classe vai separar corretamente os parametros do request, enviando um array já certinho para o método que foi chamado.
Uma outra função muito interessante de nossa classe Dispatcher vai ser interpretar extensões; sim, amigos, vamos fazer com que a extensão definida na url defina o layout e o template a ser utilizado, seguindo uma estrutura de arquivos pré-determinada. Exemplo: se ao invés da url acima tivessemos alguma coisa como http://nossoblog.com.br/blogpost/view/19.xmlNosso framework, ao invés de utilizar o layout em /layouts/default/blogpost/view.php e o template /templates/default/blogpost/view.php utilizaria o layout /layouts/xml/blogpost/view.php e o template /templates/xml/blogpost/view.php. Deu pra sacar o poder? Assim vc pode criar outputs diferentes pra toda a sua aplicação sem nenhum estresse. Bonito demais. Pra colocar o sistema disponível em wap, bastaria fazer um layout e um template, no caso /templates/wml/view.php e /layouts/wml/view.php e utilizar os códigos wml ao invés de html dentro deles. Eu adoro isso.Você acaba de perceber a beleza de uma solução MVC. A lógica fica totalmente separada da apresentação, o que faz com que seja fácil fazer apresentações totalmente diferentes com o mesmo conteúdo. Sweet!Vamos então à descrição da classe? Class Dispatcher
Propriedades$urlString. Propriedade que irá conter a url requisitada.$controllerObjeto do tipo Controller. Esta propriedade irá conter uma nova instância do controller requisitado. No nosso exemplo, BlogPost.$methodString. Método a ser executado no controller requisitado. O método será view(), no nosso exemplo.$parametersArray com os parâmetros enviados na requisição via get ou post. No exemplo acima, ele teria uma entrada $parameters["default"]=>"19" já que não nomeamos este parâmetro no request. Poderíamos, se nós fossemos chatos, ter montado a url assim: http://nossoblog.com.br/blogpost/view/id/19
e aí nosso array seria montado na forma $parameters["id"]=>"19"O framework vai ser esperto o suficiente pra perceber quando temos só o valor ou o par nome/valor e vai resolver tudo isso pra nós.Métodos
parseURL()O método parseURL() interpreta uma URL segundo os padrões combinados e popula as propriedades do nosso Dispatcher. Na prática, ele vai separar os pedacinhos da url, dividindo a string em partes. Em primeiro lugar, ele remove a string relativa ao protocolo (http:// ou https://). Depois, o domínio. Ficamos então com a estrutura controller/método/parametros.extensaoAí fica facil separar tudo, não?parseParams()O método parseParams() faz o mesmo que a função acima, só que para os parâmetros enviados por get e post. Tudo o que estiver entre um ? e o ponto da extensão será considerado parâmetro get. Também será considerado parâmetro get tudo o que vier depois da action requisitada, no caso de nossos exemplos acima "19" e "id"=>"19". Tudo o que vier no $_POST vai ser incluído também em nosso array $parameters.Repare que pra simplificar as coisas não vamos considerar a diferença entre get e post em nosso array $parameters; será igual fazer um request por get e post. Juntaremos tudo no array, sem distinção.</description>
                <pubDate>Tue, 04 Dec 2007 02:20:34 -0800</pubDate>
            </item>
                    <item>
                <title>O Zen e a arte cavalheiresca da programação orientada a objeto (Parte 20)</title>
				
				<link>http://www.digitalminds.com.br/posts/3403</link>				
                <description>O Zen e a arte cavalheiresca da programa&amp;ccedil;&amp;atilde;o orientada a objeto (Parte 20)Para ver os artigos anteriores desta s&amp;eacute;rie, clique aqui. Ol&amp;aacute; pessoALL. Estamos aqui mais uma vez pra falar de Orienta&amp;ccedil;&amp;atilde;o a Objetos de um jeito bem pr&amp;aacute;tico, utilizando o pattern MVC para exemplificar conceitos importantes. A linguagem escolhida, voc&amp;ecirc; provavelmente j&amp;aacute; sabe, &amp;eacute; PHP. Ent&amp;atilde;o sinta-se &amp;agrave; vontade, sente mais perto da fogueira que j&amp;aacute; vamos come&amp;ccedil;ar nosso papo.Chegamos a um momento importante de nossa s&amp;eacute;rie. Vamos falar hoje do &amp;uacute;ltimo v&amp;eacute;rtice da tr&amp;iacute;ade MVC, mais especificamente a classe View. Voc&amp;ecirc; lembra que deixamos a classe View por &amp;uacute;ltimo por se tratar do conceito mais simples dos tr&amp;ecirc;s? Muito bem, chegou a hora de ver se a coisa &amp;eacute; t&amp;atilde;o simples quanto falamos.Nossa classe base View ter&amp;aacute; a responsabilidade de imprimir nossas p&amp;aacute;ginas HTML, juntando o conte&amp;uacute;do din&amp;acirc;mico&amp;nbsp;obtido por&amp;nbsp;nossos Controllers&amp;nbsp;ao c&amp;oacute;digo que colocamos nos templates que criamos. Portanto, primeiro precisamos definir direitinho o que &amp;eacute; um template dentro de nosso framework, j&amp;aacute; que existem in&amp;uacute;meras defini&amp;ccedil;&amp;otilde;es por a&amp;iacute;. Nossos templates ser&amp;atilde;o p&amp;aacute;ginas php especiais, contendo basicamente html, que v&amp;atilde;o ser utilizadas por nossa classe View para imprimir as p&amp;aacute;ginas de nossas aplica&amp;ccedil;&amp;otilde;es MVC na tela. Normalmente nestes templates&amp;nbsp;v&amp;atilde;o conter todo o html b&amp;aacute;sico da p&amp;aacute;gina e&amp;nbsp;comandos PHP&amp;nbsp;para imprimir as informa&amp;ccedil;&amp;otilde;es din&amp;acirc;micas provenientes do controller, normalmente usando s&amp;oacute; algumas poucas fun&amp;ccedil;&amp;otilde;es do PHP como echo, print e foreach.Um exemplo de template talvez deixe isso tudo mais claro. Imagine que j&amp;aacute; temos tudo pronto em nosso sistema de gerenciamento de blogs, e chegou a hora de fazer o template que mostra um post. O c&amp;oacute;digo deste template (muito simplificado, claro) seria algo assim:Reparem que n&amp;atilde;o precisamos incluir no template nenhuma informa&amp;ccedil;&amp;atilde;o de tipo de documento (DOCTYPE) ou mesmo a se&amp;ccedil;&amp;atilde;o . Nossa classe View vai colocar tudo isso automaticamente pra n&amp;oacute;s, de acordo com defini&amp;ccedil;&amp;otilde;es gerais que vamos colocar em outros arquivos, chamados de layouts. Os layouts s&amp;atilde;o basicamente arquivos HTML sem a se&amp;ccedil;&amp;atilde;o  do html, e servem justamente para que n&amp;atilde;o precisemos ficar repetindo estas informa&amp;ccedil;&amp;otilde;es toda hora. A classe View vai combinar layouts e templates para construir a p&amp;aacute;gina. De forma simplificada, portanto, podemos dizer que nossos templates s&amp;atilde;o o corpo do documento html (), e os layouts s&amp;atilde;o o resto. Deu pra sacar?O que os templates t&amp;ecirc;m de especial? Nada, sinceramente. Especial &amp;eacute; o acordo que fazemos para s&amp;oacute; utilizar html e fun&amp;ccedil;&amp;otilde;es de apresenta&amp;ccedil;&amp;atilde;o dentro deles. Isso &amp;eacute; fundamental para que n&amp;atilde;o misturemos l&amp;oacute;gica (que deve estar toda no controller) e apresenta&amp;ccedil;&amp;atilde;o (que deve estar toda no template). Se voc&amp;ecirc; come&amp;ccedil;ar a usar outras fun&amp;ccedil;&amp;otilde;es que n&amp;atilde;o echo, print ou foreach (ou alguma outra fun&amp;ccedil;&amp;atilde;o de formata&amp;ccedil;&amp;atilde;o, tipo printf ou number_format) dentro dos templates voc&amp;ecirc; vai voltar imediatamente pro inferno. Alguns caras levaram isso t&amp;atilde;o a s&amp;eacute;rio que chegaram a criar linguagens especiais s&amp;oacute; para n&amp;atilde;o usar PHP dentro dos templates. O Smarty, um dos mais poderosos sistemas de template j&amp;aacute; escritos em php, faz exatamente isso.&amp;nbsp; Eles criaram tags especiais para cada uma das fun&amp;ccedil;&amp;otilde;es PHP de apresenta&amp;ccedil;&amp;atilde;o, al&amp;eacute;m de terem bolado uma s&amp;eacute;rie de outras interessantes. Ao inv&amp;eacute;s de escrever algo tipono Smarty voc&amp;ecirc; escreveria &amp;nbsp;{$nome}Bem interessante, n&amp;atilde;o? Isso for&amp;ccedil;a o programador a utilizar somente os comandos do Smarty, que s&amp;atilde;o somente de apresenta&amp;ccedil;&amp;atilde;o. Mas veja que desenvolver uma solu&amp;ccedil;&amp;atilde;o como essa d&amp;aacute; bastante trabalho: no fundo, toda essa codifica&amp;ccedil;&amp;atilde;o especial precisa ser transformada novamente&amp;nbsp;em PHP alguma hora. Os cr&amp;iacute;ticos dizem que isso &amp;eacute; desnecess&amp;aacute;rio e prejudica a performance, j&amp;aacute; que o PHP oferece todas essas fun&amp;ccedil;&amp;otilde;es nativamente. Bem, os caras do Smarty (e de outros template engines que existem por a&amp;iacute;) contra-atacam dizendo que todos os templates s&amp;atilde;o compilados e cacheados em PHP, de forma que a diferen&amp;ccedil;a de performance &amp;eacute; m&amp;iacute;nima.N&amp;oacute;s n&amp;atilde;o temos aqui a pretens&amp;atilde;o de escrever um Smarty; o caminho mais simples &amp;eacute; usar PHP puro. Este, portanto, &amp;eacute; o caminho que vamos seguir. Vamos &amp;agrave; nossa descri&amp;ccedil;&amp;atilde;o gen&amp;eacute;rica da classe View:Class ViewPropriedades$dataArray associativo&amp;nbsp;contendo todas as informa&amp;ccedil;&amp;otilde;es din&amp;acirc;micas de modelos e cole&amp;ccedil;&amp;otilde;es.$urlString com a url que est&amp;aacute; sendo acessada.$layoutString com o nome do layout a ser utilizado. O Default &amp;eacute; nulo, o que ir&amp;aacute; fazer com que a classe View utilize um layout padr&amp;atilde;o.$baseurlString com a url base do site para facilitar a montagem de links e caminhos de arquivos.&amp;nbsp;$variablesArray associativo que pode conter outras variaveis gen&amp;eacute;ricas definidas pelo controller.&amp;nbsp;M&amp;eacute;todosrender($action,$layout)Imprime a a&amp;ccedil;&amp;atilde;o $action usando o layout $layout. Os defaults s&amp;atilde;o a a&amp;ccedil;&amp;atilde;o corrente e o layout default.setVariable($variablename,$value)Define uma vari&amp;aacute;vel para uso no view.setPageTitleDefine o t&amp;iacute;tulo da p&amp;aacute;gina a ser impressa (na tag )renderError($error)Imprime uma p&amp;aacute;gina de erro utilizando o layout default para erros.&amp;nbsp;</description>
                <pubDate>Thu, 22 Nov 2007 01:44:13 -0800</pubDate>
            </item>
                    <item>
                <title>O Zen e a arte cavalheiresca da programação orientada a objeto (Parte 19)</title>
				
				<link>http://www.digitalminds.com.br/posts/3396</link>				
                <description>Para ver os artigos anteriores desta s&amp;eacute;rie, clique aqui.Muito bem, caros amigos, voltamos &amp;agrave; s&amp;eacute;rie que explica os conceitos transcendentais de programa&amp;ccedil;&amp;atilde;o orientada a objetos numa linguagem que todos podem facilmente entender. Este seu autor agradece novamente a todos pelos e-mails e coment&amp;aacute;rios, s&amp;atilde;o eles que nos incentivam a continuar sempre.No &amp;uacute;ltimo cap&amp;iacute;tulo come&amp;ccedil;amos a descrever nossas classes, notadamente a classe base Model, de fundamental import&amp;acirc;ncia em nosso quase-framework MVC. A fim de continuar nossa tarefa, proponho uma pequena reorganiza&amp;ccedil;&amp;atilde;o de nosso estimado acr&amp;ocirc;nimo: gostaria de falar neste artigo da classe base Controller, antes de falar da classe View. O motivo &amp;eacute; simples: acredito que vai facilitar o entendimento se deixarmos para falar da classe View depois. Como o PHP &amp;eacute; praticamente uma linguagem de constru&amp;ccedil;&amp;atilde;o de templates, posso afirmar de forma geral que todos que j&amp;aacute; trabalharam com PHP v&amp;atilde;o entender mais facilmente o conceito de Views.Vamos l&amp;aacute;, ent&amp;atilde;o? Voc&amp;ecirc;s ainda se lembram do artigo no qual falamos que a url requisitada para o browser iria definir os modelos e a&amp;ccedil;&amp;otilde;es a serem realizadas? Muito bem, s&amp;oacute; pra lembrar, nossas urls ter&amp;atilde;o o seguinte formato:http://www.meusite.com.br/modelo/acao/parametros Nosso controller, ent&amp;atilde;o, vai saber direitinho em qual modelo aplicar uma determinada a&amp;ccedil;&amp;atilde;o com certos par&amp;acirc;metros. Um exemplo seria:http://www.meublog.com.br/blogposts/add/Nesse caso, primeiramente nosso controller iria instanciar um objeto da classe BlogPost, que &amp;eacute; filha da classe Model e j&amp;aacute; herdou tudo o que precisa para fazer as opera&amp;ccedil;&amp;otilde;es no banco de dados.Repare que para facilitar vamos utilizar sempre o nome dos controllers no plural - alguns de voc&amp;ecirc;s devem ter estranhado o fato de um controller BlogPostS instanciar na verdade um objeto da classe BlogPost (sem o S). O motivo &amp;eacute; bem simples: o controller BlogPosts ir&amp;aacute; cuidar tanto da cria&amp;ccedil;&amp;atilde;o/edi&amp;ccedil;&amp;atilde;o/visualiza&amp;ccedil;&amp;atilde;o/exclus&amp;atilde;o de um &amp;uacute;nico BlogPost quanto da visualiza&amp;ccedil;&amp;atilde;o de cole&amp;ccedil;&amp;otilde;es de BlogPosts. Quando trabalhamos com um &amp;uacute;nico registro, um &amp;uacute;nico artigo de nosso blog, ele ir&amp;aacute; utilizar a classe BlogPost. Quando precisarmos trabalhar com cole&amp;ccedil;&amp;otilde;es ou listas de artigos, como por exemplo uma listagem paginada, ele ir&amp;aacute; utilizar a classe BlogPostCollection.Bom, vamos continuar: em seguida, nosso controller de BlogPosts iria executar seu m&amp;eacute;todo add. Este m&amp;eacute;todo iria checar se existe algum post http de formul&amp;aacute;rio de dados do usu&amp;aacute;rio. Em caso negativo, ele instancia um objeto da classe View e imprime o template adequado, que claramente ser&amp;aacute; um formul&amp;aacute;rio que submete seus dados para a mesma URL, http://www.meublog.com.br/blogposts/add  O template adequado, nesse caso, &amp;eacute; o arquivo add.tpl, que fica dentro de uma pasta BlogPosts, que por sua vez vai ficar dentro de uma outra pasta Views, em um lugar seguro de nosso servidor que n&amp;atilde;o precisa nem estar dispon&amp;iacute;vel publicamente. Repararam como at&amp;eacute; mesmo a organiza&amp;ccedil;&amp;atilde;o dos arquivos &amp;eacute; bem resolvida dentro de um framework? S&amp;oacute; precisamos criar templates com os mesmos nomes que nossas a&amp;ccedil;&amp;otilde;es e coloc&amp;aacute;-los nos folders com os mesmos nomes de nossos controllers para que a m&amp;aacute;gica aconte&amp;ccedil;a. Bom, imaginando que o usu&amp;aacute;rio tenha preenchido o formul&amp;aacute;rio acima e o tenha submetido, nosso controller recebe os dados, popula o objeto instanciado da classe BlogPost que est&amp;aacute; na propriedade $model com os dados que vieram do formul&amp;aacute;rio, faz a valida&amp;ccedil;&amp;atilde;o executando o m&amp;eacute;todo $model->validate() e se estiver tudo bem, salva os dados executando $model->save() e mostra uma mensagem de sucesso usando o m&amp;eacute;todo flash(). Esse m&amp;eacute;todo imprime uma mensagem na tela durante alguns segundos e em seguida redireciona o usu&amp;aacute;rio para outra p&amp;aacute;gina qualquer, no nosso caso provavelmente a lista de posts.Deu pra entender? Class ControllerPropriedades$modelA propriedade $model vai armazenar o modelo no qual nosso controller ir&amp;aacute; operar as a&amp;ccedil;&amp;otilde;es desejadas. Em nosso exemplo, ele armazenaria uma inst&amp;acirc;ncia da classe BlogPost.$modelcollectionA propriedade $modelcollection vai armazenar uma instancia da cole&amp;ccedil;&amp;atilde;o relacionada ao modelo requisitado a fim de fazer as opera&amp;ccedil;&amp;otilde;es com cole&amp;ccedil;&amp;otilde;es ou listas. No nosso caso, uma inst&amp;acirc;ncia da classe BlogPostCollection.$action$action vai guardar a a&amp;ccedil;&amp;atilde;o solicitada. No nosso exemplo, add. Para que a m&amp;aacute;gica funcione, nosso controller dever&amp;aacute; ter um m&amp;eacute;todo add(). Para cada a&amp;ccedil;&amp;atilde;o dever&amp;aacute; existir um m&amp;eacute;todo correspondente em nosso controller; a&amp;ccedil;&amp;otilde;es que n&amp;atilde;o existem ser&amp;atilde;o tratadas como erro.$parametersA propriedade $parameters guarda todos os par&amp;acirc;metros extras do request. Por exemplo, se estiv&amp;eacute;ssemos vendo uma lista de Posts, poder&amp;iacute;amos usar pagina&amp;ccedil;&amp;atilde;o, e o n&amp;uacute;mero da p&amp;aacute;gina viria como um par&amp;acirc;metro:http://www.meublog.com.br/posts/list/page=3$othermodels$othermodels &amp;eacute; uma propriedade que vai nos permitir instanciar objetos de outros modelos que n&amp;atilde;o somente os da classe requisitada no request. Por exemplo, poder&amp;iacute;amos querer utilizar as informa&amp;ccedil;&amp;otilde;es do usu&amp;aacute;rio que est&amp;aacute; adicionando o post a fim de gravar no banco quem fez a &amp;uacute;ltima altera&amp;ccedil;&amp;atilde;o. Assim, precisar&amp;iacute;amos tamb&amp;eacute;m de um objeto da classe User.$viewInstancia da classe View que ir&amp;aacute; imprimir na tela os templates correspondentes.&amp;nbsp;M&amp;eacute;todosflash($message,$url,$seconds)O m&amp;eacute;todo flash() mostra o texto de $message durante alguns segundos ($seconds) e em seguida redireciona para a url especificada. Muito &amp;uacute;til para mostrar uma mensagem de sucesso ou fracasso de alguma a&amp;ccedil;&amp;atilde;o. redirect($url)O m&amp;eacute;todo redirect() &amp;eacute; muito simples: ele simplesmente redireciona o processamento para a url desejada.Por hoje &amp;eacute; s&amp;oacute;, pessoal. Voltamos a qualquer momento com mais orienta&amp;ccedil;&amp;atilde;o a objetos para voc&amp;ecirc;s!&amp;nbsp;&amp;nbsp;</description>
                <pubDate>Tue, 13 Nov 2007 02:37:51 -0800</pubDate>
            </item>
                    <item>
                <title>O Zen e a arte cavalheiresca da programação orientada a objeto (Parte 18)</title>
				
				<link>http://www.digitalminds.com.br/posts/3372</link>				
                <description>Para ver os artigos anteriores desta s&amp;eacute;rie, clique aqui. Ol&amp;aacute; Pessoal, estamos de volta com a s&amp;eacute;rie que mostra alguns princ&amp;iacute;pios de programa&amp;ccedil;&amp;atilde;o orientada a objetos precisamente a cada rand (1,32768) dias!Muito bem, senhoras e senhores. Acho que chegou a hora da gente &amp;quot;objetivar&amp;quot; um pouco e listar aqui nossas classes e seus m&amp;eacute;todos: at&amp;eacute; eu, depois de algum tempo sem escrever, me perdi! J&amp;aacute; falamos livremente sobre os modelos, controllers e views de nosso quase-framework; agora &amp;eacute; importante colocar no papel. Digo, no banco de dados. Enfim, voc&amp;ecirc;s entenderam.Ent&amp;atilde;o vamos come&amp;ccedil;ar com a classe Model, base para todos os nossos modelos:Classe ModelAtributos&amp;nbsp;$primarykeyString. Nome da chave prim&amp;aacute;ria do banco de dados. O default &amp;eacute; id, mas pode ser qualquer nome desde que seja inicializado ao criar o modelo. $tableString. Nome da tabela &amp;agrave; qual o modelo ser&amp;aacute; mapeado. O default &amp;eacute; o nome do modelo. $dataArray. O array $data vai conter os dados do modelo, mapeando cada campo com seu valor.$fieldsArray. Lista dos campos da tabela relacionada ao modelo, associado ao tipo e tamanho de cada campo. O default &amp;eacute; obtido diretamente do banco de dados.  $validationstatusArray. O array $validationstatus cont&amp;eacute;m a situa&amp;ccedil;&amp;atilde;o de valida&amp;ccedil;&amp;atilde;o de cada campo do modelo. O m&amp;eacute;todo Validate() popula este array com a situa&amp;ccedil;&amp;atilde;o de cada um dos campos, (true/false) de acordo com as regras de valida&amp;ccedil;&amp;atilde;o de cada um.&amp;nbsp;M&amp;eacute;todosLoadById($id)Carrega os dados do registro cuja chave prim&amp;aacute;ria &amp;eacute; $id no array $data do modelo. Save()Salva os dados do modelo no banco. Antes executa a fun&amp;ccedil;&amp;atilde;o ValidateFields() para garantir que os dados s&amp;atilde;o v&amp;aacute;lidos. Se a chave prim&amp;aacute;ria no modelo estiver vazia, ele cria um novo registro. Se estiver preenchida, ele atualiza os dados do registro que cont&amp;eacute;m este id.DeleteById($id)Remove da tabela o registro com o id $id.  Bem simples. O &amp;uacute;nico perigo aqui &amp;eacute; se a gente n&amp;atilde;o configurar corretamente a tabela para lidar com o efeito cascata, ou seja, se a gente deixar algu&amp;eacute;m apagar um registro que &amp;eacute; referenciado por outros registros. Por exemplo, se eu apago um post que tem v&amp;aacute;rios coment&amp;aacute;rios relacionados, precisamos remover todos eles, certo? A boa not&amp;iacute;cia, pra quem ainda n&amp;atilde;o sabe, &amp;eacute; que o banco cuida disso sozinho pra n&amp;oacute;s.ValidateFields()Valida cada um dos campos de acordo com suas regras de valida&amp;ccedil;&amp;atilde;o. Como a classe Model &amp;eacute; uma classe gen&amp;eacute;rica, ou melhor dizendo, abstrata, vamos fazer aqui uma valida&amp;ccedil;&amp;atilde;o tamb&amp;eacute;m gen&amp;eacute;rica, de acordo com as caracter&amp;iacute;sticas dos campos da tabela. Assim, vamos validar, por exemplo, se um determinado campo &amp;eacute; texto, e se seu tamanho est&amp;aacute; dentro do tamanho estipulado na descri&amp;ccedil;&amp;atilde;o da tabela. Para valida&amp;ccedil;&amp;otilde;es mais espec&amp;iacute;ficas, vamos reescrever a fun&amp;ccedil;&amp;atilde;o ValidateFields() em cada um dos nossos modelos.Reparem, caros leitores, que nosso objetivo aqui &amp;eacute; clareza e simplicidade. Poderiamos ter chamado a fun&amp;ccedil;&amp;atilde;o LoadById simplesmente de Load; Mas a id&amp;eacute;ia &amp;eacute; deixar o uso da fun&amp;ccedil;&amp;atilde;o realmente claro; Percebam que j&amp;aacute; na fun&amp;ccedil;&amp;atilde;o Save isso j&amp;aacute; n&amp;atilde;o &amp;eacute; necess&amp;aacute;rio pois vamos salvar o estado do modelo no banco, sem a necessidade de nenhum campo espec&amp;iacute;fico estar definido. Para salvar um novo registro vamos simplesmente salvar um modelo que tenha sua vari&amp;aacute;vel $id vazia.Uma diferen&amp;ccedil;a bastante grande desta proposta em rela&amp;ccedil;&amp;atilde;o ao Cake &amp;eacute; a divis&amp;atilde;o de trabalho: como o Cake usa o pattern ActiveRecord, tem muita coisa dentro da classe Model. Aqui n&amp;oacute;s estamos dividindo este trabalho com a classe ModelCollection, que ir&amp;aacute; fazer todo o trabalho de banco de dados quando estivermos lidando com grupos de registros, ou cole&amp;ccedil;&amp;otilde;es.That&amp;#39;s all, Folks! Mandem seus coment&amp;aacute;rios, d&amp;uacute;vidas e xingamentos e at&amp;eacute; a pr&amp;oacute;xima!&amp;nbsp;</description>
                <pubDate>Tue, 09 Oct 2007 04:59:38 -0800</pubDate>
            </item>
                    <item>
                <title>Como eu vivi esse tempo todo sem o Scribefire?</title>
				
				<link>http://www.digitalminds.com.br/posts/3378</link>				
                <description>Aqui.</description>
                <pubDate>Tue, 25 Sep 2007 14:57:08 -0800</pubDate>
            </item>
                    <item>
                <title>The Analog Kid</title>
				
				<link>http://www.digitalminds.com.br/posts/3377</link>				
                <description>Nasceu. Quando estiver querendo dar uma pausa, passa lá. </description>
                <pubDate>Mon, 24 Sep 2007 08:23:49 -0800</pubDate>
            </item>
                    <item>
                <title>O Poder da Wikipedia</title>
				
				<link>http://www.digitalminds.com.br/posts/3369</link>				
                <description>Eu ainda fico chocado com a quantidade de conteúdo maluco que é gerado na wikipedia.  &amp;quot;Natasha, uma cantora de rock, vendeu sua alma ao terrível Conde Vladymir Polanski, chefe dos vampiros, para brilhar na carreira. Mas ele descobre que em encarnações passadas ela era Eugênia, o seu amor, que preferiu ficar com Rocha, a outra vida do Capitão Jonas.&amp;quot; Agora &amp;quot;Calada noite preta&amp;quot; não sai da minha cabeça. Maldição. http://pt.wikipedia.org/wiki/Vamp_%28telenovela%29&amp;nbsp;P.S. &amp;quot;O Zen...&amp;quot; vai voltar... prometo... aguentem firme! Grande abraço! </description>
                <pubDate>Thu, 13 Sep 2007 15:21:32 -0800</pubDate>
            </item>
            </channel>
</rss> 