Solução para ‘bug’ de Horário de Verão (Daylight Saving)

1, novembro, 2010 admin Sem comentários

Ao som de: Audioslave – Original Fire ♫

Fala galera, depois de quase 1 ano sem passar por aqui, dessa vez não por falta de tempo e sim por um pouco de preguiça confesso, venho trazer a vocês uma possivel solução para um problema que passei na empresa onde trabalho. Trago a solução

Problema: Ao utilizar o componente CalendarExtender so .net (configurado para apresentar em pt-BR) não é possivel selecionar a data 17/10/2010 (ou qualquer outra data que sejá ‘virada’ de horário de verão), onde ao selecionar o dia 17 ele automaticamente apresentava dia 16 e se inserir manualmente dia 17 o componente retorna como uma ‘Data Inválida”.

Causa: No Brasil o horário de verão entra em vigor à meia noite, adiantando assim o relógio para 1h da manhã, nosso GMT é -3 e no horário de verão -2, o que acontece, é que como à meia noite ele automaticamente vai para 1h a hora “17/10/2010 00:00:00″ passa a não mais existir, o problema não é o GMT, o problema é que não dá para configurar a função getDate() do javascript (imbutido no Calendar Extender).

Tentativa de solução: Tentar interceptar no global.asax ao solicitar uma data ao .net adicionar 1 hora, assim o “limbo da meia noite” seria contornado. Achei muitas dificuldades em conseguir ‘setar’ essa 1 hora, todos os métodos e propriedades referentes a Daylight Saving são apenas get e não é possivel modificar o getDate() utilizado.

Foi aí que lembrei que em um dos meus projetos pessoais utilizei jQuery para apresentar um calendário ao usuário, chama-se Date Picker, para utiliza-lo basta adicionar em seu formulário a API jQuery UI, é um componente totalmente personalizavel. Porém, pensando no conceito de reutilização de código criei um UserControl onde já é adicionado todas as referências de Javascript cabendo apenas referenciar o CSS nas páginas. Isso porque se eu adicionar o CSS no controle, a cada chamada do controle será colocado uma tag <link..>.

