Mostrando postagens com marcador CakePHP. Mostrar todas as postagens
Mostrando postagens com marcador CakePHP. Mostrar todas as postagens

segunda-feira, 27 de abril de 2009

A função que precisava!

Em seu trabalho, um dia você vai precisar transformar aquele dado 0/1 em ativo/inativo na visão.

A idéia seria a seguinte:
($variavel == 1) ? "ativo" : "inativo";

Respeitando MVC, não deveremos colocar esta lógica na view, de forma alguma.
A view tão somente deve exibir os dados setados a ela.
Para exibir esses dados devem ser modificados no controller. Sendo $variavel já enviada com "ativo" ou "inativo".

Em CAKEBAKER ele fala sobre a mesma idéia só que trabalhando do model para o banco.

Busquei tratar o valor de $variavel que seria impresso na view no controlador visto que ele é responsável por enviar os dados a mesma. Então que sejam enviados os dados de forma correta.

Já na hora de tratar com banco, a responsabilidade é do modelo.

Parei para pensar um pouco sobre como realizar isso com próprio sql.
Numa leitura superficial encontrei um artigo que falava sobre o uso CASE em SELECTS.
Vejam se a idéia não é parecida com o exemplo dado neste blog?

select
CASE month when "01" then "January"
when "02" then "February"
when "03" then "March"
END
from calendar where year = "2005" order by month

Fonte principal : http://dev.mysql.com/doc/refman/4.1/pt/control-flow-functions.html

segunda-feira, 6 de abril de 2009

CakePHP - headers already sent by ...

Bem, aqui vai mais uma dica bem rápida. Caso você se depare com esse probleminha ao tentar rodar sua aplicação:
"cakephp Cannot modify header information - headers already sent by"
Verifique se não deixou algum espaço em branco após a tag de fechamento do php (?>)

Confira mais informações aqui.

sábado, 28 de março de 2009

Outras reflexões sobre aprofundar conhecimentos

Pelo o que vejo no analytics, percebo que o público chega até meus posts através dos buscadores que relacionam os posts a necessidade em questão. O público (vocês) vêm em maioria buscando a solução rápida para bugs ou um tutorial rápido sobre ajax com php e etc. Quando criei o blog não tinha o objetivo de oferecer orientação mais profunda sobre assuntos como tutoriais e demais. Meus relatos são todos referênciados ao meu cotidiano de desenvolvimento. Então, em muitos casos, não atendo a necessidade do leitor.

Mas como vi que cada vez mais pessoas estão "caindo" no blog, não custa nada dividir um pouco de conhecimento.

Comecei na área de desenvolvimento com o interesse em Flash. Depois desenvolvi com CSS e iniciei o aprendizado por conta própria sobre PHP e demais.

Muitas vezes bati a cabeça com bobeiras. No post anterior relatei exatamente a importância de possuir alguns conhecimentos técnicos e se preocupar em ler manuais e etc.

Muita gente que está iniciando o uso de CakePHP não possui conhecimento sobre Padrões de Software, GRASP. Não sabem o que é MVC, BCE. Muitos termos técnicos são lidos como uma palavra desconhecida, e não buscamos saber seu significado assim quando lemos um livro e não buscamos as palavras desconhecidas no dicionário. O que esquecemos é que esses pequenos detalhes podem nos travar no desenvolvimento e nos causar um sentimento de frustração.

Nos vídeos do Túlio Faria, ele ensina bem do início como usar o CakePHP. Ele diz como funciona a aplicação com seus Controllers e Models, onde cada arquivo deve ficar e etc. A questão é que não nos passa pela cabeça que Controller, Model entre outros estão relacionados a padrões. Decorrente disso vemos nos fóruns perguntas como "Devo ter um model/controller para cada página do site?".

Por desconhecer padrões, não enxergamos o que fazemos como uma aplicação, não enxergamos as camadas de desenvolvimento. O que ocorre é que o trabalho é executado com a visão de que se está construindo um site, a mesma visão que temos quando montamos um site estático ou sem padrões.

