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 - por onde começar

Entender o conceito de como o Cake funciona foi um pouco complicado até uns dias atrás..
Confesso que não busquei a melhor maneira para começar a aprender..
Buscando evitar o susto do "primeiro contato" perguntei a alguns amigos da faculdade como instalar, pois nem isso eu imaginava como poderia ser..
Fugindo do manual no site oficial futuquei o Google em busca de tutoriais que mostravam os primeiros passos. Graças que existe o Tulio Faria que me orientou bem com os vídeos tutoriais...

Bem, para quem nunca saiu da casca do desenvolvimento de sites com códigos entranhados em HTML e quem nunca teve contato com Orientação a Objeto (O.O.), entender o funcionamento do Cake é algo que precisa de atenção especial. Isso não significa que seja dificil, só quero dizer que você precisa entender que passará por uma readaptação.

O Cake ajuda você a organizar a sua aplicação separando cada "área" do seu sistema.
Por exemplo, dentro da pasta da sua aplicação(normalmente /app) você encontra a pasta views. Nesta pasta serão armazenados os arquivos responsáveis por mostrar as saídas de dados (uma lista de itens cadastrados no banco de dados por exemplo) ou um painel para uma ação solicitada pelo usuário (um formulário que permita a inclusão de itens no banco de dados).

Essas ações e solicitações são controladas pelos Controllers através de funções. Ele interage com os arquivos de visão enviando e recebendo informações através da URL.

Caso seu controller de Itens tenha, no código do arquivo php, uma função chamada Adicionar, esta deverá ter um view correspondente com o mesmo nome da função.

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

quarta-feira, 29 de outubro de 2008

Cakephp - Libs

uses(string $lib1, $lib2, $lib3...)

Usado para carregar bibliotecas do núcleo do CakePHP(encontradas em cake/libs/).

sábado, 18 de outubro de 2008

CakePHP - algumas regras

Venho estudando o manual deste framework que conheci em uma palestra internacional.
Criar posts relacionados ao que tenho estudado é uma maneira de fixar o que venho estudando.
  • Nomes de arquivos são underscored e nomes de classes são camelcased;
Estrutura do CakePHP
Controllers - callbacks
  • beforeFilter(), executado antes de alguma ação do controller
  • beforeRender(), executado depois de uma ação do controller mas antes de uma ação do view
  • afterFilter(), executado depois da ação do controller e do view

quinta-feira, 16 de outubro de 2008

CLEAN URL EasyPHP 2.0

CakePhp, meus primeiros passos (clean url, mod_rewrite, cakephp css) ...
As alterações abaixo são necessárias para que você rode o CakePhp fazendo uso de "clean url" e também possa visualizar as páginas padrões com suas folhas de estilos (css), caso contrário será exibido html e texto puro.

As alterações devem ser feitas em : C:\Program Files\EasyPHP_2.0b1\conf_files\httpd.conf

That the change should be made in the file (on Windows) C:\Program Files\EasyPHP_2.0b1\conf_files\httpd.conf

For EsayPHP 2
1. (Uncomment this) remova a tralha desta linha:
#LoadModule rewrite_module modules/mod_rewrite.so

2. (Under Change) Próximo de "Options Indexes FollowSymLinks" altere esta linha :

AllowOverride None
(to) para :
AllowOverride All

terça-feira, 9 de setembro de 2008

JAVA and JAVA 4 WEB

Apostilas de Java e java para WEB

http://blog.caelum.com.br/apostilas/

POPUPS

Classic javascript popups windows

Player simples ( simple player )

var UniqueID = 314 // Make each link open in a new window
var newWinOffset = 0 // Position of first pop-up