Criei um novo website (C#) utilizado o MS Visual Studio 2010, nomeei de DatePickerTest, modifiquei o web.config para poder utilizar alguns recursos do MS AjaxToolkit, criei uma pasta chamada dll, coloquei minha dll do toolkit e referenciei no projeto (o post não é para aprender a utilizar o toolkit então não entrarei muito em detalhes nesse post. No final colocarei um link com todo projeto configurado e funcionando).

Criei uma nova pasta chamada Controls, que será onde colocaremos os controles do projeto (tenho mania de organização), dentro dela adicionei um novo UserControl chamado DateBox.ascx

DateBox.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="DateBox.ascx.cs" Inherits="DatePickerTest.Controls.DateBox" %>
<asp:ScriptManagerProxy ID="sm" runat="server" ClientIDMode="Predictable" />
<asp:TextBox runat="server" ClientIDMode="Predictable" ID="dateTextBox" Width="70px" MaxLength="10" />
<asp:RequiredFieldValidator ID="required" runat="server" ClientIDMode="Predictable" ControlToValidate="dateTextBox" ErrorMessage="Campo obrigatório" Display="None" Enabled="false" />
<asp:ValidatorCalloutExtender ID="ValCallExtRequired" TargetControlID="required" runat="server" ClientIDMode="Predictable" HighlightCssClass="ReqWarn" />
<asp:CustomValidator runat="server" ID="CustomVal" ControlToValidate="dateTextBox" ClientValidationFunction="validateDate" Display="None" EnableClientScript="true" ErrorMessage="Data inválida." ClientIDMode="Predictable" HighlightCssClass="ReqWarn" />
<asp:ValidatorCalloutExtender ID="ValidatorCalloutExtender1" TargetControlID="CustomVal" runat="server" ClientIDMode="Predictable" HighlightCssClass="ReqWarn" />

DateBox.ascx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace DatePickerTest.Controls
{
[ValidationProperty("Date")]
public partial class DateBox : UserControl
{
protected void Page_Init(object sender, EventArgs e)
{
sm.Scripts.Add(new ScriptReference("~/scripts/jquery-1.3.2.js"));
sm.Scripts.Add(new ScriptReference("~/scripts/jquery.ui.core.js"));
sm.Scripts.Add(new ScriptReference("~/scripts/jquery.ui.datepicker.js"));
sm.Scripts.Add(new ScriptReference("~/scripts/util.js"));
}

protected void Page_PreRender(object sender, EventArgs e)
{
string script = @"$(function () {
$('#" + dateTextBox.ClientID + @"').datepicker({
showButtonPanel: true,
currentText: 'Hoje',
duration: 100,
dateFormat: 'dd/mm/yy',
showOn: 'button',
buttonImage: '/mapfrecap/img/calendario.gif',
buttonImageOnly: true,
dayNames: ['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado', 'Domingo'],
dayNamesMin: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S', 'D'],
dayNamesShort: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb', 'Dom'],
monthNames: ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'],
monthNamesShort: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'],
nextText: 'Próximo',
prevText: 'Anterior',
closeText: 'Fechar',
buttonText: 'Calendário',
showOtherMonths: true,
selectOtherMonths: true
});";
if (!Enabled)
script += "$('#" + dateTextBox.ClientID + @"').datepicker('disable');";
script += @"});";

ScriptManager.RegisterStartupScript(this, typeof(DateBox), "initDateBox" + dateTextBox.ClientID, script, true);
}
public DateTime? Date
{
get
{
return dateTextBox.Text != string.Empty ? (DateTime?)DateTime.Parse(dateTextBox.Text) : null;
}
set
{
dateTextBox.Text = value.Value.ToString("d");
}
}

public String ValidationGroup
{
get { return required.ValidationGroup; }
set { required.ValidationGroup = value; CustomVal.ValidationGroup = value; }
}

public bool Required
{
get { return required.Enabled; }
set { required.Enabled = value; }
}

public bool Enabled { get { return dateTextBox.Enabled; } set { dateTextBox.Enabled = value; } }
public bool ReadOnly { get { return dateTextBox.ReadOnly; } set { dateTextBox.ReadOnly = value; } }

public event EventHandler TextChanged { add { dateTextBox.TextChanged += value; } remove { dateTextBox.TextChanged -= value; } }
public bool AutoPostBack
{
get { return dateTextBox.AutoPostBack; }
set { dateTextBox.AutoPostBack = value; }
}

public override string ClientID
{
get
{
return dateTextBox.ClientID;
}
}
}
}

Até aqui o componente está finalizado, com algumas particularidades que eu mesmo implementei, como uma validação de o campo será obrigatório ou nao (Required), se o componente estará ativo ou nao (Enabled), propriedade de AutoPostBack, ValidationGroup, etc. Caso surja dúvidas sobre o código “[ValidationProperty("Date")]” explico aqui… Esse código é para ‘expor’ o valor de Date (que é onde fica armazenado o valor selecionado pelo calendário) à pagina que irá utiliza-lo, podendo assim fazer validações com CompareValidator.

No nosso DateBox.ascx temos um ClientValidationFunction=”validateDate”, essa é a função javascript que eu fiz para validar a data do nosso calendário, é aqui que contornamos o problema de horario de verão, dentro da nossa pasta ‘scripts’ teremos um arquivo chamado ‘util.js’ com o seguinte conteúdo:

util.js

function validateDate(oSrc, args) {
var iDay, iMonth, iYear;
var arrValues;
arrValues = args.Value.split("/");
iDay = arrValues[0];
iMonth = arrValues[1];
iYear = arrValues[2];

var testDate = new Date(iYear, iMonth - 1, iDay, 4, 0, 0, 0);
if ((testDate.getDate() != iDay) ||
(testDate.getMonth() != iMonth - 1) ||
(testDate.getFullYear() != iYear)) {
args.IsValid = false;
return;
}

return true;
}

O que nos importa nessa validação é parte em negrito => var testDate = new Date(iYear, iMonth – 1, iDay, 4, 0, 0, 0);
Ali estamos adicionando 4 horas à data selecionada, eliminando assim o “limbo” da meia noite não existente, como só queremos mesmo é a Data e nao o horário, isso resolve nosso problema. Tudo isso porque não conseguimos sobrescrever a função de getDate() do CalendarExtender.

Agora um pequeno exemplo do como utiliza-lo:

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="DatePickerTest.Default" %>

<%@ Register Src="~/Controls/DateBox.ascx" TagName="DateBox" TagPrefix="uc" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<link rel="stylesheet" href="~/styles/jquery-ui-1.7.3.custom.css" type="text/css" media="screen" runat="server" />
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="sm" runat="server" />
<div>
<uc:DateBox runat="server" ID="edtData" />
</div>
</form>
</body>
</html>

Simple não? Só precisamos fazer 3 coisas:

1 – Registrar o componente => <%@ Register Src=”~/Controls/DateBox.ascx” TagName=”DateBox” TagPrefix=”uc” %>
2 – Adicionar o CSS (pelo motivo dito na introdução do post)
3 – Adicionar o componente onde você precisar => <uc:DateBox runat=”server” ID=”edtData” />

Para obter o valor pelo seu CS é só utilizar ‘nomeComponente.Date’ como é um nullable em alguns casos você pode precisar utilizar um .Value (nomeComponente.Date).
Galera, espero que todos tenham entendido, caso contrario só comentar dizendo qual linha não entendeu que eu tiro as dúvidas, e em casos de erro especificar exatamente o erro, com linha e o código da linha para que fique mais facil de ajudar. Abaixo o projeto com nosso DateBox funcionando pra quem quiser, não coloquei online pois minha hospedagem é PHP =/

Baixar projeto de exemplo

Grande abraço, até a próxima.

VN:F [1.9.5_1105]
Rating: 5.0/5 (3 votes cast)
VN:F [1.9.5_1105]
Rating: +3 (from 3 votes)

Post to Twitter . Post to Delicious . Post to Digg . Post to Facebook . Post to MySpace .

IETester – Vários Engines do IE num único programa

25, novembro, 2009 Leandro Barral Sem comentários

Galera, hoje venho pra apresentar pra quem não conhece um programa que tenho utilizado bastante aqui na empresa, e já cheguei até a mostrá-lo em reuniões para que seja adotado por outros desenvolvedores, nome dele é IETester, atualmente está na versão 0.4.2 e possui leves 25mb, nele é emulado os engines do IE 5.5 ao 8.0, só lembrando que deve-se ter no minimo a versão 7 instalada para que a emulação da versão 8.0 seja feita sem nenhum problema.
O programa pode ser baixado pelo link já mencionado. O programa é “easy-to-use“, sendo assim qualquer dúvida, só postar um comentário.

Screenshot do IETester

Screenshot do IETester

Espero que aproveitem!

VN:F [1.9.5_1105]
Rating: 5.0/5 (2 votes cast)
VN:F [1.9.5_1105]
Rating: +1 (from 1 vote)

Post to Twitter . Post to Delicious . Post to Digg . Post to Facebook . Post to MySpace .

Zend – Trabalhando com Módulos

28, outubro, 2009 Leandro Barral 4 comentários
Ao som de: Neil Young – Down by the river ♫
E aí pessoal!
Hoje vou explicar como trabalhar com modulos no Zend.
O que consiste o termo “modulos”, seria basicamente, você criar um sistema que terá vários ‘sub sistemas’, como por exemplo um CMS (ex: Joomla, PhpNuke, etc), você tem um sistema principal de gerenciamento, onde apenas administradores terão acesso, e varios outros sistemas em que o usuário ou redatores do site por exemplo, usufruirá, como área de downloads, artigos, fotos, e por aí vai.
Ao invés de criar sistemas individuais para trabalhar, gerenciar e apresentar cada um deles, é utilizado a mesma estrutura/sistema para trabalhar com todos, apenas adicionando e removendo determinados modulos.
A ‘configuração’ no zend pra isso é simples, no arquivo de boostrap (o index.php, onde contém todas as configurações de caminho do Framework, visoes, formato de data e tudo mais, assunto já abordado em outro artigo aqui do blog ‘Zend – Início’.) você deve localizar a linha que se inicia com:

$frontController->setControllerDirectory.....

E modificar para por exemplo:

$frontController->setControllerDirectory('./application/noticias/controllers');

$frontController->addControllerDirectory('./application/admin/controllers', 'admin');

$frontController->addControllerDirectory('./application/fotos/controllers', 'fotos');

Qual a diferença entre os dois códigos? Pois bem, “setControllerDirectory” diz ao Zend qual o controlador (módulo) padrão, aquele que será exibido caso não seja especificado nenhum no link; e o “addControllerDirectory” diz ao Zend os módulos adicionais, com o caminho dele no sistema e um nome/alias para ele que será utilizado no link para acesso.
No caso ao acessar a raiz do sistema www.site.com ele acessa por padrão o módulo noticias, sem ser necessário adicionar o /noticias no link, e para acessar os outros apenas entrar em www.site.com/nome-alias (admin ou fotos como no exemplo).

Além dessa configuração no bootstrap precisamos modificar um pouco a estrutura de pastas do projeto, como segue a imagem abaixo:

Estrutura de pastas Estrutura de pastas

Na pasta application, estarão todos os módulos e dentro de cada um a estrutura padrão para trabalhar com o Zend.

Espero que todos tenham gostado e qualquer dúvida só postar um comentário que eu ajudo com certeza a resolver.

Abraços.

VN:F [1.9.5_1105]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.5_1105]
Rating: 0 (from 0 votes)