quinta-feira, 5 de fevereiro de 2009

CakePHP - utilizando o saveField()

O método saveField() atualiza um campo específico em seu banco de dados.

$this->Model->saveField('Campo',$valor);

É importante identificar o model antes de usar este método caso contrário um novo registro será criado.

$this->Model->id = $id;

segunda-feira, 2 de fevereiro de 2009

CakePHP - Não esqueça do setFlash ao configurar seu layout.

Caso tenha mudado o layout de sua aplicação e notou que as mensagens de erro e avisos retornados pelo setFlash não estão mais aparecendo na tela, você provavelmente removeu a verificação do setFlash em seu view acidentalmente.

if ($session->check('Message.flash')) {
$session->flash();
}
?>

terça-feira, 20 de janeiro de 2009

Acentuação CakePHP : Encoding

O CakePHP 1.2 utiliza o UTF-8. No início podemos nos deparar com alguns problemas referentes a acentuação.
Buscando entender um pouco isso fiz algumas buscas na internet (google) e segui algumas recomendações simples.
  • Sempre ficar atento ao encoding do Banco de Dados;
  • Configurar o enconding no arquivo database.php do Cake;
  • Certificar o encoding utilizado em suas páginas;
Estas são precauções simples para evitar problemas com acentuação.

Atualmente, pelo que constatamos em muitos blogs e nas conversas entre desenvolvedores, o UTF-8 está com a preferência de uso.

Aqui vai uma boa dica : http://cakephp.afons.us/?tag=encoding

Uma referência para leitura: http://pt.wikipedia.org/wiki/UTF-8

Um post sobre Charsets e Encodes: http://www.tableless.com.br/charsets-e-encodes-tabelas-de-caracteres

domingo, 11 de janeiro de 2009

Páginas internas dinâmicas com CakePHP

Bem, andei um pouco afastada do blog por que entrei de férias e comecei a colocar alguns detalhes pessoais em ordem.

Mas o assunto deste post não são as minhas férias. Vamos ao que realmente importa.

Em algum momento do seu aprendizado sobre o CakePHP você se pergunta : "Como faço para criar páginas internas?".

Algumas respostas e sugestões aparecem : "Será que devo criar um controller para cada página interna?".Para esta primeira dedução você logo vai encontrar a resposta. Não, você não precisa criar um controller para cada página. (Easily creating static pages)

Lá na pasta "views" dentro de sua aplicação(app) você vai encontrar um diretório "pages". Todas as páginas internas do seu site ficarão armazenadas ali, ou seja, simples arquivos .CTP. Nada de controllers.

Perfeito. Agora seu site possui páginas internas tais como : "Quem somos", "Contato", etc.

Mas e se em algum momento formos questionados por nossos clientes : "Será que posso alterar o quem somos?". Bem, neste caso nossas páginas internas estão estáticas. Precisamos tornar esse conteúdo dinâmico.

Busquei um pouco na internet uma maneira de resolver essa questão.
Confesso que antes de qualquer coisa fiquei quebrando a cuca tentando resolver sozinha, depois de tentar as saídas que achei possíveis recorri aos resultados do Google. A busca retornou o que estava precisando (Managing simple pages in cakephp).

Com uma simples adaptação do código para a última versão do Cake consegui adotar o CRUD para minhas páginas internas usando o Pages_Controller do próprio Cake sem afetar os demais controllers.

Essa é a dica que tenho para quem precisa dessa adaptação; um ótimo 2009 para todos.

sexta-feira, 26 de dezembro de 2008

CakePHP - Array Functions

Array : Algumas propriedades
Depois de notar o quanto o uso do compact se tornou freqüente nos meus scripts, resolvi listar algumas funções que julguei úteis. Algumas talvez não apresentem um uso agora.
Exemplos em php.net