function PlayerOpen(soundfiledesc,soundfilepath) {
PlayWin = window.open('',UniqueID,'width=320,height=120,top=' + newWinOffset +',left=0,resizable=0,scrollbars=0,titlebar=0,toolbar=0,menubar=0,status=0,directories=0,personalbar=0');
PlayWin.focus();

var winContent = "<html><head><title>" + soundfiledesc + "</title></head><body bgcolor="'#000'">";
winContent += "<b style="'color:#fff;font-size:18px;font-family:Verdana,sans-serif;line-height:1.5'">" + soundfiledesc + "</b>";

winContent += "<object width="'300'" height="'42'">";
winContent += "<param name="'SRC'" value="'">";
winContent += "<param name="'AUTOPLAY'" value="'true'">";
winContent += "<param name="'CONTROLLER'" value="'true'">";
winContent += "<param name="'BGCOLOR'" value="'#FF9900'">";
winContent += "<embed src="'" autostart="'TRUE'" loop="'FALSE'" width="'300'" height="'42'" controller="'TRUE'" bgcolor="'#000'"></embed>";
winContent += "</object>";

winContent += "<p style="'color:#ccc;font-size:12px;font-family:Verdana,sans-serif;text-align:center'"><a href="'">Faça download</a> <span style="'font-size:10px'">(right-click or Option-click)</span></p>";
winContent += "</body></html>";

PlayWin.document.write(winContent);
PlayWin.document.close(); // "Finalizes" new window
UniqueID = UniqueID + 1 // newWinOffset = newWinOffset + 20 // subsequent pop-ups will be this many pixels lower
}


Exemplo :

<a href="endereço da url da música" target="_blank" onClick="javascript:PlayerOpen('Título que aparece',this.href); return false"> Seu link </a>

******************************************************************************
Janela popup dinâmica ( dinamic popup window )

function NovaJanela(mypage, myname, w, h, scroll, r) {
var winl = (screen.width - w) / 2;
var wint = (screen.height - h) / 2;
winprops = 'height='+h+',width='+w+',top='+wint+',left='+winl+',scrollbars='+scroll+',resizable='+r+''
win = window.open(mypage, myname, winprops)
if (parseInt(navigator.appVersion) >= 4) {
win.window.focus();
}
}

sábado, 9 de agosto de 2008

CHECK IT

CHECK IT OUT

http://www.webexhibits.org/
http://www.princetonol.com/groups/iad/lessons/middle/color2.htm
http://www.danielevsilva.com/category/webdesign/

sexta-feira, 18 de julho de 2008

Flash - Time delay Action Script

this.stop();
pause = function () {
play();
clearInterval(pausei);
}
pausei = setInterval(pause, 10000);

terça-feira, 15 de julho de 2008

Webdesigner 2.0: Requisitos mínimos para o upgrade profissional

JQUERY - Selecionando municípios de acordo com UF

Simple chained combobox plugin for jQuery

Very simple chained selects plugin for jQuery with JSON processing and callback feature, chain multiple selects with ease.

Chained combobox live demo

Tutorial url : http://www.codeassembly.com/Simple-chained-combobox-plugin-for-jQuery/

sexta-feira, 4 de julho de 2008

JQUERY - Multiselect transfer

Uma aplicação de selects com propriedades de transferência :

http://blog.jeremymartin.name/2008/02/easy-multi-select-transfer-with-jquery.html

JQUERY - Validando formulários

Com JQUERY podemos resumir o script de validação de formulário em uma linha :

JQUERY :

$(document).ready( function() {
$("#meuform").validate();
});

quinta-feira, 3 de julho de 2008

Retornando o ANO de um campo DATETIME

Como retornar o ANO de um campo DATETIME através de uma consulta SQL ?

:: DATEPART ( unidade , data )

A função DATEPART retorna a parte especificada de uma data como um inteiro. Observe os exemplos:

SELECT DATEPART ( YEAR , '02/01/2004' )

Reposta: 2004

:: Aplicação no ASP :

sql = "SELECT * FROM tabela WHERE DATEPART(YEAR,campo_data) = 2008"
set RS=Conn.execute(sql)