Post to Twitter . Post to Delicious . Post to Digg . Post to Facebook . Post to MySpace .

Ordenando Tabelas com jQuery

12, outubro, 2009 Leandro Barral Sem comentários

Venho hoje quase fim de feriado postar um plugin que achei muito interessante, e fácil de usar, diga-se de passagem. Se chama TableSorter, ele nada mais faz do que ordenar sua tabela conforme quiser, o mais legal é que ele suporta paginação e tem como ordenar mais de uma coluna ao mesmo tempo, aqui vou postar o básico e pra quem tiver dificuldade em entender a documentação (em inglês) posta um comentário que eu coloco exemplos mais “bem elaborados”, pois bem, tenha certeza que tem o jQuery linkado em sua páginae que tenha baixado a versão mais recente do plugin com um dos “temas” disponiveis (azul e verde). Linkado todos os arquivos (jquery, tablesorter e os css do tema) vamos para os códigos.
Vamos tomar base em uma tabela com thead e tbody (padrão w3c para criação de tabelas) com o seguinte conteúdo:

<table id="TabelaOrdenada">
<thead>
<tr>
<th>Primeiro Nome</th>
<th>Último Nome</th>
<th>Email</th>
<th>Profissão</th>
<th>Site</th>
</tr>
</thead>
<tbody>
<tr>
<td>Leandro</td>
<td>Barral</td>
<td>webmaster@leandrobarral.com.br</td>
<td>Controlador Operacional</td>
<td>http://blog.leandrobarral.com.br</td>
</tr>
<tr>
<td>José</td>
<td>Benedito</td>
<td>jbenedito@yahoo.com.br</td>
<td>Auxiliar Geral</td>
<td>N/D</td>
</tr>
<tr>
<td>Maria</td>
<td>João</td>
<td>maju@hotmail.com</td>
<td>Dona de Casa</td>
<td>http://www.orkut.com/meu-id-do-orkut</td>
</tr>
<tr>
<td>Karine</td>
<td>Natali</td>
<td>ka.natali@gmail.com</td>
<td>Auxiliar de Classe</td>
<td>http://www.saborcereja.co.cc</td>
</tr>
</tbody>
</table>