array_combine
Cria um novo array a partir de dois já existentes. Usando os valores do primeiro como as chaves e os parâmetros do segundo como os valores.
$a = array('green', 'red', 'yellow');
$b = array('avocado', 'apple', 'banana');
$c = array_combine($a, $b);

Na tela:
Array
(
[green] => avocado
[red] => apple
[yellow] => banana
)

array_chunk
Divide um array em pequenas partes. Separe os dados como se fossem uma lista ou até mesmo monte calendários.
$input_array = array('a', 'b', 'c', 'd', 'e');
print_r(array_chunk($input_array, 2));

Na tela ( valores do array resgatados de 2 em 2) :

Array
(
[0] => Array
(
[0] => a
[1] => b
)

[1] => Array
(
[0] => c
[1] => d
)

[2] => Array
(
[0] => e
)

)

array_diff
Retorna os valores de array1 que não constam em um array2.
$array1 = array("a" => "green", "red", "blue", "red");
$array2 = array("b" => "green", "yellow", "red");
$result = array_diff($array1, $array2);

Na tela ( os valores de array1 ) :

Array
(
[1] => blue
)

Agora fico devendo algumas brincadeiras com o Cake. Senão esse post fica sem propósito.

Framework

Framework : eficiente e produtivo.
Enquanto estudava Modelagem, recebia o feedback de um bate-papo sobre a real necessidade do uso de frameworks.

A questão era a seguinte:" Necessito de um framework se faço um bom código?"
Junto a questão veio um comentário : "Levo menos tempo preparando meus estilos do que me preparando para usar um framework css".

Concluímos que pessoas com mais experiência com a linguagem não sentem necessidade do uso de um framework.
Mas é indiscutível as vantagens que o mesmo pode nos oferecer. Não duvido que um bom programador munido de um bom framework não se torne um indivíduo muito mais produtivo e que a qualidade de seu serviço seja muito maior do que qualquer outro que use o mesmo framework mas possua conhecimentos básicos em programação.

Também devemos entender que o propósito do framework é nos tornar eficientes e produtivos, aumentando a qualidade do nosso serviço e nos dispondo de mais tempo para nos concentrar na abstração dos problemas e no trato das soluções.

Bom código necessita de um framework?

Analise quando realmente é necessário o uso do framework.
Existem diversos tipos de frameworks para várias linguagens..até para CSS. Analise se precisa de um.
Hoje não vivo sem o CakePHP, até para os projetos mais simples.

Meu propósito não é facilitar o aprendizado em relação a linguagem, e sim manter a estrutura do meu sistema o mais sólida possível.

A importância de conhecer a linguagem


Framework é bom mas não dispenso a linguagem em seu estado mais "puro".
A importância de saber bem com o que se trabalha é o fator que nos diferencia entre bons e ótimos profissionais.

domingo, 21 de dezembro de 2008

CakePHP - Ajax, Render, Upload, unlink, Sortable

Final de ano. Férias na faculdade. Evento em São Paulo.
Este final de semana em frente ao computador tirando o atraso com o CakePHP.
De sábado para domingo estudando das 7 da manhã às 5 da manhã de domingo.
Lendo, relendo, revisando. Fazendo, desfazendo. Experimentar e conhecer.
Comprometi-me a sempre fazer um apanhado das realizações para que a caminhada não fosse perdida em função da abstração.

Tudo começou quando resolvi definir logo meus grupos de usuários.
Tentei entender se era preciso usar o admin route. Após ler o manual, alguns fóruns e tentar usar um pouco a lógica resolvi criar views separados para meu painel de controle.
Mas aí me indaguei sobre como criar um menu dinâmico para cada grupo de usuário.
Seria necessário definir o menu de acordo com o grupo de usuários?
Bastaria deixar a ação disponível no menu para todos os grupos?
Depois de pensar muito percebi que estava investindo muito tempo nisso e ainda tinha uma caminha pela frente.

