Magento E-Commerce
Postado por João Vagner em 21.02.2010 10:49 Desenvolvimento web, Internet, OOP, ecommerce, frameworks, php
Quem nunca ouviu falar hoje em dia de uma das ferramentas mais completas para e-commerce disponíveis gratuitamente, se você nunca ouviu falar, esta na hora de de atualizar hein?

O Magento se tornou hoje a principal ferramenta para comercio eletrônico, alem de completo, tem a robustez do Zend Framework, e diversos conceitos de ecommerce e SEO otimizados. Tudo, quer dizer, quase tudo hoje se faz no magento sem muitas dificuldades. Alem do Zend Framework por traz em seu código, ele implementa todas as possibilidades do Pear, traz consigo uma estrutura de canais para módulos aonde a comunidade desenvolve, e você pode usufruir muito bem através de alguns comandos práticos e simples.
O Magento também esta disponível por SVN, o que facilita muito o desenvolvimento, e um padrão / qualidade de código excelente. As instalações do magento são simples, e pode ser feita muito simplesmente por qualquer um com acesso ao SSH da conta. Praticidade total. O Próximo artigo dessa serie sera a instalação e configuração básica da loja, cache, e módulos Claro, depois de nossa introdução a alguns conceitos aplicados pelo magento, tanto em código, quanto em uso de sistema.
1 – Estrutura básica de trabalho.
Existe um bom senso para se trabalhar com o magento, uma estrutura compartilhada segura muito bem, claro, desde que configurado para se tornar leve, trabalhar com cache. Veja aqui os requisitos que o magento necessita para um BOM desempenho em produção. Mas iremos ver isso mais para a frente. Agora e hora da nossa introdução a pastas do Magento. Pastas nos quais iremos ter acesso para upload e modificação de arquivos.
- app - Pasta da sua aplicação
- code - Pasta do seus modulos
- comunity
- core
- local
- design - Pasta aonde toda a estrutura de layout, blocos, xml e xhtml (.phtml), sao armazenados
- adminhtml
- frontend
- install
- etc – Pasta de XML de configurações de sua loja
- locale – Pasta com as linguas instaladas em sua Loja, tipo pt_BR, En, fr_FR, etc
- code - Pasta do seus modulos
- media – Pasta aonde as imagens do seu catalogo sao armazenadas, recortadas e trabalhadas.
- var – Pasta de exportação de dados, backups do banco e etc
- skin – Pasta aonde encontrados o css, javascript e imagem relativa a nosso tema.
- adminhtml
- frontend
- install
Se você for curioso deve estar se perguntando porque as pastas frontend estão com enfase, simples, porque são elas as responsáveis por nosso front-end, html, css, javascript, blocos, etc. Ali e onde a magica ocorre e o template ou tema toma vida.
Pronto, agora já visto a estrutura de pasta do magento, você já sabe aonde e porque deve mexer, cada coisas em seus lugares formando uma plataforma versátil de comercio eletrônico.
2 – O Conceito de “EAV” e Base de Dados.
O magento trabalha com modelo de EAV em suas tabelas. Agora você desenvolvedor deve estar pensando que a coisa esta se complicando. Na verdade esta simplificando. Entramos agora no conceito de Entity-Attribute-Value.
O Modelo proposto de EAV e totalmente oposto da modelagem comum, O modelo simples de modelagem seguindo o ER, no futuro traz alguns obstáculos quando possui uma evolução constante, e muita vezes o modelo de dados tem que se adaptar as novas regras do jogo, e do em questão de compatibilidade, isso se torna bem ruim.
O Conceito básico do EAV e simples, tenha como ideia guardar o Objeto, o atributo e seus valores de atributos. Você esta bem blindado de mudança nas regras do jogo, pois seu modelo baseado em EAV se adapta com muita facilidade a sua necessidade.
Alguns consideram esse modelo de EAV um erro, eu vejo como um obra prima de engenharia de software. Alem de bem projetado, e muito organizado e sistemático, e possui uma ótima flexibilidade.
2 – Instalação, controle de versão e Magento Connect
O Magento traz soluções maravilhosas para melhorar as tarefas mais chatas dos sistemas hoje disponíveis. A instalação, Upgrades e Updates.
Subversion (SVN)
Atualmente você pode fazer um checkout do projeto usando subversion (SVN), que permite flexilidade um bom controle do desenvolvimento e avanços do projeto. Para quem usa Linux e não tem ainda o subversion, basta executar os comandos abaixo:
Vale a dica que para que instalações locais funcionem direitinho, e necessário o uso do Virtual Hosts, porem isso no apache 2 + Linux se torna pratico.
$: sudo apt-get install subversion
Confirme a instalação dos pacotes necessários, depois basta ir na sua pasta padrão do apache, no meu caso sempre fica na home, chamada sites:
$: cd ~/joaovagner/sites/;
$: mkdir magento ;
$: cd magento ;
Pronto, já possui sua pasta para o magento, basta agora fazer o checkout do projeto:
$: svn checkout http://svn.magentocommerce.com/source/branches/1.4
Pronto, já possui um branche do projeto, ou seja, ele esta pronto para rodar, agora caso queira manter uma workcopy basta fazer checkout do trunk, sempre em desenvolvimento, para isso recomendo uma criação de uma pasta para se manter organizado:
$: cd ~/joaovagner/sites/;
$: mkdir magento-trunk ;
$: cd magento-trunk;
Agora basta executar o checkout do trunk:
$: svn checkout http://svn.magentocommerce.com/source/branches/1.4-trunk
Instalação via SSH
A instalação por SSH se baseia simplesmente em comandos de download, disponivel aqui.
Abaixo os comandos necessários usando wget:
//Acesso minha pasta padrão do apache
$: cd ~/joaomedeiros/sites//Crio uma pasta para o magento
$: mkdir magento//Acesso a pasta que criei
$: cd magento//Uso wget para fazer o download dos pacotes, tanto o magento em sí como o arquivo de dados de exemplos
$: wget http://www.magentocommerce.com/downloads/assets/1.4.0.0/magento-1.4.0.0.tar.gz
$: wget http://www.magentocommerce.com/downloads/assets/1.2.0/magento-sample-data-1.2.0.tar.gz//Descompactação dos pacotes baixados
$: tar -zxvf magento-1.4.0.0.tar.gz
$: tar -zxvf magento-sample-data-1.2.0.tar.gz// Movemos as imagens de exemplo para a pasta correnta de media
$: mv magento-sample-data-1.2.0/media/* magento/media///movendo os registros no banco de exemplo para a a pasta magento
$: mv magento-sample-data-1.2.0/magento_sample_data_for_1.2.0.sql magento/data.sql
//Movendo o .htaccess para interpretação de regras personalizáveis do magento
$: mv magento/* magento/.htaccess .//Setando permissão de escritas na pasta correta, pois a instalação vai precisar
$: chmod o+w var var/.htaccess app/etc//Permissão recursiva na pasta de media de imagens de produtos do magento.
$: chmod -R o+w media//Aqui eu uso o .SQL para inserir dados de exemplo de produtos + CMS + homepage.
$: mysql -h localhost -u seuuserdobanco -psuasenha magento_database < data.sql//Atualização de pacotes e instalação do canal de upgrade e update do magento connect no pear.
$: ./pear mage-setup .
$: ./pear install magento-core/Mage_All_Latest-stable//Limpando todos os arquivos desnecessários
$: rm -rf downloader/pearlib/cache/* downloader/pearlib/download/*
$: rm -rf magento/ magento-sample-data-1.2.0/
$: rm -rf magento-1.4.0.0.tar.gz magento-sample-data-1.2.0.tar.gz data.sql
Caso esteja em um MAC OS e não possua o Wget, basta usar o CURL, uma alternativa que funciona basicamente como alternativa ao wget, basta substituir o wget por curl -O
//mesmo efeito que o wget
$: curl -O http://www.magentocommerce.com/downloads/assets/1.4.0.0/magento-1.4.0.0.tar.gz
$: curl -O http://www.magentocommerce.com/downloads/assets/1.2.0/magento-sample-data-1.2.0.tar.gz
Pronto, agora basta acessar a URL localhost e executar a instalação, claro, novamente recomendo o uso do Virtual Hosts para que isso possa fluir melhor.
Agora basta acessar, ai: http://magento.localhost/ (Interpretando que esse e seu virtual host!)
Caso você utilize Windows, pode usar o pacote Magento and Zend Server – Unified Installer e executar sua instalação no Windows com Zend Server e já um pacote do Magento. Eu nunca executei tal teste, não tenho certeza de como funciona e os passos!
Dicas e macetes em problemas de Instalações + Permissões
Como ja venho a tempos executando instalações, entendendo os processos e funcionalidades do magento, venho já armazenando e guardando alguns macetes de problemas recorrentes que enfrento, tanto em servidores conhecidos da IW2 como em terceiros, e as vezes ate localmente.
Instalação e erro 505
Comigo sempre ocorre de um upgrade ou nova instalação, ocorrer erro500, o famoso “Internal Server Error”, isso pode ser corrigido com Shell Script:
$: cd magento ;
$: find . -type d -print | xargs chmod 755
$: find . -type f -print0 | xargs -0 -n1 chmod 644
$: chmod 775 app/etc var var/.htaccess && chmod -R 775 media
Problema Resolvido
Menu Administrativo parou de funcionar! O Que eu faço?!
Esse problema ocorre devido a compilação do javascript, e simples resolver, e já e um problema frequente:
Passo 1 – Abrir o Arquivo com problema
O Arquivo que esta causando esse problema se localiza na seguinte path: app/code/core/Mage/Page/Block/Html/Head.php
Basta renomear o Head.php para head.php. No Terminal basta executar o comando mv:
$: cd magento;
$: mv pp/code/core/Mage/Page/Block/Html/Head.php app/code/core/Mage/Page/Block/Html/head.php
Passo 2 - Permissões corretas
Esses arquivos precisam de permissões corretas para que o Browser tenha o retorno necessário:
$: cd magento;
$: chmod 755 js/ ;
$: chmod 644 js/lib/ ;
$: chmod 644 js/index.php ;
Pronto, seu menu está perfeito! Seu Magento esta pronto para trabalhar!
Tags: ecommerce, frameworks, magento, varien, zend framework
Pequena “Introdução” a comandos linux.
Postado por João Vagner em 20.12.2009 10:16 Geral, Internet, Linux
Calma gente, não e so o buda que escreve não, nao esqueci de vocês não!
$: Existem facilidades ao uso da plataforma Mac Os, e Linux, como os dois são baseados em Unix, seus comandos são os mesmos, alguns sao muito bons, e irei fazer uma lista de usos dos mesmos para facilitar a vida de quem esta iniciando em um Ubuntu ou Mac os. Alguns comandos sao simples, apesar disso, ainda pouco utilizados.
SCP – Secure Copy
Uso Comum:
$: scp meuarquivo.txt usuario@computador_ou_ip: /pasta/arquivo\
Com recurso de modificação da porta:
$: scp minhapasta/ usuario@ip_ou_computador: /pasta/destino/ -p 92366
Unzip – Decompress file
uso comum:
$: unzip arquivo.zip
Uso com criação de pasta:
$: unzip -qd arquivo.zip
Mysql Dump – Dump Databases
Uso comum:
$: mysql -h localhost -u root -psenha minha-base > arquivo.sql
Uso comum para todas as bases:
$: mysql -h localhost -u root -psenha –all-databases > arquivo.sql
Nota: Note que o -p = senha, e sempre colado no -p mesmo. Sendo assim -psuasenha.
Cal – Simples Calendario no Shell
Uso comum:
$: cal
Retorno:
December 2009
Su Mo Tu We Th Fr Sa
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Para obter dos ultimos 3 meses:
$: cal -3
Para obter os calendarios de algum mes de um ano anterior:
$: cal 10 2000
October 2000
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Nota: Para outros formatos consulte: cal –help.
Find – Obtenha resultados rapidamente!
Consulta rapida na pasta para um arquivo:
$: find -name ‘meu_arquivo.htm’
Ou
Consulta geral para um arquivo:
$: find / -name ‘meu_arquivo.htm’
Nota: Isso pode ser bem demorado… Recomendo algo como indicar a pasta para otimizar o resultado da busca:
$: find /home/meuperfil -name ‘meu_arquivo.htm’ ;
Você tambem pode procurar por tamanho de arquivo:
$: find -name ‘*’ -size +1000k
Ou caso nao lembre o tipo de arquivo, somente parte do nome:
$: find -name ‘meu_arquivo*’
O retorno e algo como:
meu_arquivo.htm,
meu_arquivo.txt,
meu_arquivo.png …..
Bom, essa lista so tende a crescer, em breve, irei atualizando e informando que a mesma foi atualizada, ou pelo twitter ou em novos posts ;)
Caso queiram contribuir com seus comandos mais usados e praticados, para facilitar a vida, basta ir enviando nos comentarios e irei adicionando.
Tags: comandos, Linux, utilidades
Usando um player customizado para vídeos do youtube (javascript)
Postado por Tobias em 11.08.2009 10:47 Desenvolvimento web, Internet, javascript
E ae gente, blz…
Como sempre depois de alguns milênios sem postar estou de volta, o título do post já diz tudo, mas de qualquer maneira vai aqui uma introdução do post de hoje. Vamos ver um exemplo de uso da API do youtube, como comandar o vídeo utilizando somente javascript, vale ressaltar que a unica coisa em flash usada no player vai ser justamente o vídeo, todo o resto é javascript, html e css, “conversando” com a api do youtube…
Então vamos ao que interessa.
Antes de mais nada é bom ressaltar que o youtube tem uma API que na minha opinião é excelente e pode ser usada para diversas coisas do site, não só para assistir/usar os vídeos mas também para criar uma busca personalizada e outras coisinhas, para maiores informações clique aqui
Nesse post só quero mostrar o que eles chamam de “chromeless player”, traduzindo ao pé da letra seria o player sem botoões, só a tela do vídeo, etc. Você pode ver um exemplo desse player aqui.
Bom vasculhando o código fonte do exemplo a gente encontra um exemplo do que é possivel fazer com esse player, existem muitas funções que vão desde as mais básicas (como play, pause, stop) até algumas outras mais complexas como controle de volume e tempo do vídeo, no próximo post eu vou mostrar um exemplo utilizando jquery com direito a progress bar e controle de volume…
Como sempre puxões de orelha e correções são bem vindas nos comentários, abraços e até breve.
Tags: css, customizando, javascript, player, videoplayer, youtube
Encontro de desenvolvedores CAKE Sao Paulo
Postado por João Vagner em 17.06.2009 05:53 Desenvolvimento web, Internet, cakephp, frameworks, php
Bom dia pessoal,
Estive presente no Encontro de desenvolvedores CAKE em Sao Paulo, e posso dizer que foi um bom encontro, palestras de nivel muito bom, aonde foi abordado desde a criação de um helper ate a criação, plugins, ambiente de testes, brincadeiras e criação com o bake.
Algumas palestras em destaques para TDD – Test-Driven Development e Testes Automatizados com CakePHP, aonde foram abordados assuntos que vem ja a algum tempo sendo levado em conta que e desde a engenharia de software ate a cobertura de testes dos codigos. Abordados tipos de testes: Unitarios, Aceitação, entre outros. Palestras de Rodrigo Moyle e José Pedrini.
Apos isso uma outra palestra de nivel incrivel sobre criação e consumo de webservices com CAKEPHP que foi criado e desenvolvido um webservive utilizando REST. Parabéns ao Carlos Pires da 2KM que veio de Minas para nos prestegiar com sua palestra e sua participação no evento.
Um grade destaque também a palestra do Rafael Santos, que nos mostrou como construir uma plataforma RAD para Flex com CakePHP e Fake, apresentando inovações como o FAKE e integrações bem legais entre Flex e CAKEPHP, aonde se utiliza todos os recursos, desde validations, ate os models e controllers, nao deixando a desejar nem um pouco.
Parabéns aos Organizadores, ao Renan Gonçalves que se esforçou e fez acontecer e valer a pena o evento. Troca de conhecimentose fortalecimento da comunidade CAKEPHP e PHP no Brasil e em São Paulo.
Minha Palestra:
Tags: cakephp, Desenvolvimento web
OOP no PHP: Overloading, utilizando os métodos mágicos do PHP
Postado por Tobias em 16.04.2009 04:56 Desenvolvimento web, Geral, Internet, OOP, php
E aeeeeew blz? Bom gente voltando do período de preguiça bagarai, vício em jogos online e outras vagabundagens ociosidade vamos dar continuidade a série de artigos sobre OOP no PHP. O assunto de hoje é bem interessante, no post de hoje vamos ver como usar um dos métodos mágicos do php.
Neste artigo vou falar do método mágico __call(), que funciona da seguinte maneira:
Quando uma classe tem o método __call() o php roda esse método sempre que qualquer método da classe for chamado, mesmo se o método que foi chamado não existir um método inexistente ou inacessível for chamado (obrigado Edgar pelo puxão de orelha), isso abre espaço para algumas coisas interessantes.
Vamos a um exemplo do funcionamento de __call():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?php class ExemploCall { function __call($m, $a) { print "Método chamado: $m\n"; print "Parametros: \n"; var_dump($a); return $this->x; } } $call = new ExemploCall(); $call->test(1,2,'teste'); //Mostra na tela /* Método chamado: test Parametros: array(3) { [0]=> int(1) [1]=> int(2) [2]=> string(5) "teste" } */ ?> |
O exemplo acima simplesmente exibe na tela o método chamado e os parametros enviados, mas vendo isso a pergunta que surge na cabeça é, pra que ou onde eu vou usar o método __call()?
A resposta pra essa pergunta vai da sua criatividade mas eu vou postar aqui uma forma de uso que o cakephp usava há algum tempo atrás.
Funcionava da seguinte forma, havia um método padrão chamado find que era chamado e fazia consultas ao banco de acordo com os parametros passados, porém, (aqui que vem a mágica) ele também podia ser chamado como findByNomeDoCampo o que em alguns momentos facilitava bastante a vida do programador, vamos fazer algo parecido com isso.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | <?php /** Só vou postar o código relevante aos métodos mágicos, mas supõe-se que deste ponto em diante você já tem incluido no arquivo toda a rotina de conexão com o banco de dados, etc, etc, etc... **/ class Model { public function __construct() { //O conteúdo deste método vai variar de acordo com sua classe } public function __call($method, $params) { // Verifica se o método chamado existe nessa classe if ( method_exists($this,$method) ) { //Caso exista chama o método return call_user_method($method, $this, $params); } else { //Caso não exista, chama um método especial que fará a nossa mágica $this->parseMethods($method,$params); } } private function parseMethods($method,$params) { //Verifica se o método segue o padrão adotado if ( eregi('findBy',$method) === false ) { //Caso não siga dispara um erro dizendo que o método é inválido/não encontrado trigger_error('Método inválido ou inexistente',E_USER_ERROR); die; } else { //Caso seja um método padronizado (findByAlgo) recupera o nome do campo e converte tudo para minúsculo $fieldName = strtolower(str_ireplace('findBy','',$method)); //Formata os parametros para serem passados ao método find padrão $options = $params['1']; $options['conditions'] = array($fieldName=>$params['0']); //Chama o método find original $this->find($options); } } public function find($options) { var_dump($options); //Aqui você faria a consulta usando as informações recebidas } } //Instancia a classe $model = new Model(); //Define parametros a serem passados $options = array ( 'fields' => array ('*') ,'order' => array ('nome ASC') ); //Chama o método mágico // Onde o primeiro parametro é o valor que o campo passado no nome do método deve ter. $model->findByBlog('Technócio',$options); /** O que chega no método options é: array(3) { ["fields"] => array(1) { [0]=> string(1) "*" } ["order"] => array(1) { [0]=> string(8) "nome ASC" } ["conditions"] => array(1) { ["blog"]=> string(9) "Technócio" } } **/ ?> |
O código ta bem comentado e bem simples também, embora não tenha me aprofundado muito no assunto acho que deu pra ter uma noção dessa possibilidade e do que pode ser feito com isso.
Como sempre, para dúvidas, sugestões e puxões de orelha, utilizem os comentários. Até a próxima (que dessa vez não vai ser tão demorada assim).
Tags: call, Desenvolvimento web, metodos magicos, OOP, php, php5, __call
Bloqueio de rota administrativa do CakePHP
Postado por João Vagner em 12.03.2009 08:34 Destaques, Geral, Internet, OOP, frameworks, php
Olá Pessoal,
Quem utiliza o Fremwork CakePHP sabe que é uma mão na roda o route admin. Nos poupa um bocado de trabalho criar as funções da administração do site. Isso graças ao “Bake” Porém a rota não pode ficar totalmente acessivel a qualquer um, certo?
O Jonathan Snook escreveu um artigo em relação a isso, porém em alguns testes por aqui nenhum realmente funcionou utilizando .htaccess para proteção dessa rota com password.
Password Protecting Admin Functions in CakePHP.
O Conceito da proteção no artigo do Jonathan Snook é simples, E pode ser gerado com qualquer um que possua acesso ao SSH do site. Não é necessário acesso root para esses tipos de ações no servidor.
Seu servidor não te da acesso ao SSH? Está na hora de mudar para a IW²
O primeiro passo dessa proteção se dá ao inserir seguinte conteúdo no seu .htaccess :
1 2 3 4 | AuthUserFile /diretorio/passwd/protecao AuthName "Administracao CAKE" AuthType Basic Require valid-user |
Com acesso ao ssh utilize o seguinte comando dentro da pasta “www”.
htpasswd -c /diretorio/passwd/protecao username
.
Isso gera um arquivo com a senha criptografada! Caso queira barar o arquivo gerado para verificar fiquem à vontade!
Bons testes, aqui nunca funcionou!
Meu jeitinho
A maneira no qual eu utilizo é a verificação simples de variavel, ou seja, apenas um usuário dentro do código no qual após o POST, verifica os dados, e grava uma sessão, se os mesmos forem iguais.
Primeiro passo é abrir o seu /app/config/routes.php, e crie uma rota chamada admin, usando o controller de páginas estáticas. Veja:
1 | Router::connect('/admin/', array('controller' => 'pages', 'action' => 'display', 'admin')); |
Agora crie um arquivo chamado admin.ctp dentro da pasta /app/views/pages/ com um formulário básico para login e senha:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?php //Define o layout padrão para a página $this->layout = 'admin'; ?> <h1><?php __('Administração');?></h1> <?php // Caso ocorra algum erro, é exibido em sua div correta! if(isset($error)) { echo "<div class='error'>" . $error . "</div>"; } ?> <?php /* criamos um formulário com o vetor User, indicando a rota /admin/login, onde teremos nossa verificação de usuário e senha para registro da sessão da administração, e acesso ao restante dos actions _admin_ */ echo $form->create('User', array('url'=>'/admin/login/')); ?> <fieldset> <legend>Digite os dados</legend> <?php echo $form->input('username', array('label'=>'Login')); ?> <?php echo $form->input('password', array('label'=>'Senha', 'id'=>'Senha')); ?> <?php echo $form->end('Logar!'); ?> </fieldset> </form> |
O próximo passo é criar uma nova rota no /app/config/routes.php, rota no qual foi definida na URL do nosso formulário, onde será submetida os dados para verificação.
1 | Router::connect('/admin/login/', array('controller' => 'users', 'action' => 'admLogin')); |
Claro, obviamente eu já possuo um controller chamado users, caso não tenha, pode cria-lo, utilizando o código abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <?php class UsersController extends AppController { var $name = 'Users'; var $helpers = array('Html', 'Form'); /* Claro, que aqui irão outras actions suas ;) */ function admLogin() { //verifica se o post possui alguma informação para registrar o nosso array com informações if($this->data) { $dbuser = array('username'=='Administrador', 'password'=>'Sua_senha_aqui'); if(($this->data['User']['username'] == $dbuser['username']) && ($this->data['User']['password'] == $dbuser['password'])) { $this->Session->Write('admin', $dbuser); // registra a sessão "admin" para futuras verificações $this->Session->setFlash('Logado com sucesso'); //Notifica o sucesso ao logar! $this->redirect('/admin/users/index'); // redireciona para a action index do controller users. } else { $this->Session->setFlash('Erro! Dados inválidos'); // notifica o erro } } } } ?> |
Note que por enquanto o nosso controller users possui apenas um action. Fica a seu critério a criação do resto do conteúdo ;)
Agora iremos criar a função para verificação da sessão:
1 2 3 4 5 6 7 8 9 | <?php function checkAdminSession() { if (!$this->Session->check('admin')) { $this->Session->setFlash('Você não tem acesso a essa área'); $this->redirect('/admin/login/'); } } ?> |
A minha recomendação é que coloque essa função dentro do arquivo /app/app_controller.php no qual o cake carrega automáticamente. Esse arquivo serve para colocar as funções que vai utilizar em todos os controllers, sem a necessidade de ficar repetindo os mesmos.
Agora vem a parte mais interessante, vamos inserir o beforeFilter(); também dentro do /app/app_controller.php, para verificação do parametro /admin/ na url, e execução da verificação da sessão. Veja:
1 2 3 4 5 6 7 8 | <?php function beforeFilter() { if(isset($this->params['admin'])) { $this->checkAdminSession(); } } ?> |
O que a função faz é: Se existe algum parametro na url “admin”, executa a função checkAdminSession e veja se existe a sessão “admin”. Se não existir a sessão, a checkAdminSession redireciona para login.
Pronto, e assim você tem uma certa segurança em relação a rota /admin/ não estar sendo visualizada por tudo e por todos!
Tags: cakephp, Desenvolvimento web, frameworks
I Encontro | PHPSP
Postado por João Vagner em 06.02.2009 10:28 Destaques, Geral, Internet, php
É com muito prazer que a IW² e a coordenação do grupo PHPSP anunciam o primeiro encontro do PHP-SP. O intuito do encontro é ser simples, objetivo e funcional: para que o networking e a troca de conhecimento possa ser ainda mais efetivos e positivos.
Esse primeiro encontro do grupo tem o objetivo e foco totalmente voltado para a tecnologia Zend Framework, decidido através de votação com direito a duas palestras totalmente direcionadas ao assunto.
Uma “pequena” surpresa: Reunimos (por enquanto) 4 ZCEs, simulado da php|architect para o exame de certificação. O simulado é bem próximo do exame de certificação real da Zend, e onde os ZCEs farão o simulado inteiro ao vivo: comentando questão por questão, citando as pegadinhas e os conhecimentos necessários para passar na certificação.
Quer tirar sua certificação Zend ? Essa palestra é para você!
Quer aprofundar seus conhecimentos sobre PHP ? É para você também!
Nosso número para participação do evento é bem limitado e só poderão entrar as pessoas que confirmaram a presença! Mas lembre-se, não esqueça de levar 1kg de alimento não perecível para ajudarmos instituições de caridades escolhidas por votação em nossa lista.
Programação
- 10:00h ~ 13:45h – Simulado da Certificação Zend
- 13:45h ~ 15:00h – Almoço
- 15:15h ~ 17:00h – Palestra Zend Framework
Local:
Burti Mooca ( Rua Dias Leme 130 – Moóca – São Paulo )
Valor:
1Kg de alimento não-perecível (ainda estamos definindo uma instituição a ser ajudada; se você quiser dar uma segestão, mande um comentário).
Ao vivo!
Você vai poder acompanhar a transmissão ao vivo do evento ou ler posteriormente o resumo das palestras e fazer download dos arquivos aqui no 15seg.com
Preparativos
Conseguimos algumas fotos dos preparativos…
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Leitura de XML – Parte 2 SimpleXML
Postado por João Vagner em 24.12.2008 10:00 Desenvolvimento web, Destaques, Internet, php
Olá Pessoal,
Primeiramente, post de dia 24 de Dezembro, desejos a todos um Feliz Natal, que estejam todos ai junto a amigos e familiares curtindo uma data especial.
Bom, demorei um pouco, mas chegou, a segunta parte de Leitura de XML usando SimpleXML, dessa vez vou usar alguns modelos, ao invez de trabalhar com o nosso Feed de RSS, vamos trabalhar com valores de cambio e pesquisa de CEP. Tudo simples e em poucas linhas.
Primeiramente precisamos de algum XML que seja atualizado, com os valores que temos que trabalhar. Para isso existe esse endereço: http://www.republicavirtual.com.br/cotacao/exemplos.php
Não posso garantir 100% de uptime do link, pois não sei se algo vai mudar ok? Mas iremos trabalhar em cima dos retornos desse xml, ok?
Simple XML
O objetivo é fornecer acesso aos documentos XML usando propriedades de objetos e iterators, não é uma extensão complicada (são poucos métodos) mas é bastante flexível.
Exemplo Básico
Importando o XML da URL:
1 | $file = simplexml_load_file('http://cotacao.republicavirtual.com.br/web_cotacao.php?formato=xml'); |
Iniciando o trabalho
Aqui vamos pegar o valor do dolar comercial para compras:
1 2 3 4 | // importando o arquivo $file = simplexml_load_file('http://cotacao.republicavirtual.com.br/web_cotacao.php?formato=xml'); // pegando a tag dolar_commercial_compra echo $file->dolar_comercial_compra; |
As tags que podemos trabalhar podem ser encontrada nesse XML
1 2 3 4 5 6 7 8 9 10 | <webservicecotacao> <dolar_comercial_compra>2,1260</dolar_comercial_compra> <dolar_comercial_venda>2,1280</dolar_comercial_venda> <dolar_paralelo_compra>2,2200</dolar_paralelo_compra> <dolar_paralelo_venda>2,3000</dolar_paralelo_venda> <euro_dolar_compra>1,2410</euro_dolar_compra> <euro_dolar_venda>1,2410</euro_dolar_venda> <euro_real_compra>2,6384</euro_real_compra> <euro_real_venda>2,6408</euro_real_venda> </webservicecotacao> |
Viram como é simples trabalhar com o SimpleXML? Agora vamos trabalhar para achar endereços de CEP ;) O XML que iremos trabalhar emcima é desse modelo:
Trabalhando com CEP
Código:
1 2 3 4 5 6 7 8 9 10 | <?xml version="1.0" encoding="iso-8859-1" ?> <webservicecep> <resultado>1</resultado> <resultado_txt>sucesso - cep completo</resultado_txt> <uf>SP</uf> <cidade>São Paulo</cidade> <bairro>Santana</bairro> <tipo_logradouro>Rua</tipo_logradouro> <logradouro>Duarte de Azevedo</logradouro> </webservicecep> |
A URL que iremos importar as consultas é: http://cep.republicavirtual.com.br/web_cep.php?cep=02036021&formato=xml
Vamos ao Código:
1 2 3 4 5 6 7 | $file = simplexml_load_file('http://cep.republicavirtual.com.br/web_cep.php?cep=02036021&formato=xml'); echo "UF: " .$file->uf; echo "<br />Cidade: " .$file->cidade; echo "<br />Bairro: " .$file->bairro; echo "<br />Tipo de Logradouro: " .$file->tipo_logradouro; echo "<br />Endereço: " .$file->logradouro; |
Não recomendo que essa aplicação rode atravez da url de pesquisa, a base de dados pode ser baixada nesse endereço: Download
É isso, viram como é simples integrar uma pesquisa de CEP pra completar formulários de cadastros e tudo mais? Agora é com vocês ;)
Tags: Desenvolvimento web, php, simplexml, xml
Leitura de XML – Parte 1 DOM XML
Postado por João Vagner em 09.12.2008 12:49 Desenvolvimento web, Internet, php
Já precisaram ler algum XML, de algum lugar, trabalhar com esses valores? Se ainda não precisaram, podem ter a absoluta convicção que esse dia chegará.
Alguns aplicativos ja usam o XML como transmissão de informações, ou recepção de informações. Importar ou exportar um arquivo XML é simples, fácil e rápido, basta manter um padrão para ler dentro de suas tags ou escrever dentro das mesmas.
Alguns sistemas, blogs, entre outros dispostivos, ja estão trabalhando totalmente ou parcialmente com XML, cada um usando formatações diferentes, porém a estrutura do arquivo sempre o mesmo com a marcação de tags, exemplo de um XML comum de RSS do nosso proprio blog TECHNÓCIL:
Nosso XML:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | <?xml version="1.0" encoding="UTF-8"?> <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" > <channel> <title>technocil.com</title> <atom:link href="http://technocil.com/feed/" rel="self" type="application/rss+xml" /> <link>http://technocil.com</link> <description></description> <pubDate>Tue, 09 Dec 2008 14:30:28 +0000</pubDate> <generator>http://wordpress.org/?v=2.6.5</generator> <language>en</language> <item> <title>Primeiro post, Apresentação…</title> <link>http://technocil.com/2008/12/09/primeiro-post-apresentacao/</link> <comments>http://technocil.com/2008/12/09/primeiro-post-apresentacao/#comments</comments> <pubDate>Tue, 09 Dec 2008 14:29:10 +0000</pubDate> <dc:creator>Tobias</dc:creator> <category><![CDATA[Geral]]></category> <category><![CDATA[Apresentacao]]></category> <category><![CDATA[Technócil]]></category> <guid isPermaLink="false">http://technocil.com/?p=121</guid> <description><![CDATA[nossa descrição do post [...]]]></description> <content:encoded><![CDATA[<p>Todo Conteudo do post</p> <p>Segundo paragrafo</p>]]></content:encoded> <wfw:commentRss>http://technocil.com/2008/12/09/primeiro-post-apresentacao/feed/</wfw:commentRss> </item> </channel> </rss> |
Um tanto quanto grande nosso XML né? Porém ele é ótimo para o exemplo devido aos niveis de title, e description, que irá nos exemplos abaixo.
Agora imaginem como ler ou obter os dados desse nosso RSS (XML). Para isso existem várias maneiras, algumas são usando algumas funções do PHP como a file_get_contents. Exemplo:
1 2 3 4 5 6 7 | <?php $conteudo = file_get_contents('http://technocil.com/feed/'); echo $conteudo; ?> |
Dependendo do seu navegador, o que será impresso é RSS(XML) do nosso blog, ou abrindo o código fonte do que for impresso, verá todo o XML impresso. No meu caso que uso o Opera, precisarei abrir o código fonte para ver o XML Impresso lá. Agora depois trabalhar com esses dados podem ser por expressão regular, e por ai vai, é um trabalhão dessa maneira. O XML não é dinamico, não pode ser interpretado pelo servidor, pode somente ser lido. Para escrever um XML com valores dinamicos sim, se usa usa PHP, e definindo no header o tipo de documento XML, porém ainda não chegamos ao ponto de escrever nenhum XML.
Então para fugir do trabalho duro e chato qual a maneira mais fácil e rápida de trabalhar com XML e seus valores?
São as mais conhecidas duas, usando uma extensão do php chamada DOM XML, que foi revisada no PHP 4.3.0 para trabalhar corretamente com o Padrão DOM, e segunda opção é a SimpleXML.
Instalação do DOM XML
A instalação é simples, basta descomentar a linha do php.ini que possui a extensão domxml.dll ou .so:
extension=php_domxml.dll
No meu caso, como uso o XAMPP 1.6.7, eu comentei a linha, pois a mesma apresentava um erro ao tentar utilizar, e eu apenas comentei e ela voltou a funcionar, no site do PHP Consta alguns avisos de versões, dependendo da sua versão do php, elas são válidas ou não:
Nota: Esta extensão foi movida para o repositório » PECL e não é mais distribuida em conjunto com o PHP a partir do PHP 5.0.0.
Nota: Esta extensão não está mais marcada como experimental. Ele será, contudo, nunca liberada com PHP 5, e irá somente ser distribuida com PHP 4. Se você precisa de suporte a DOM XML com PHP 5, você pode usar a extensão DOM. Esta extensão domxml não é compatível com a extensão DOM.
Alguns servidores web, porém tem dificuldade em trabalhar com essa biblioteca, um exemplo é a Locaweb (não vo divulgar o nome do cliente), que sofreu para que pudessem colocar esse componente tão simples no servidor. Mas isso vai de cliente a cliente. Eu aproveitando o gancho vou divulgar a IW² onde possui SVN (controle de versão), SSH e bibliotecas desses e outros usos liberadas, que hospeda aqui o TECHNOCIL.
Vamos aos códigos do DOM XML:
1 2 3 4 | //aqui iniciamos o trabalho com o DOM, definindo o cabeçalho como versão do XML 1.0, e trabalhando com o charset em UTF-8; $doc = new DOMDocument('1.0?', 'UTF-8?'); // aqui fazemos o load de todo o conteúdo do XML $doc->load('http://technocil.com/feed/'); |
Primeira fase completa, ja pegamos todo o conteudo do XML, ja iniciamos a extensão do DOM, e ja podemos usar os seus componentes:
1 2 3 | //exibe o titulo : technocil.com; pegando da tag title na raiz do XML: <title>technocil.com</title> $titulo = $doc->getElementsByTagName("title")->item(0)->nodeValue; echo $titulo ; |
Caso eu queira o titulo do post eu tenho que entrar dentro dos niveis do XML:
1 2 3 | // observe o item(1); Estamos trabalhando com niveis, parecidos com array, onde temos [0], [1], ['titulo']; $tituloPost = $doc->getElementsByTagName("title")->item(1)->nodeValue; echo $tituloPost ; |
Agora vamos pegar a descrição do Post:
1 2 3 | // observe que estamos ainda usando o item(1), ainda estamos em um segundo nivel das marcações $DescricaoPost = $doc->getElementsByTagName("description")->item(1)->nodeValue; echo $DescricaoPost ; |
Para ler esse conteudo dinamicamente, pode se trabalhar com foreach, listando nos ->item($i) um valor de listagem contando quantos posts possuem no XML. Agora é só brincarem ;)
Na parte dois, posto um exemplo de como pegar e trabalhar com os dados de Frete dos Correios, usando o XML de resposta das consultas por URL, e na parte 3, como trabalhar com o SimpleXML, no qual eu considero mais trabalhoso e chato.
Até mais!