Até aqui apenas uma tabela, com os nomes fora de ordem e tal, agora vem o plugin que nada mais é que:

$(document).ready(function() // quando estiver carregado faça...
{
$("#TabelaOrdenada").tablesorter(); // inicia o plugin, e... só!
}
)

Somente isso! Se quiserem ordenar por mais de um parametro segure shift e clique nas colunas desejadas. O plugin aceita vários muitos outros parametros, como iniciar com uma ou algumas colunas ordenadas, pegar resultados via requisições ajax e colocar na tabela, habilitar ordenar somente as colunas que quiser, etc…
Espero que tenham gostado, qualquer dúvida só postar um comentário que ajudarei com certeza.

Links úteis:
Link Oficial do Projeto
Site do Criador
Demonstrações Online

Até a próxima! E tenham todos um ótimo final de feriado!

VN:F [1.9.5_1105]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.5_1105]
Rating: +1 (from 1 vote)

Post to Twitter . Post to Delicious . Post to Digg . Post to Facebook . Post to MySpace .

Fases de Desenvolvimento

8, outubro, 2009 Leandro Barral 1 comentário

Galera eu freqüento alguns fóruns sobre Programação e alguns de Distribuições Linux, e vejo bastantes posts sobre o que é e como denominar as fases de um projeto.
Pra falar a verdade não existe um padrão ou regras oficiais que definem as nomenclaturas, porém, tem alguns padrões “não-oficiais” que vou postar aqui para vocês, o que eu sei e o que tenho visto que é mais utilizado.