Deixei o componente Auth de lado por enquanto.
Dediquei o tempo no CRUD de uma das minha tabelas.
Testei cada função em ajax, revisei o livro. Fui em cada fórum, vi cada questão.

Em relação ao Ajax concluí o seguinte:
É melhor não tentar fazer uploads de arquivos.

Com ajax aponto para uma ação do controller, nessa ação uso o render para passar os parâmetros para uma determinada página CTP do meu controller, essa página por sua vez é carregada no elemento setado no ajax.

quinta-feira, 18 de dezembro de 2008

Algumas URLs

http://kiss.souagil.com.br/2008/11/sistemas-de-temas-do-cakephp/

http://planetcakephp.org/

http://docs.cakephp.nu/

domingo, 23 de novembro de 2008

sábado, 15 de novembro de 2008

21 coisas que precisamos saber de cor sobre o cakephp

http://www.avatarfinancial.com/pages/cake/

Um caroço no meu bolo : 2147483647

Salaam.
Não sei ao certo por onde começar rs.

Tive um problema quando precisei determinar um valor numérico aleatório para um campo no meu banco de dados.

Mas me deparei com o seguinte problema, o registro que aparecia no banco era sempre o seguinte número : 214783647

Como sempre acredito que o problema está entre a cadeira e o teclado, comecei a revisar a minha função. Ela funcionava perfeitamente.

Como é possível eu determinar uma entrada e me aparecer outra no banco?

Simples, o problema é o PHP_INT_MAX

Acredito que tenha ocorrido um problema no momento em que usei expressões regulares para tratar um valor retornado por um md5.

http://www.yqed.com/php-32bits-2147483647/

Otimizando a receita

Só para constar, nesse blog tem uma boa explicação do uso do compact.

http://www.littlehart.net/atthekeyboard/2007/08/07/stupid-cakephp-controller-tricks/

Basicamente, este serve para deixar o código mais legível..e se essas coisas existem por que não usá-las??


  1. $this->set('user', $this->User->read(null, $id));
  2. $this->set('foo', $foo);
  3. $this->set('bar', $bar);
  4. $this->set('baz', $baz);
Isso tudo aí em cima pode ser resumido a isto:

  1. $user = $this->User->read(null, $id);
  2. $this->set(compact('user', 'foo', 'bar', 'baz'));
Bem, o que ocorre é que nos bastidores é que será feita uma identificação entre o nome que você estabeleceu como parâmetro e as variáveis em uso que possuem o mesmo nome.

Na cozinha

Bem, não posso ficar sem relatar o andamento do meu aprendizado.

Depois de ter conseguido configurar o bake, testei várias vezes os tipos de relacionamentos disponíveis no cake. Fiz de tudo, rs..acho que até tentei fazer o impossível.

Testei um por um, e vi também como eles eram retornados no view..edit..etc.

Agora que já estou satisfeita com o modelo relacional supimpa, tenho que fazer algumas mudanças para que meu CRUD funcione como eu havia planejado..

Estou lendo sobre os helpers e etc..resolvi deixar a validação para depois de ajustar o meu CRUD. Espero que seja uma atitude correta, se algum veterano ler isso e puder me dar um conselho, por favor o faça. Sou muito grata =)

Ah sim, já ia esquecendo: http://manual.cakephp.com.br/doku.php?id=forms

Bom proveito por que eu já o fiz.

terça-feira, 11 de novembro de 2008

Bake, CakePHP, EasyPHP

Aqui vão alguns links para ajudar a rodar o Bake :

http://www.janisb.com/blog/2008/01/running-with-cake/

http://cakephp.org/screencasts/view/6

Com esses dois tutoriais consegui configurar o ambiente para fazer o bake funcionar direitinho no windows.

Tive uma certa dificuldade e no final solucionei meus problemas com a dica de mover as DLLs da pasta do php para o system32.

Grande abraço.

quinta-feira, 6 de novembro de 2008

CakePhp - Por que models são no singular e controllers são no plural?