É importante sabermos que uma distribuição (release) possui um ciclo de vida. Onde, cada um é responsável por descrever a estabilidade do produto e também de mostrar quanto desenvolvimento ainda será necessário antes de entregar a versão final.
O ciclo de vida é, em geral, mais ou menos assim:
- pre-alpha => é a versão que fica restrita somente à organização/equipe que desenvolve o software, não tem todas as funcionalidades ainda ou está em fase de estruturamento.
- alpha => é a versão que está em construção e que foi disponibilizada para a área de homologação, que é geralmente interna à comunidade ou organização que desenvolve o software.
- beta
=> é a primeira versão lançada fora da organização ou da comunidade que desenvolve o produto, para efeitos de avaliação ou de testes de caixa preta.
- release candidate
=> refere-se a liberação de uma versão com potencial para se tornar o produto final. Nesta fase, o produto apresenta todas as funcionalidades concebidas sem a presença de bugs impeditivos;
- final ou gold
=> é a versão final de um determinado produto e normalmente é quase idêntica à release candidate, só que acrescida apenas da correção de pequenos bugs identificados nos testes finais. É considerada muito estável e relativamente livre de bugs, possuindo assim uma qualidade adequada para ampla distribuição e utilização por parte dos usuários finais.

Ok Leandro mas e aqueles números de versão tipo 1.2.1, 0.1.7, ou como exemplo mais conhecido o Firefox que atualmente está na versão 3.5.3? Como é feito isso?

Então, para identificarmos unicamente uma distribuição utilizamos um esquema numérico(sequencial e incremental). Este esquema geralmente é composto por três números separados por pontos.
Para compreender melhor, dê uma olhada no esquema abaixo:
X.x.x -> Major Release -> Possui novas funcionalidades significativas
x.X.x -> Minor Release -> Melhorias em cima da Major Release
x.x.X -> Revision Release -> Correções de Bugs
Bom pessoal espero ter tirado a dúvida de vocês sobre esses termos. Qualquer outra dúvida só postar um comentário.
Até a próxima.
VN:F [1.9.5_1105]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.5_1105]
Rating: 0 (from 0 votes)

Post to Twitter . Post to Delicious . Post to Digg . Post to Facebook . Post to MySpace .

Categories: Curiosidades Tags:

Promoção – Quero meu blog.com

27, setembro, 2009 Leandro Barral Sem comentários

[update 2]
Como dito no update abaixo, esse post torna-se agora não fixo e o link para acesso ao blog ganhador é ==> www.CarasDeSP.com
Desfrutem de um blog de excelente qualidade.
Obrigado novamente à todos que mandaram links.
Dezembro tem mais!
[/update 2]

[update]
Recebi vários links pelo wlm e twitter, e resolvi dar o domínio para o blog [Caras de São Paulo], são 8 estudantes de Jornalismo da PUC de São Paulo, que buscam mostrar a real cara de São Paulo, o blog estará no ar essa semana, então estarei editando esse post, que tornar-se-á não fixo a partir do momento que atualizar com o link.
Agradeço à todos que postaram! E em dezembro tem mais promoções, dessa vez com brindes e gadgets sensacionais.
[/update]

Galera, é o seguinte:
Estou sorteando um domínio .com  pra quem tem algum blog hospedado em sites gratuitos, tipo wordpress, blogger, blogspot, etc, que mantém seus blogs com um dominio comprido e difícil de memorizar (ex.: programatik.blogspot.com), o intuito é sortear para quem tem uma média de posts mensais razoáveis.
Algumas regras básicas,  não é permitido sites:
- Com conteúdo de pirataria e afins;
- Que mantém conteúdo pornográfico;
-  Que infrinjam direitos reservados;
- Que mantenham conteúdo racista, ou que promova qualquer tipo de exclusão social.

Para participar é simples! Basta fazer um comentário nesse post dizendo o conteúdo do seu blog, o porque você merece e um link para avaliação.
Indiquem o blog à seus amigos e colegas.

Conto com a participação de todos!

Att.,
Leandro Barral.

VN:F [1.9.5_1105]
Rating: 5.0/5 (4 votes cast)
VN:F [1.9.5_1105]
Rating: +5 (from 5 votes)

Post to Twitter . Post to Delicious . Post to Digg . Post to Facebook . Post to MySpace .

Categories: Promoção Tags: ,

Validando Formulários com Zend Framework

27, setembro, 2009 Leandro Barral 4 comentários

Esse é o segundo tutorial sobre Zend.
Hoje vou mostrar como validar um formulário usando a classe Validate do Zend.

Primeiramente crie um formulário básico:

<form action="<?php echo $this->baseUrl;  ?>/formulario/validar" method="post">
<table border="0">
<tbody>
<tr>
<td>Nome do Produto:</td>
<td><input name="nome" type="text" /></td>
</tr>
<tr>
<td>Valor Produto:</td>
<td><input name="valor" type="text" /></td>
</tr>
</tbody></table>
<input type="submit" value="Validar" />
</form>

E agora vamos ao mais importante que é o controlador para a validação:
/application/controllers/FormularioController.php

class FormularioController extends Zend_Controller_Action
{
function validar(){
$nome  = $this->_request->getParam("nome");
$valor = $this->_request->getParam("valor");

/* Instanciando os validadores */
$validNome       = new Zend_Validate_StringLength(1,100);
$validValor      = new Zend_Validate_Float();

/* Aqui Personaliza as mensagens e os tipos de validação */
$validNome->setMessage(
/* Aqui se o campo estiver vazio */
"Campo nome é obrigatório".,
Zend_Validate_StringLength::TOO_SHORT);

$validNome->setMessage(
/* Aqui se for maior que 100 */
"Campo nome maior que o permitido.",
Zend_Validate_StringLength::TOO_LONG);

$validValor->setMessage(
/* E aqui se não for float */
"Campo valor nao é um número válido.",
Zend_Validate_Float::NOT_FLOAT);

/* Aqui é verificado se os valores digitados sao válidos */
if ( $validNome->isValid(trim($nome)) &amp;&amp;
$validNome->isValid($nome) &amp;&amp;
$validValor->isValid($valor) ){

/* Se for: executa os procedimentos para insercao
Que foram omitidos pois não o objetivo desse post */
} else {
/* Se não forem válidos junta as mensagens em um array */
$this->view->msg = array_merge( $validNome->getMessages(), $validValor->getMessages() );
/* $msg tem todas os erros, agora na camada de visão você pode mostrá-los
como desejar */
}
}
}