No incício do desenvolvimento da aplicação devemos respeitar algumas regras para que o Cake deva funcionar como esperamos.

Primeiro criamos uma tabela em nosso banco de dados. Esta tabela deve ser nomeada em minúsculo e deve estar noplural. Por exemplo: items

Depois criamos um arquivo model, este deve ser nomeado no singular: item.php. o nome da classe também no singular"class Item" seguido do atributo da variável name "var $name = 'Item'".

Depois é o momento do controller. Este sim deve estar no plural como o nome da tabela: "ItemsController" e deve possuir o atributo name no plural também "var $name = 'Items'". O arquivo será items_controller.php

Quando você solicitar uma ação para sua aplicação (ação de adicionar um registro na tabela items) você deverá indicar ao Cake para qual tabela a ação é referenciada, isso se faz relacionando o controller (responsável pelas ações) à tabela. O Cake é capaz de fazer esta relação através das correspondências entre os nomes dos controllers e das tabelas.

No caso do model, colocamos a indicação no singular pois este deve ser visto como uma instância da tabela. Por exemplo, no caso, o model representa um único registro da tabela items. Ele é singular, não é um conjunto de registros.É m objeto que consequentemente é entendido como a instância de uma classe (no caso, items).

CakePhp - Security.salt

Sempre que iniciamos nossa aplicação somos orientados a configurar o arquivo de conexão com o banco de dados; um outro detalhe importante é o seguinte aviso:


Notice (1024): Please change the value of 'Security.salt' in app/config/core.php to a salt value specific to your application [CORE\cake\libs\debugger.php, line 541]

No decorrer do desenvolvimento de uma aplicação, o Cake nos oferece diversas funcionalidades que otimizam nosso código. Uma delas é o método como iremos trabalhar com sessões.

Sessões são importantes para que possamos estabelecer um tipo de comunicação entre o servidor e o usuário, uma espécie de troca de informações. Um exemplo seria usar as sessões para informar se um usuário efetuou o login ou não.

Pensando assim não é difícil concluir que sessões devem armazernar as informações de uma forma segura. Mas o que este aviso tem a ver com as sessões?

Simples, o Cake define um valor padrão para as suas sessões e o define em Security.salt.
Esse valor não é alterado, ou seja, todos que fazem download do Cake no site oficial tem Security.salt com o mesmo valor. Então junto com a configuração do arquivo do banco de dados devemos alterar também o valor de Security.salt para preservar a segurança das nossas sessões.

Configure::write('Security.salt', 'DYhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mi');

Preencha a linha com alguma string alfanumérica de aproximadamente 40 caracteres.

terça-feira, 4 de novembro de 2008

Realmente ainda preciso aprender. Cakephp, thumbnails, imagejpeg.

Só para fixar que em 99,9% dos casos o problema está entre a cadeira e o teclado.
Mas graças que sou uma menina espertinha e consigo me virar com o que já tem disponível pela internet.

Neste caso eu já havia resolvido este problema há algum tempo atrás mas havia me esquecido.. então para evitar o mesmo erro aqui vai um post só para me obrigar a lembrar disso e nunca mais cometer esse mico.

A questão era a necessidade de se armazenar thumbnails usando o CakePhp.

Para não se gastar tempo buscando soluções no Google, vá direto aqui : http://cakeforge.org/snippet/browse.php?by=lang&lang=5

Meu impasse era o uso do imagejpeg que não conseguia escrever em um diretório. Logo percebi que o problema era o que eu estava passando para o parâmetro visto que trabalho localmente e GD está habilitada.

Chamada : imageResize($srcFile, $destFile, $maxSize, $quality, $setHeight = false)

O parâmetro de $destFile deve passar o caminho junto com o nome do arquivo.
ex.: $destFile = "pasta/nomedoarquivo.jpg"

É só isso que precisava saber. Por isso que programadores de verdade devem ser valorizados e bem pagos! rs