Eu carrego as mensagens de erro de um arquivo .ini e jogo na tela fica mais fácil se eu precisar usar a mesma mensagem em outros formulários ou inseções.
Aconselho a todos darem uma olhada na documentação sobre o Zend_Validate, não é só string e float não, ele valida data, IP, email…
No próximo post vou mostrar como personalizar essa validação de formulário usando em conjunto com o Zend um outro framework, porém esse é em JS, chamado jQuery, junto com um plugin fica muito mais profissional o serviço, que vai funcionar se a pessoa tiver Js habilitado, se não tiver ele usa a validação do Zend.

Até a próxima.

VN:F [1.9.5_1105]
Rating: 5.0/5 (1 vote cast)
VN:F [1.9.5_1105]
Rating: 0 (from 2 votes)

Post to Twitter . Post to Delicious . Post to Digg . Post to Facebook . Post to MySpace .

Zend – Início

24, setembro, 2009 Leandro Barral 1 comentário

Olá pessoal, esse é o blog que a partir de hoje pretendo começar a postar dicas, tutoriais, novidades, etc.

Não terei uma periodicidade para postar, vou colocando aqui conteúdo conforme for aparecendo assuntos!

Programo em PHP/MySQL há 6 anos, tenho experiência com Delphi 7, SQL Server 2000, Java..

Hoje, venho dizer um pouco sobre o framework que estou, vamos dizer, “vidrado”, o framework da Zend (empresa que hoje mantém as versões do PHP), é um fw [framework] muito bem escrito, cheio de recursos, desde manipulação com banco de dados até criação de rss e web services!

Não sou nenhum profissional ainda na ferramenta, porém já estou desenvolvendo um sistema grande com ele.

Vamos ao que interessa: Como começar!

Para começar temos alguns requisitos minimos:

- PHP 5; [download aqui] [atualmente na versão 5.3.0]
- Apache com mod_rewrite habilitado ou qualquer outro servidor que tenha reescrita de url; [vou postar um tutorial de como habilitar]
- O Zend; [download aqui] [atualmente na versao 1.9.1, recomendo a versão full]
- Conhecimento básico da linguagem [PHP];
- Desejável algum conhecimento com orientação a objetos;
- Vontade de aprender.

Depois disso vamos partir para a configuração do Zend, estrutura de pastas, bootstrap, etc…

Primeiramente baixe o Zend e descompacte-o em qualquer lugar do seu micro, nela estará contido varios diretórios, demos, tests, library.. para nós apenas interessa a pasta library, copie essa pasta para a raiz do seu servidor, no meu caso “public_html/”, alguns servidores “www/”, “htdocs”, tem algumas variações..

Nossa estrutura de arquivos deve ficar assim:

estrutura-zend

Vou explicar, a pasta application é subdividida em 3 pastas, sendo elas Controllers, Views e Models, perceberam? MVC, cada um trabalha com uma parte da aplicação:

M – Models: Onde você criará as classes para manipular o banco de dados;
V – Views: Aqui é onde ficará a parte visual, os templates das páginas (vocês entenderão com o próximos tutoriais);
C – Controllers: Aqui fica toda a manipulação dos dados, vindos ou não do usuário, validações, etc. É onde você cria a lógica e tal.

O ZF (Zend Frameworks) trabalha com url limpas (www.site.com/artigos/php/id/2), e tudo passa pelo arquivo index.php [nosso bootstrap], o conteúdo dele é extenso, então é só clicar aqui e pegar o conteúdo, o arquivo está totalmente comentado, qualquer dúvida futura só postar..

Porém, para usarmos (desfrutarmos) das url limpas temos que ter alguns arquivos .htaccess e certas pastas, vou postar o local onde devem ficar e o conteúdo de cada uma delas, esses arquivos serão responsaveis tanto para a utilização das url limpas quanto para segurança de algumas pastas…

Local: /zf-basico1/.htaccess [raiz ok?]

Conteúdo:

RewriteEngine on
RewriteRule .* index.php
php_flag magic_quotes_gpc off
php_flag register_globals off

Explicação: Primeiro nos certificamos que está habilitado a reescrita de url, logo após dizemos que tudo deverá passar pelo index.php “para saber oque fazer”, e nas duas últimas linhas nos certificamos que magic_quotes e register_global estão desabilitadoa, se não estiverem disabilita-os.

Local: /zf-basico1/public/.htaccess

Conteúdo:

RewriteEngine off

Explicação: Desabilitamos a reescrita de url para essa pasta.

Local: /zf-basico1/application/.htaccess

Conteúdo:

deny from all

Explicação: Aqui nós bloqueamos qualquer tentativa de acesso às pastas onde ficará nossa aplicação e arquivos de configuração e acesso ao banco de dados e etc.. não queremos ninguém bisbilhotando não é?

Porém depois de tudo isso se você for acessar a index do sistema dará uma exception enooorme aí, correto?

Fatal error: Uncaught exception ‘Zend_Controller_Dispatcher_Exception’ with message ‘Invalid controller specified (index)’…..

Ela quer dizer oquê? Fiz alguma coisa errada?

Não, isso quer dizer apenas que a aplicação nao possui um Controlador para o index.

Mas como eu crio esse negócio de controlador?

Bem, vamos criá-lo agora. Crie um arquivo chamado IndexController dentro da pasta “./application/controllers/” com o seguinte conteúdo:

<?php
class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
$this->view->boasvindas = "Bem-vindo ao Zend!";
}
}
?>

Tentem acessar a index novamente, dará outra exception enorme mais ou menos assim:

Fatal error: Uncaught exception ‘Zend_View_Exception’ with message ‘script ‘index/index.phtml’…

Essa quer dizer que a aplicação não conseguiu encontrar um arquivo de template para a index, lembra que eu disse sobre o MVC, tudo separado, independente e tal? Então, para cada action você terá um template (arquivos .phtml) que exibirá os dados que você manipular nos controllers.. Complicado no começo mas com o passar dos tutoriais você entenderá!

Ok, para criar um index.phtml você o deve criar dentro da pasta “./application/views/scripts” uma pasta chamada.. Adivinha… chamada index!

index.phtml

<?php
echo $this->boasvindas;

Acessando o index você receberá uma mensagem: “Bem-vindo ao Zend!”

Galera, estou exausto, escrevi pra caramba! Qualquer dúvida comentem que eu farei o possível para responder!

P.S.: Tentem colocar no link www.seu-site.com/zf-basico1/index/index/ irá cair na index, note que não existe uma pasta index e outra index dentro da raiz do site!

Aguardem novos tutoriais..

Espero que tenham gostado!

Até a próxima.

VN:F [1.9.5_1105]
Rating: 4.3/5 (3 votes cast)
VN:F [1.9.5_1105]
Rating: +3 (from 3 votes)

Post to Twitter . Post to Delicious . Post to Digg . Post to Facebook . Post to MySpace .

Olá, mundo!

20, setembro, 2009 Leandro Barral 1 comentário

Salve galera! Depois de um bom tempo fora do blog volto com um tema novo, idéias novas,  mais conhecimento, abordando mais linguagens.. Só Melhorias!
O outro blog hospedado em um host péssimo! “barato”, foi hackeado por falta de firewall e anti-vírus no servidor, perdi minha base de dados com todos os outros posts, meus temas personalizados, enfim, TUDO!
Agora estou usando a UOL como host. Espero que eles, com toda infra-estrutura,  não deixem mais serem causados transtornos desse tipo!

Venho apenas informar que a partir de amanhã, estarei voltando a postar sobre programação, design, novidades e soluções simples para problemas complicados do dia-a-dia, com um pouco de atraso entre os posts pois estou criando o sistema de gerenciamento de uma revista online que estarei lançando até o final do ano.

Abraço à todos e espero voltar a ter meus 200 pageviews diários.

Att.,
Leandro Barral.

VN:F [1.9.5_1105]
Rating: 5.0/5 (2 votes cast)
VN:F [1.9.5_1105]
Rating: +2 (from 2 votes)

Post to Twitter . Post to Delicious . Post to Digg . Post to Facebook . Post to MySpace .

Categories: O começo Tags: , ,