<?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"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Webpoint</title>
	<atom:link href="http://blog.alexandremagno.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.alexandremagno.net</link>
	<description>Weblosofia com desenvolvimento web</description>
	<lastBuildDate>Sat, 05 May 2012 01:11:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Vamos começar por Bootstrap</title>
		<link>http://blog.alexandremagno.net/2011/09/vamos-comecar-por-bootstrap/</link>
		<comments>http://blog.alexandremagno.net/2011/09/vamos-comecar-por-bootstrap/#comments</comments>
		<pubDate>Tue, 20 Sep 2011 05:32:50 +0000</pubDate>
		<dc:creator>alexanmtz</dc:creator>
				<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[UX]]></category>
		<category><![CDATA[bootstrap]]></category>
		<category><![CDATA[código]]></category>
		<category><![CDATA[elementos]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[projeto]]></category>
		<category><![CDATA[snippet]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.alexandremagno.net/?p=202</guid>
		<description><![CDATA[Desde os guias de design, até os padrões de interação, temos a eterna necessidade de definir os padrões e a consistência em uma aplicação web de modo a reutilizar o máximo possível os elementos de design. Se não bastasse isto, o twitter, com o Bootstrap foi além e implementou um framework onde há todos os [...]]]></description>
			<content:encoded><![CDATA[<p>Desde os guias de design, até os padrões de interação, temos a eterna necessidade de definir os padrões e a consistência em uma aplicação web de modo a reutilizar o máximo possível os elementos de design. Se não bastasse isto, o twitter, com o Bootstrap foi além e implementou um framework onde há todos os elementos de um website, seguindo todo o estilo padrão de estilo do twitter, e Open Source! Eles o chamaram de <a title="Bootstrap from Twitter" href="http://twitter.github.com/bootstrap/#">bootstrap</a>.</p>
<p>Quais as vantagens de ter o Bootstrap no início do projeto ou até mesmo usar o <a title="Bootstrap from Twitter" href="http://twitter.github.com/bootstrap/#">bootstrap do twitter</a>?<br />
Parece algo tão óbvio: padronizar todos elementos de design se evolui de um ponto em que a etapa de definição de layout perca cada vez mais peso e num mundo ideal ela nem existiria, pois o desenvolvedor front-end já iria prever com o arquiteto a experiência de uso, pois a biblioteca é suficiente para suprir todas novas funcionalidade da aplicação. Usar o próprio <a title="Bootstrap from Twitter" href="http://twitter.github.com/bootstrap/#">bootstrap do twitter</a> para prototipar é também algo extremamente útil, pois ele é bastante simples, limpo, agnóstico e com todos os recursos de CSS3.</p>
<p>Outra grande vantagens é para projetos novos que segue a mesma consistência visual.</p>
<p>O <a title="Bootstrap from Twitter" href="http://twitter.github.com/bootstrap/#">bootstrap</a> é orgânico, de acordo com novos elementos ele vai crescendo e a tendência é que chegue em um limite. No entanto é necessário ter no mínimo:<br />
•    Elementos do grid<br />
•    Formulários<br />
•    Tipografia<br />
•    Cabeçalhos<br />
•    Listas<br />
•    Tabelas<br />
•    Botões</p>
<p>Como vender a ideia?<br />
Muitas vezes é difícil você conseguir negociar esta etapa. Ela simplesmente é muitas vezes ignorada ou até mesmo iniciada, mas descontinuada e logo depois abandonada. Neste último caso é um sintoma de outro ponto errado, provavelmente não há um padrão e sempre existe um atrito maior quando é necessário definir várias páginas e como um comportamento deve ser em uma determinada interação, como validações de formulário.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alexandremagno.net/2011/09/vamos-comecar-por-bootstrap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jqswfupload</title>
		<link>http://blog.alexandremagno.net/2011/02/jqswfupload/</link>
		<comments>http://blog.alexandremagno.net/2011/02/jqswfupload/#comments</comments>
		<pubDate>Sat, 19 Feb 2011 19:00:59 +0000</pubDate>
		<dc:creator>alexanmtz</dc:creator>
				<category><![CDATA[Plugins]]></category>

		<guid isPermaLink="false">http://www.alexandremagno.net/blog/2011/02/19/jqswfupload-foi-reconstruido-usando-o-jquery-ui/</guid>
		<description><![CDATA[O jqswfupload foi reconstruído usando o pattern do jQuery-ui, possibilitando uma interface mais rica, customizável e melhor de ser testado. Aconselho que usem esta versão pelas seguintes razões:  O plugin atual será depreciado. Não irei mais atualizá-lo devido a vários problemas que tive de torná-lo escalável com o modelo de plugins do jQuery. A interface [...]]]></description>
			<content:encoded><![CDATA[<p>O jqswfupload foi reconstruído usando o pattern do jQuery-ui, possibilitando uma interface mais rica, customizável e melhor de ser testado. Aconselho que usem esta versão pelas seguintes razões:</p>
<ul>
<li> O plugin atual será depreciado. Não irei mais atualizá-lo devido a vários problemas que tive de torná-lo escalável com o modelo de plugins do jQuery.</li>
<li>A interface foi melhoarada, e usando o jQuery UI, você pode escolher entre vários temas e estilos para seu plugin, bem como personalizar e gerar novos temas através do <a href="http://jqueryui.com/themeroller/" target="_blank">Theme Roller </a> .</li>
<li>O plugin possui testes básicos com o Qunit, pois o pattern do jQuery ui possibilita melhor testá-lo unitariamente</li>
</ul>
<p>Espero que gostem e qualquer feedback é bem vindo.</p>
<p>Breve, postarei mais exemplos de como usá-lo.</p>
<p>Você pode ver o <a title="Projeto jqswfupload no github" href="https://github.com/alexanmtz/jqswfupload" target="_blank">projeto no github</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alexandremagno.net/2011/02/jqswfupload/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>jqswfupload 1.1</title>
		<link>http://blog.alexandremagno.net/2010/01/jqswfupload-11/</link>
		<comments>http://blog.alexandremagno.net/2010/01/jqswfupload-11/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 09:28:40 +0000</pubDate>
		<dc:creator>alexanmtz</dc:creator>
				<category><![CDATA[Plugins]]></category>

		<guid isPermaLink="false">http://www.alexandremagno.net/blog/2010/01/21/jqswfupload-11/</guid>
		<description><![CDATA[Depois de fazer um esforço para mudar a estrutura do plugin em como é chamado e não mais depender dos parâmetros do swfupload, refiz toda a lógica de opções do plugin e abstrair todas as opções do upload. Sendo assim, o plugin agora só tem um parâmetro que são as opções do plugin. Antes passando [...]]]></description>
			<content:encoded><![CDATA[<p>Depois de fazer um esforço para mudar a estrutura do plugin em como é chamado e não mais depender dos parâmetros do swfupload, refiz toda a lógica de opções do plugin e abstrair todas as opções do upload.</p>
<p><strong>Sendo assim, o plugin agora só tem um parâmetro que são as opções do plugin. Antes passando as opções do swfupload o desenvolvedor poderia quebrar o funcionamento atual sobrescrevendo eventos. Nesta versão o plugin possui todas as configurações e assim pode extender e customizar sem afetar as atuais funcionalidades.</strong></p>
<p>&nbsp;</p>
<h3><span>Documentação</span></h3>
<p><strong>Os requisitos para o funcionamento do plugin estão listado abaixo:</strong></p>
<ul>
<li>jQuery v1.3.2</li>
<li>SWFUpload v2.1</li>
<li>jQuery UI 1.7 (usando somente o efeito de highlight)</li>
</ul>
<p><strong>Suporte:</strong></p>
<ul>
<li>IE 7+</li>
<li>Chrome 1+</li>
<li>Firefox 3+</li>
<li>Safari 3+</li>
</ul>
<p><em>* Não houve teste no IE6 </em></p>
<p><strong>Utilização</strong></p>
<p>Primeiro, você deve incluir o plugin e suas dependências:<br />
[sourcecode language="html"]</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>[/sourcecode]<br />
Esta ordem é importante para que o plugin possa funcionar corretamente.</p>
<p>jqswfupload usa a biblioteca swfupload em conjunto com o jQuery. Então ele sobrescreve um simples input de arquivo com um sistema de upload múltiplos baseado em flash que possui todo o controle de progresso e tamanho do arquivo.</p>
<p>A marcação mínima para que o plugin possa funcionar está listada abaixo:<br />
[sourcecode language="html"]</p>
<div id="upload-container">
<form action="upload.php" method="post" enctype="multipart/form-data">
<div id="upload-placeholder">
<input type="file" name="Filedata" />
<input type="submit" value="upload" /></div>
</form>
</div>
<p>[/sourcecode]<br />
Com esta marcação você pode invocar o plugin com as seguintes opções:<br />
[sourcecode language="javascript"]</p>
<pre>/*
* jQuery upload - main file
*/
$(document).ready(function(){
$("#upload-container").jqswfupload({
onUploadStart: function(file) {
$('#debug-bar').append('Upload Started: '+file.name);
},
onFileSuccess: function(file,data,response) {
$('#debug-bar').append('File success: '+ file.name + data);
},
onFileError: function(file,code,message){
$('#debug-bar').append('File Error: '+ file.name + message);
},
totalSize: '100 kb',
uploadUrl: upload_uri + 'upload.php',
// The post sent to server in the same request as the file object
post_params : {
'type' : 'swfupload',
'test' : 'val'
}
});
});</pre>
<p>[/sourcecode]<br />
O plugin usa um parâmetro, um objeto literal de opções<br />
[sourcecode language="js"] $(&#8216;container&#8217;).jqswfupload(options);</p>
<p>[/sourcecode]</p>
<h3>Opções do Plugin</h3>
<ul>
<li><strong>uploadUrl</strong><br />
a url que ira receber a lógica do upload<br />
<em>tipo: string<br />
padrão: &#8216;../upload.php&#8217;</em></li>
<li><em><strong>flashUrl<br />
</strong>o caminho do arquivo swf da biblioteca swfupload</em><em><br />
tipo: string<br />
padrão: </em>&#8220;libs/swfupload.swf&#8221;</li>
<li><strong>buttomPlaceholderId</strong><br />
O id do elemento usado para identificar o container e onde tem inserido o upload do tipo file<br />
<em>tipo: string<br />
padrão: &#8216;upload-placeholder&#8217;</em></li>
<li><strong>buttomImageUrl</strong><br />
A url da imagem para adicionar o arquivo<br />
<em>tipo: string<br />
padrão: &#8216;images/icon-add.gif&#8217;</em></li>
<li><strong>buttomText</strong><em><br />
O texto do botão. ex.: &#8220;adicionar arquivos&#8221;</em><em><br />
</em>tipo: string<br />
padrão:vazio</li>
<li><strong>buttomWidth</strong><br />
A largura em pixels do botão<br />
<em>tipo: number<br />
padrão: 172</em></li>
</ul>
<ul>
<li><strong>buttomHeight</strong><br />
A altura em pixels do botão<br />
<em>tipo: number<br />
padrão: 22</em></li>
<li><strong>fileTypes</strong><em><br />
</em>Os tipos de arquivos permitidos. ex.: &#8220;*.jpg,*.png&#8221;<br />
<em>tipo: string<br />
padrão: &#8220;*.*&#8221;</em></li>
<li><strong>fileSizeLimit</strong><em><br />
O limite de cada arquivo<br />
tipo: number<br />
padrão: 10000</em></li>
<li><strong>multiple</strong><em><br />
Definir se o upload será múltiplo<br />
tipo: boolean<br />
padrão: true</em></li>
<li><strong>cursorType</strong><em><br />
Definir tipo de cursor<br />
tipo: string<br />
padrão: &#8216;hand&#8217;</em></li>
<li><strong>dialogDescription</strong><em><br />
O cabeçalho da descrição do diálogo de upload do browser<br />
tipo: string<br />
padrão: </em>&#8220;Web Image Files&#8221;</li>
<li><strong>columns</strong><br />
Os rótulos das colunas na interface de upload<br />
<em>tipo: object<br />
padrão:</em><br />
columns: {<br />
file : &#8216;File&#8217;,<br />
size : &#8216;Size&#8217;,<br />
action : &#8216;Action&#8217;<br />
}</li>
<li><strong>messages</strong><br />
As mensagens usadas para darem as diferentes notificações<br />
tipo: object<br />
padrão:<br />
messages : {<br />
file_size_limit : &#8216;You reach the total size&#8217;,<br />
file_already_exist : &#8216;Some(s) of the file already exist, the other(s) was included&#8217;,<br />
browser_upload : &#8216;Are you having problem with this upload? Try the common upload instead&#8217;,<br />
start: &#8216;Start upload&#8217;,<br />
all_completed: &#8216;All uploads are completed&#8217;<br />
}</li>
<li><strong>totalSize</strong><br />
O tamanho total dos arquivos permitidos. Pode passar em bytes, kb ou MB<br />
tipo: string<br />
padrão: &#8217;5 MB&#8217;</li>
<li><strong>messageDelay</strong><br />
O tempo que as mensagens de notifiação permanecem na tela<br />
tipo: number<br />
padrão: 3000</li>
<li><strong>post_params</strong><br />
Dados adicionais enviados via post para cada tipo de arquivo no formato chave : valor<br />
tipo: object<br />
padrão: empty object</li>
</ul>
<h2>Callbacks</h2>
<p>onFileQueue(file)<br />
onDialogClose(<span>files_selected</span><span>,</span><span>files_queued</span><span>,</span><span>total_queued</span>)<br />
onSwfuploadLoaded()<br />
onUploadStart(file)<br />
onUploadProgress(file,completed,total)<br />
onFileComplete(file)<br />
onFileError(file,error,message)<br />
onFileSuccess(file,data,response)</p>
<p>[sourcecode language="javascript"]</p>
<p>//formato dos parametros adicionais</p>
<p>post_params : {</p>
<p>&#8220;post_param_name_1&#8243; : &#8220;post_param_value_1&#8243;,</p>
<p>&#8220;post_param_name_2&#8243; : &#8220;post_param_value_2&#8243;,</p>
<p>&#8220;post_param_name_n&#8221; : &#8220;post_param_value_n&#8221;</p>
<p>},</p>
<p>[/sourcecode]</p>
<p class="entry">Para uma completa referência das opções do swfupload, veja a <a title="Swfupload documentation" href="http://demo.swfupload.org/Documentation/" target="_blank">documentação do swfupload</a></p>
<h2><span>Dúvidas frequentes</span></h2>
<p>Aqui está uma lista das dúvidas frequentes que podem ocorrer ao utilizar o jqswfupload:</p>
<h3>Qual a vantagem deste plugin em relação a utilizar o swfupload sozinho?</h3>
<p>SWFUpload é uma ótima biblioteca utilizada amplamente em grandes projetos para realizar uploads múltiplos. Ela torna fácil a integração do flash com a interface web que não seja puramente nesta tecnologia. Entretanto, o swfupload tem muitos eventos, callbacks e opções que permite a flexibilidade para o desenvolvedor criar a experiência completa de upload utilizando javascript para criar todo o dom necessário para fazer isto acontecer. Este plugin é baseado na experiência do usuário utilizada no upload de fotos do Flickr. Toda a interface pode ser customizada por CSS. Com algumas vantagens, o jqswfupload estende as funcionalidades do swfupload, como progresso geral de arquivo e limitação de tamanho máximo da fila, não simplesmente limitar o tamanho de um único arquivo. O plugin foi construído para tornar este tipo de upload da &#8220;maneira jQuery de ser&#8221; que com uma linha você pode ter tudo funcionando e você tem o objeto de opções para ter o poder de mudar de acordo com sua necessidade.</p>
<h3>O upload retorna um erro 404, o que pode ser isto?</h3>
<p>Provavelmente a opção upload_url do swfupload não está correta. Não se esqueça de tornar o link absoluto ou relativo ao caminho do plugin.</p>
<h3>Eu segui todos os passo na documentação, mas aina aparece um input de arquivos normal, o que pode ter acontecido?</h3>
<p>Provavelmente você não colocou corretamento o arquivo swf ou não modificou a opção <em>flash_url</em>. Não se esqueça que esta opção é relativa ao template.</p>
<h3>Eu posso customizar todas as opções do swfupload?</h3>
<p>Sim, usando o plugin você consegue usar os eventos do plugin que são análogos a vários eventos do swfupload, a diferença é que eles são acionados depois da interface gerada, sendo assim você pode personalizar e executar as ações que desejar</p>
<h3>Eu fiz download do plugin e o arquivo upload.php não tem nenhuma lógica de realizar upload, o que aconteceu?</h3>
<p>O script upload.php simplesmente prova que a cada upload realizado o script é chamado. O script pode ser escrito em diferentes linguagens de servidor e é assumido que quem esteja utilizando este plugin tem algum conhecimento prévio com envio de upload e o está utilizando para melhorar a experiência do usuário que é prejudicada com o upload de arquivos ormal. Se tiver algum exemplo de implementação do script de upload, <a title="Contact the author" href="http://www.alexandremagno.net/portfolio_dev/site/contato" target="_self">por favor, entre em contato<br />
</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alexandremagno.net/2010/01/jqswfupload-11/feed/</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>jQuery irá migrar do SVN para o Git</title>
		<link>http://blog.alexandremagno.net/2009/08/jquery-ira-abandonar-o-svn-como-controle-de-versao/</link>
		<comments>http://blog.alexandremagno.net/2009/08/jquery-ira-abandonar-o-svn-como-controle-de-versao/#comments</comments>
		<pubDate>Tue, 04 Aug 2009 22:02:46 +0000</pubDate>
		<dc:creator>alexanmtz</dc:creator>
				<category><![CDATA[Jquery]]></category>

		<guid isPermaLink="false">http://www.alexandremagno.net/blog/2009/08/04/jquery-ira-abandonar-o-svn-como-controle-de-versao/</guid>
		<description><![CDATA[Gostaria de repassar para todos uma mensagem que recebi do John Resig enviado para todos os comitters do jQuery que o jQuery não irá mais usar o SVN como controle de versão. Todos o seu core será passado para o Git e todos que tinham acesso ao svn para enviar plugins (como eu) terá de [...]]]></description>
			<content:encoded><![CDATA[<p>Gostaria de repassar para todos uma mensagem que recebi do John Resig enviado para todos os comitters do jQuery que o jQuery não irá mais usar o SVN como controle de versão. Todos o seu core será passado para o Git e todos que tinham acesso ao svn para enviar plugins (como eu) terá de remover os plugins do SVN para a base do jQuery ser migrada para o git. Desta forma somente o Core estará no controle de versão assim como <a href="http://en.wikipedia.org/wiki/Committer" title="Definição em inglês de commiter" target="_blank">os comitters</a> serão somente os que participam do core.</p>
<p>Todo o codebase será migrado para o Git até 15 de Agosto. Sendo assim, o projeto não estará mais hosteado no GoogleCode, mas sim no Github:<br />
<a href="http://github.com/jquery" target="_blank" rel="nofollow">http://github.com/jquery</a><br />
Então se quiserem baixar o último código fonte do projeto a partir de 15 de Agosto terão que usar o clone do Git, ou visualizar o código no Github.</p>
<p><strong>Por que a mudança?</strong><br />
Esta mudança está seguindo uma tendência normal de como o git vem crescendo para grandes projetos, por suportar múltiplos repositórios, controle de versao local, commits locais, merge automático (em alguns casos) e ser mais rápido que o SVN (e menos doloroso). Em relação aos plugins, o core do jQuery não irá mais se misturar com o restante do repositório e cada um pode gerenciar seus plugins da forma que lhe convir.<br />
Para saber mais sobre o Git:<br />
<a href="http://vainalousachefe.wordpress.com/2008/02/21/introducao-ao-controle-de-versao-local-com-git/" target="_blank" rel="nofollow"></a><a href="http://vainalousachefe.wordpress.com/2008/02/21/introducao-ao-controle-de-versao-local-com-git/" title="Introdução ao controle de versão Git" target="_blank"> http://vainalousachefe.wordpress.com/2008/02/21/introducao-ao-controle-de-versao-local-com-git/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alexandremagno.net/2009/08/jquery-ira-abandonar-o-svn-como-controle-de-versao/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Upload de arquivos com jqswfupload</title>
		<link>http://blog.alexandremagno.net/2009/07/jqswfupload-jquery-e-swfupload-em-uma-linha/</link>
		<comments>http://blog.alexandremagno.net/2009/07/jqswfupload-jquery-e-swfupload-em-uma-linha/#comments</comments>
		<pubDate>Wed, 22 Jul 2009 23:21:04 +0000</pubDate>
		<dc:creator>alexanmtz</dc:creator>
				<category><![CDATA[Plugins]]></category>

		<guid isPermaLink="false">http://www.alexandremagno.net/blog/2009/07/22/jqswfupload-jquery-e-swfupload-em-uma-linha/</guid>
		<description><![CDATA[  Gostaria de anunciar o lançamento da versão 1.0 beta do plugin que desenvolvi, o jqswfupload. Este plugin atende a uma evolução do plugin que desenvolvi que ajudou muita gente a implementar upload múltiplos utilizando o swfupload. Ele se tornou obsoleto com a versão 10 do flash player, que mudou a forma de como enviar [...]]]></description>
			<content:encoded><![CDATA[<p> <a href="http://jqswfupload.alexandremagno.net" title="Entrar no website do jqswfupload" target="_blank"><img src="http://www.alexandremagno.net/blog/wp-content/uploads/2009/07/logo.png" alt="Logo do jqswfupload" /></a><br />
Gostaria de anunciar o lançamento da versão 1.0 beta do plugin que desenvolvi, o jqswfupload. Este plugin atende a uma evolução do plugin que desenvolvi que ajudou muita gente a implementar upload múltiplos utilizando o swfupload. Ele se tornou obsoleto com a versão 10 do flash player, que mudou a forma de como enviar requisicoes ao flash atraves do javascript usando elementos html. Desta vez desenvolvi um plugin usando as versões mais nova do jQuery e do próprio swfupload que corrige este problmea com o flash player 10 e ainda funciona com players após a versão 8. O plugin é totalmente customizável e gera toda a interface de upload em uma só linha. O plugin possui opções próprias além de ter todas as opções do swfupload aptas para serem modificadas.</p>
<p>Houve também muito cuidado para preservar uma ótima experiência do usuário. A interface foi baseada no upload de fotos do Flickr.</p>
<p>O plugin terá novas versões em breve com melhorias contínuas e até a possibilidade de criar extensões para fazer upload de imagens com opção de edição como redimensionar e cortar.</p>
<p><a href="http://www.alexandremagno.net/jquery/plugins/upload/" title="Ver exemplo do plugin em ação" target="_blank"><img src="http://www.alexandremagno.net/blog/wp-content/uploads/2009/07/ver_exemplo_icone1.png" alt="Ver exemplo do jqswfupload" /></a><a href="http://jqswfupload.googlecode.com/files/jqswfupload.rar" title="Fazer download do plugin" target="_blank"><img src="http://www.alexandremagno.net/blog/wp-content/uploads/2009/07/btn-download.gif" alt="Make the download of the jqswfupload" /></a></p>
<h3><span>Documentação</span></h3>
<p><strong>Os requisitos para o funcionamento do plugin estão listado abaixo:</strong></p>
<ul>
<li>jQuery v1.3.2</li>
<li>SWFUpload v2.1</li>
<li>jQuery UI 1.7 (usando somente o efeito de highlight)</li>
</ul>
<p><strong>Suporte:</strong></p>
<ul>
<li>IE 7+</li>
<li>Chrome 1+</li>
<li>Firefox 3+</li>
<li>Safari 3+</li>
</ul>
<p><em>* Não houve teste no IE6 </em></p>
<p><strong>Utilização</strong></p>
<p>Primeiro, você deve incluir o plugin e suas dependências:<br />
[sourcecode language="html"] 
<link type="text/css" href="jquery.jqswfupload.css" rel="stylesheet" />
<p><script language="JavaScript" type="text/javascript" src="libs/jquery-1.3.2.min.js"></script></p>
<p><script language="JavaScript" type="text/javascript" src="libs/jquery-ui-1.7.1.custom.min.js"></script></p>
<p><script language="JavaScript" type="text/javascript" src="libs/swfupload.js"></script></p>
<p><script language="JavaScript" type="text/javascript" src="libs/jquery.jqswfupload.js"></script></p>
<p>[/sourcecode]<br />
Esta ordem é importante para que o plugin possa funcionar corretamente.</p>
<p>jqswfupload usa a biblioteca swfupload em conjunto com o jQuery. Então ele sobrescreve um simples input de arquivo com um sistema de upload múltiplos baseado em flash que possui todo o controle de progresso e tamanho do arquivo.</p>
<p>A marcação mínima para que o plugin possa funcionar está listada abaixo:<br />
[sourcecode language="html"] 
<div id="upload-container">
<form action="upload.php" method="post" enctype="multipart/form-data">
<div id="upload-placeholder">
<input type="file" name="Filedata" />
<input type="submit" value="upload" />
</div>
</form>
</div>
<p>[/sourcecode]<br />
Com esta marcação você pode invocar o plugin com as seguintes opções:<br />
[sourcecode language="javascript"]$(&#8220;#upload-container&#8221;).jqswfupload({<br />
onFileSuccess: function(file,data,response) {</p>
<p>//execute when happen the upload file success</p>
<p>},</p>
<p>onFileError: function(file,code,message){</p>
<p>//execute when happen the upload file error</p>
<p>}</p>
<p>},</p>
<p>{</p>
<p>upload_url:  &#8216;./upload.php&#8217;</p>
<p>});</p>
<p>[/sourcecode]<br />
O plugin aceita dois objetos como parâmetros, o primeiro são as opções do plugin como um objeto literal e o segundo um objeto de settings do swfupload.<br />
[sourcecode language="js"] $(&#8216;container&#8217;).jqswfupload(Object plugin_options, Object swfupload_options);</p>
<p>[/sourcecode]</p>
<h3>Opções do Plugin</h3>
<ul>
<li><strong>container (padrão: </strong><em>#upload-container</em><span>) </span><strong>: </strong>O seletor de contexto de onde o plugin age. Pode ser um id ou classe do formulário onde o input do tipo file está localizado.</li>
<li><strong>total_size (padrão: </strong><em>5 MB</em><strong>)</strong> : O tamanho máximo da fila total.</li>
<li><strong>message_delay (padrão: </strong><em>3000</em><strong>) : </strong>O tempo em milisegundos que as mensagens de aviso ou sucesso permanece na interface.</li>
<li><strong>columns (Padrão: </strong><em>Object</em><strong>)</strong> : O objeto com o texto padrão das colunas. As chaves do objeto são <em>file</em>, <em>size</em> and <em>action </em>que referenciam ao arquivo, tamanho e ação (remover arquivo). Quando uma das opções é passada, é obrigatório que você especifique as demais.</li>
<li><strong>messages (padrão: </strong><em>Object</em><strong>)</strong> : O objeto com mensagens padrões. As chaves atualmente são <em>file_size_limit</em>, <em>file_already_exist, browse_upload </em>e<em> start. </em>Quando uma das opções é passada, é obrigatório que você especifique as demais.</li>
<li><strong>onFileSucces(file,data,response)</strong> : O callback invocado a cada sucesso do arquivo
<ul>
<li><strong>file:</strong> Um objeto que carrega informações do arquivo, como nome, tamanho e um identificador único</li>
<li><strong>data:</strong> Os dados enviados ao servidor</li>
<li><strong>response:</strong> A resposta vinda do servidor. Esta é a resposta dada pelo script de upload e você pode retornar json, xml ou pedaços de html para serem tratados.</li>
</ul>
</li>
<li><strong>onFileError(file,error,message)</strong>
<ul>
<li><strong>file:</strong> Um objeto que carrega informações do arquivo, como nome, tamanho e um identificador único</li>
<li><strong>error:</strong> O código de erro do arquivo</li>
<li><strong>message:</strong> A mensagem de erro</li>
</ul>
</li>
</ul>
<h3><span>Opções do swfupload</span></h3>
<ul>
<li><strong>upload_url (padrão: </strong><em>../upload.php</em><strong> ):</strong> A url relativa ao plugin</li>
<li><strong>flash_url (padrão: </strong><em>libs/swfupload.swf</em><strong>) </strong>: O caminho do arquivo swfupload.swf relativa ao local onde o script é chamado</li>
<li><strong>button_placeholder_id (padrão: </strong><em>upload-placeholder</em><strong>):</strong> O id do elemento que será substituído pelo upload em flasho, geralmente o input id ou uma div pai do input do tipo file</li>
<li><strong>post_params (Objeto) :</strong> Dados adicionais para serem enviados junto com o post do arquivo. Neste post você pode enviar dados de formulário, identificadores de sessão etc. Ele segue o seguinte formato:</li>
</ul>
<p>[sourcecode language="javascript"]</p>
<p>post_params : { </p>
<p>   &#8220;post_param_name_1&#8243; : &#8220;post_param_value_1&#8243;,</p>
<p>   &#8220;post_param_name_2&#8243; : &#8220;post_param_value_2&#8243;,</p>
<p>   &#8220;post_param_name_n&#8221; : &#8220;post_param_value_n&#8221;</p>
<p>},</p>
<p>[/sourcecode]</p>
<p class="entry">Para uma completa referência das opções do swfupload, veja a <a href="http://demo.swfupload.org/Documentation/" title="Swfupload documentation" target="_blank">documentação do swfupload</a></p>
<h2><span>Dúvidas frequentes</span></h2>
<p>Aqui está uma lista das dúvidas frequentes que podem ocorrer ao utilizar o jqswfupload:</p>
<h3>Qual a vantagem deste plugin em relação a utilizar o swfupload sozinho?</h3>
<p>SWFUpload é uma ótima biblioteca utilizada amplamente em grandes projetos para realizar uploads múltiplos. Ela torna fácil a integração do flash com a interface web que não seja puramente nesta tecnologia. Entretanto, o swfupload tem muitos eventos, callbacks e opções que permite a flexibilidade para o desenvolvedor criar a experiência completa de upload utilizando javascript para criar todo o dom necessário para fazer isto acontecer. Este plugin é baseado na experiência do usuário utilizada no upload de fotos do Flickr. Toda a interface pode ser customizada por CSS. Com algumas vantagens, o jqswfupload estende as funcionalidades do swfupload, como progresso geral de arquivo e limitação de tamanho máximo da fila, não simplesmente limitar o tamanho de um único arquivo. O plugin foi construído para tornar este tipo de upload da &#8220;maneira jQuery de ser&#8221; que com uma linha você pode ter tudo funcionando e você tem o objeto de opções para ter o poder de mudar de acordo com sua necessidade.</p>
<h3>O upload retorna um erro 404, o que pode ser isto?</h3>
<p>Provavelmente a opção upload_url do swfupload não está correta. Não se esqueça de tornar o link absoluto ou relativo ao caminho do plugin.</p>
<h3>Eu segui todos os passo na documentação, mas aina aparece um input de arquivos normal, o que pode ter acontecido?</h3>
<p>Provavelmente você não colocou corretamento o arquivo swf ou não modificou a opção <em>flash_url</em>. Não se esqueça que esta opção é relativa ao template.</p>
<h3>Eu posso customizar todas as opções do swfupload?</h3>
<p>Sim, mas não é recomendado para esta primeira versão modificar os eventos, por que eles irão sobrescrever os eventos do plugin. Estou realizando o trabalho de estender todos os eventos do swfupload para o plugin para estender as opções existentes sem sobrescrever os eventos atuais. Por enquanto você pode usar os callbacks onFileSuccess e onFileError.</p>
<h3>Eu fiz download do plugin e o arquivo upload.php não tem nenhuma lógica de realizar upload, o que aconteceu?</h3>
<p>O script upload.php simplesmente prova que a cada upload realizado o script é chamado. O script pode ser escrito em diferentes linguagens de servidor e é assumido que quem esteja utilizando este plugin tem algum conhecimento prévio com envio de upload e o está utilizando para melhorar a experiência do usuário que é prejudicada com o upload de arquivos ormal. Se tiver algum exemplo de implementação do script de upload, <a href="http://www.alexandremagno.net/portfolio_dev/site/contato" title="Contact the author" target="_self">por favor, entre em contato<br />
</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alexandremagno.net/2009/07/jqswfupload-jquery-e-swfupload-em-uma-linha/feed/</wfw:commentRss>
		<slash:comments>47</slash:comments>
		</item>
		<item>
		<title>Calendário para jQuery em português</title>
		<link>http://blog.alexandremagno.net/2009/06/calendario-para-jquery-em-portugues/</link>
		<comments>http://blog.alexandremagno.net/2009/06/calendario-para-jquery-em-portugues/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 22:08:50 +0000</pubDate>
		<dc:creator>alexanmtz</dc:creator>
				<category><![CDATA[Jquery]]></category>

		<guid isPermaLink="false">http://www.alexandremagno.net/blog/2009/06/18/calendario-para-jquery-em-portugues/</guid>
		<description><![CDATA[Há um tempo atrás escrevi um post do plugin jCalendar em português. Ele é bastante visitado e gostaria muito de oferecer uma solução atual para este plugin usando o próprio jQuery. Muito tempo passou e atualmente existem soluções melhores para ter uma ferramenta de escolhas de datas. o jQuery UI veio como uma luva para [...]]]></description>
			<content:encoded><![CDATA[<p>Há um tempo atrás escrevi um <a title="Plugin do jCalendar em Português" href="http://www.alexandremagno.net/blog/2007/07/19/plugin-do-jcalendar-em-portugues/" target="_blank">post do plugin jCalendar em português</a>. Ele é bastante visitado e gostaria muito de oferecer uma solução atual para este plugin usando o próprio jQuery. Muito tempo passou e atualmente existem soluções melhores para ter uma ferramenta de escolhas de datas. o<a title="jQuery UI - Biblioteca de Interface para jQuery" href="http://jqueryui.com/demos/" target="_blank"> jQuery UI</a> veio como uma luva para unificar plugins de interface e um dos seus componentes é o <a title="Datepicker, um plugin do jQuery UI para seleção de datas em calendário" href="http://jqueryui.com/demos/datepicker/" target="_blank">Datepicker</a>. Com ele, você pode configurar um calendário para funcionar no formato nacional apenas passando as configurações adequadas, sem modificar o core.</p>
<p>Para utilizá-lo, é necessário fazer o <a title="Download do jQuery UI, com escolha dos plugins customizadas" href="http://jqueryui.com/download" target="_blank">download no site do jQuery UI</a>. Esta biblioteca de plugins possui vários outros plugins que irei tratar no futuro, portanto se for utilizar mais alguma por conta própria baixe o pacote completo, caso contrário somente o plugin datepicker e o core do jQuery UI.</p>
<p>Após inseri-lo no head do documento, basta ter um simples input referenciado de alguma forma, preferencialmente id, para que ele possa ser acessado via seletor do jQuery e assim inicializado como no exemplo:</p>

<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar"><div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div></div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple"><table class="html4strict"><tbody><tr class="li1"><td class="ln"><pre class="de1">1
2
3
4
5
6
7
8
</pre></td><td class="de1"><pre class="de1"><span class="sc2">&lt;<span class="kw2">script</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;jquery-1.3.2.min.js&quot;</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">script</span>&gt;</span>
<span class="sc2">&lt;<span class="kw2">script</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;jquery-ui-1.7.2.custom.min.js&quot;</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">script</span>&gt;</span>
<span class="sc2">&lt;<span class="kw2">script</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;calendario.js&quot;</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">script</span>&gt;</span>
&nbsp;
<span class="sc2">&lt;<span class="kw2">form</span> <span class="kw3">action</span><span class="sy0">=</span><span class="st0">&quot;/&quot;</span> <span class="kw3">method</span><span class="sy0">=</span><span class="st0">&quot;post&quot;</span>&gt;</span>
<span class="sc2">&lt;<span class="kw2">label</span> <span class="kw3">for</span><span class="sy0">=</span><span class="st0">&quot;calendario&quot;</span>&gt;</span>Data:<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">label</span>&gt;</span>
<span class="sc2">&lt;<span class="kw2">input</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;calendario&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text&quot;</span> <span class="kw3">name</span><span class="sy0">=</span><span class="st0">&quot;calendario&quot;</span> <span class="sy0">/</span>&gt;</span>
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">form</span>&gt;</span></pre></td></tr></tbody></table></div>
<div class="bwp-syntax-source"><pre class="no-parse">&lt;script type="text/javascript" src="jquery-1.3.2.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="jquery-ui-1.7.2.custom.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="calendario.js"&gt;&lt;/script&gt;

&lt;form action="/" method="post"&gt;
&lt;label for="calendario"&gt;Data:&lt;/label&gt;
&lt;input id="calendario" type="text" name="calendario" /&gt;
&lt;/form&gt;</pre></div></div>

<p>O arquivo <em>calendário.js</em> contém o seguinte conteúdo:</p>

<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar" style="right: 15px;" ><div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div></div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple"style=" height: 252px;"><table class="javascript"><tbody><tr class="li1"><td class="ln"><pre class="de1">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
</pre></td><td class="de1"><pre class="de1">$<span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
$<span class="br0">&#40;</span><span class="st0">&quot;#calendario&quot;</span><span class="br0">&#41;</span>.<span class="me1">datepicker</span><span class="br0">&#40;</span><span class="br0">&#123;</span>
dateFormat<span class="sy0">:</span> <span class="st0">'dd/mm/yy'</span><span class="sy0">,</span>
dayNames<span class="sy0">:</span> <span class="br0">&#91;</span>
<span class="st0">'Domingo'</span><span class="sy0">,</span><span class="st0">'Segunda'</span><span class="sy0">,</span><span class="st0">'Terça'</span><span class="sy0">,</span><span class="st0">'Quarta'</span><span class="sy0">,</span><span class="st0">'Quinta'</span><span class="sy0">,</span><span class="st0">'Sexta'</span><span class="sy0">,</span><span class="st0">'Sábado'</span><span class="sy0">,</span><span class="st0">'Domingo'</span>
<span class="br0">&#93;</span><span class="sy0">,</span>
dayNamesMin<span class="sy0">:</span> <span class="br0">&#91;</span>
<span class="st0">'D'</span><span class="sy0">,</span><span class="st0">'S'</span><span class="sy0">,</span><span class="st0">'T'</span><span class="sy0">,</span><span class="st0">'Q'</span><span class="sy0">,</span><span class="st0">'Q'</span><span class="sy0">,</span><span class="st0">'S'</span><span class="sy0">,</span><span class="st0">'S'</span><span class="sy0">,</span><span class="st0">'D'</span>
<span class="br0">&#93;</span><span class="sy0">,</span>
dayNamesShort<span class="sy0">:</span> <span class="br0">&#91;</span>
<span class="st0">'Dom'</span><span class="sy0">,</span><span class="st0">'Seg'</span><span class="sy0">,</span><span class="st0">'Ter'</span><span class="sy0">,</span><span class="st0">'Qua'</span><span class="sy0">,</span><span class="st0">'Qui'</span><span class="sy0">,</span><span class="st0">'Sex'</span><span class="sy0">,</span><span class="st0">'Sáb'</span><span class="sy0">,</span><span class="st0">'Dom'</span>
<span class="br0">&#93;</span><span class="sy0">,</span>
monthNames<span class="sy0">:</span> <span class="br0">&#91;</span>
<span class="st0">'Janeiro'</span><span class="sy0">,</span><span class="st0">'Fevereiro'</span><span class="sy0">,</span><span class="st0">'Março'</span><span class="sy0">,</span><span class="st0">'Abril'</span><span class="sy0">,</span><span class="st0">'Maio'</span><span class="sy0">,</span><span class="st0">'Junho'</span><span class="sy0">,</span><span class="st0">'Julho'</span><span class="sy0">,</span><span class="st0">'Agosto'</span><span class="sy0">,</span><span class="st0">'Setembro'</span><span class="sy0">,</span>
<span class="st0">'Outubro'</span><span class="sy0">,</span><span class="st0">'Novembro'</span><span class="sy0">,</span><span class="st0">'Dezembro'</span>
<span class="br0">&#93;</span><span class="sy0">,</span>
monthNamesShort<span class="sy0">:</span> <span class="br0">&#91;</span>
<span class="st0">'Jan'</span><span class="sy0">,</span><span class="st0">'Fev'</span><span class="sy0">,</span><span class="st0">'Mar'</span><span class="sy0">,</span><span class="st0">'Abr'</span><span class="sy0">,</span><span class="st0">'Mai'</span><span class="sy0">,</span><span class="st0">'Jun'</span><span class="sy0">,</span><span class="st0">'Jul'</span><span class="sy0">,</span><span class="st0">'Ago'</span><span class="sy0">,</span><span class="st0">'Set'</span><span class="sy0">,</span>
<span class="st0">'Out'</span><span class="sy0">,</span><span class="st0">'Nov'</span><span class="sy0">,</span><span class="st0">'Dez'</span>
<span class="br0">&#93;</span><span class="sy0">,</span>
nextText<span class="sy0">:</span> <span class="st0">'Próximo'</span><span class="sy0">,</span>
prevText<span class="sy0">:</span> <span class="st0">'Anterior'</span>
&nbsp;
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></td></tr></tbody></table></div>
<div class="bwp-syntax-source"><pre class="no-parse">$(function(){
$("#calendario").datepicker({
dateFormat: 'dd/mm/yy',
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'

});
});</pre></div></div>

<p>Ao passar as configurações acima o calendário se torna totalmente formatado para a forma nacional, simplesmente passando estes parâmetros. Há outras formas de personalização, como a faixa de anos exibida e outras configurações que pode ser consultadas na documentação. Os itens do exemplo acima são bastante auto-explicativo.</p>
<p>O estilo pode ser personalizado no arquivo css que vem junto com o plugin e o <a title="Diferentes temas para o jQuery UI" href="http://jqueryui.com/themeroller/" target="_blank">jQuery UI tem conceito de temas</a>. Você pode escolher um tema para ele que adeque mais a sua situação, tão bem como criar um personalizado apenas modificando o CSS.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alexandremagno.net/2009/06/calendario-para-jquery-em-portugues/feed/</wfw:commentRss>
		<slash:comments>56</slash:comments>
		</item>
		<item>
		<title> Utilizando fontes alternativas sem ferir a ...</title>
		<link>http://blog.alexandremagno.net/2009/06/utilizando-fontes-alternativas-sem-ferir-a-semantica/</link>
		<comments>http://blog.alexandremagno.net/2009/06/utilizando-fontes-alternativas-sem-ferir-a-semantica/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 01:00:47 +0000</pubDate>
		<dc:creator>alexanmtz</dc:creator>
				<category><![CDATA[HTML/CSS]]></category>

		<guid isPermaLink="false">http://www.alexandremagno.net/blog/2009/06/02/utilizando-fontes-alternativas-sem-ferir-a-semantica/</guid>
		<description><![CDATA[Já tem um tempinho que não escrevo nada no Blog. Estava realmente muito ocupado tanto como tempo tanto com a cabeça por causa da recente mudança para o Rio de Janeiro, cidade realmente maravilhosa, mas meu amor por Belo Horizonte ainda permanece. O motivo da mudança é que agora estou trabalhando no desenvolvimento de interfaces [...]]]></description>
			<content:encoded><![CDATA[<p>Já tem um tempinho que não escrevo nada no Blog. Estava realmente muito ocupado tanto como tempo tanto com a cabeça por causa da recente mudança para o Rio de Janeiro, cidade realmente maravilhosa, mas meu amor por Belo Horizonte ainda permanece. O motivo da mudança é que agora estou trabalhando no desenvolvimento de interfaces na <a href="http://www.globo.com" title="Globo.com, absolutamente tudo sobre entretenimento, vídeos, esportes e notícias" target="_blank">Globo.com</a>, mas os detalhes ficam para outra oportunidade! Estava ansioso para escrever sobre o assunto que irei tratar aqui.</p>
<p>O assunto posso dizer que é polêmico e apesar de serem simples algumas soluções, existe um leque de opções. Qual a melhor forma de utilizar fontes que não sejam padrão do sistema operacional e dos browsers sem prejudicar a marcação, SEO, acessibilidade, mobilidade e outros fatores?</p>
<p>Não existe um padrão para solucionar este problema, não existe uma forma perfeitamente adequada, que não quebre nenhum paradigma, no entanto uns ferem os princípios mais que outros. Todos os métodos existentes hoje são apenas uma aproximação da situação ideal. O fato é que cada um tem suas vantagens e desvantagem e a finalidade deste post é expor estes pontos.</p>
<p>Para quem não entendeu até agora o que estou dizendo, vamos a um exemplo prático. O designer faz um layout maravilhoso sem te consultar. O cliente aprova e você desenvolve a interface utilizando HTML, CSS e interações Javascript. O cliente pergunta: Por que as fontes estão diferentes do layout? Você preocupou-se com a manutenção, a marcação e utilizou puramente as três tecnologias em perfeita harmonia para não ter que ser fiel ao layout e simplesmente recortar cada imagem que represente um título.</p>
<p><strong>Por que isto acontece?</strong></p>
<p>Os browsers possuem uma leitura de <a href="http://www.ampsoft.net/webdesign-l/WindowsMacFonts.html" title="Fontes suportadas para windows e mac" target="_blank">fontes totalmente limitadas</a>. Além disto, ele depende do sistema operacional e da plataforma onde o site é aberto. A escolha das fontes podem ser feitas através do CSS. Mesmo assim, é impossível certificar que o usuário final verá da forma como você. Do ponto de vista de padrões de acessibilidade, qualquer título ou representação textual devem estar com a semântica correta. <a href="http://revolucao.etc.br/archives/introducao-a-semantica-web/" title="Introdução sobre a semântica Web. O estudo do significado das marcações HTML" target="_blank">Cada elemento tem seu significado</a>. O problema é que muitos desenvolvedores pensam somente no resultado final, sem levar em conta a qualidade. Portanto, se você deseja ou foi solicitado a usar fontes que não sejam padrão do sistema, é necessário fazer certas opções e sacrifícios. Parece uma decisão fácil, mas não é.</p>
<p>Na teoria, não seria necessário recorrer a nenhuma delas e utilizar fontes de sistema, na maioria das vezes ele supre as suas necessidades como desenvolvedor e do cliente também. No entanto, muitas vezes o apelo visual é necessário, mas vale lembrar que utilizar fontes não convencionais deve ser somente utilizado para títulos, pois para textos mais longos necessitam de fontes simples e legíveis, pois é para isto que o seu texto está na web: disponibilizar conteúdo.</p>
<p>As várias soluções irei listar aqui:</p>
<p><strong>Opção 1 &#8211; Recortar títulos como imagem</strong></p>
<p>Esta opção está longe de ser a melhor. Você recorta o texto desejado no layout e insere diretamente na página na tag <em>img</em>.</p>
<p>Ela não possui nenhuma vantagem, primeiro por que você estará inserindo na marcação uma imagem para representar um texto, quebrando a semântica. Segundo por que é difícil dar manutenção e implementar isto em um sistema em que seja necessário modificar estes texto. Neste último caso será necessário gerar outra imagem manualmente para modificar o site em questão. Além disto o texto não é selecionável. É irritante a experiência do usuário de não conseguir fazer uma tarefa básica: copiar um texto em um browser.</p>
<p><strong>sIFR</strong></p>
<p>Este método, que significa <em><a href="http://imasters.uol.com.br/artigo/11429/javascript/sifr_tipografia_e_html" title="Ótimo artigo explicando com detalhes o sIFR" target="_blank">Scalable Inman Flash Replacement</a>, </em>une Javascript, Flash e CSS para que a fonte seja renderizada corretamente em qualquer browser. Basicamente você escreve normalmente o html e através de javascript o texto é substituído por um SWF que renderiza a fonte. Isto acontece por que o flash não possui limitações para renderizar fonte, basta ter o arquivo enviado para o servidor e referenciado corretamente.</p>
<p>A vantagem é que o código é <a href="http://en.wikipedia.org/wiki/Unobtrusive_JavaScript" title="Conceito de javascript não obstrusivo" target="_blank">totalmente não-obstrusivo</a>, mas cada título usado possui um swf correspondente e a perfomance pode ser muito &#8220;cara&#8221; para simplesmente exibir um título com fonte que não seja de sistema. Esta é uma grande desvantagem. Para equilibrar, temos a vantagem dos textos serem selecionáveis, graças a esta opção que o flash possui para que os textos possam ser copiados e colados.</p>
<p><strong>Opção 3 &#8211; Importação através de CSS</strong></p>
<p>A importação de fonte através de CSS, muito <a href="http://www.maujor.com/tutorial/impfonte.php" title="Utilização de fontes não padrão do browser através de um recurso do CSS" target="_blank">bem explicada neste artigo do Maujor</a>, é uma técnica bastante atraente mas que ainda irá depender do comportamento do browser. Você pode ter qualquer tipo de fonte que não seja padrão, mas a sua renderização pode variar de browser para browser.</p>
<p>Ela consiste em usar uma ferramenta para gerar arquivos de fontes que você deseja utilizar que possa ser referenciada e importada através do CSS, utilizando uma propriedade <em>@font-face</em>. Nem todas as fontes são &#8220;importáveis&#8221;.</p>
<p><strong>Opção 4 -  Utilizando a propriedade text-ident do css com um valor extremamente alto</strong></p>
<p>Essa opção é muito utilizada e consiste em utilizar o css para identar o texto com um valor muito alto (negativo) de forma que não seja possível visualizá-lo e assim utilizar background-image para posicionar a imagem que representa o texto.</p>
<p>Temos aqui um exemplo da marcação</p>
<p>[sourcecode language="html"]</p>
<h2>Titulo a ser substituido</h2>
<p>lorem ipsum</p>
<p>[/sourcecode]</p>
<p>Então no CSS correspondente:</p>
<p>[sourcecode language="css"]</p>
<p>h2 {</p>
<p>background-image: url(&#8216;titulo.gif&#8217;);</p>
<p>text-ident: -999;</p>
<p>overflow: hidden;</p>
<p>}</p>
<p>[/sourcecode]</p>
<p>A regra overflow hidden é utilizada para que o texto &#8220;deslocado&#8221; não apareca no site, neste caso iria gerar um scroll horizontal e resultados imprevisíveis, portanto ela é estritamente necessária para que este método funcione. Ele é muito útil para casos em que há a necessidade de garantir que nenhum resultado imprevisível &#8220;quebre&#8221; um box.</p>
<p>Muitas vezes também é usado uma variação deste método que ao invés de deslocar o texto, o atributo font-size é passado para o tamanho menor possível, como 0.00001 para tornar-se imperceptível.</p>
<p>Bem, este método tem a vantagem de deixar a marcação limpa e não prejudica a perfomance. Poderia citar a desvantagem da dificuldade da manutenção, mas nada que um script de servidor como a <a href="http://www.php.net/manual/en/book.image.php" title="Biblioteca GD do PHP, geração dinâmica de imagens" target="_blank">biblioteca GD do PHP</a> para tornar a geração de imagens dinâmica e criar estas regras css para automatizar este trabalho. A desvantagem é que o texto não pode ser selecionado, mas a marcação permanece correta.</p>
<p>Sem querer insultar quem a usa, e instigando uma discussão, este método soa como &#8220;gambiarra&#8221;.</p>
<p><strong>Opção 5 -  Utilizando a tag span<br />
</strong></p>
<p>Essa opção combina um pouco da anterior com uma marcação a mais para não utilizar o text-ident. Neste &#8220;<a href="http://br.geocities.com/profflavia/persuasao1.html" title="Approach é uma abordagem para solução de um determinado problema" target="_blank">approach</a>&#8220;é utilizado uma tag <em>span</em> dentro do título para esconder o texto e assim posicionar a imagem de fundo através do CSS.</p>
<p>Temos aqui um exemplo da marcação:</p>
<p>[sourcecode language="html"]</p>
<h2><span>Titulo a ser substituido</span></h2>
<p>lorem ipsum</p>
<p>[/sourcecode]</p>
<p>Então no CSS correspondente:</p>
<p>[sourcecode language="css"]</p>
<p>h2 {</p>
<p>background-image: url(&#8216;titulo.gif&#8217;);</p>
<p>display: block;<br />
}</p>
<p>h2 span {</p>
<p>display: none;</p>
<p>}</p>
<p>[/sourcecode]</p>
<p>Em termos de marcação HTML, utilizar uma tag span dentro de um título não &#8220;fere&#8221; os padrões, pois é um <a href="http://www.webdesignfromscratch.com/css-block-and-inline.php" title="Diferenças entre elementos inline e elementos bloco" target="_blank">elemento inline dentro de elmento bloco</a>. O display block é necessário se a tag for um link, pois a imagem é um elemento inline, neste caso do h2 é redundante por que ele já se comporta como elemento bloco. Não se deve deixar de lembrar também que é necessário dar dimensões ao elemento que será do tamanho da imagem. Isto foi omitido do exemplo por que depende do tamanho.</p>
<p><a href="http://www.alexandremagno.net/examples/link_com_imagem/" title="Substituição por imagem em um link" target="_blank">Exemplo da substituição por imagem, utilizado em um link</a></p>
<p><strong>Conclusão</strong></p>
<p>O objetivo deste post foi mostrar as diferentes possibilidades quando se deseja utilizar uma fonte que não seja de sistema. Minha intenção aqui não foi dizer qual é a melhor, mas sim expor todas elas. Normalmente vejo artigos que dizem sobre uma ou outra, mas que não abordam todas as possibilidades e geralmente possuem uma certa preferência que está de acordo com o método abordado. A escolha fica com vocês.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alexandremagno.net/2009/06/utilizando-fontes-alternativas-sem-ferir-a-semantica/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>De onde vem suas visitas?</title>
		<link>http://blog.alexandremagno.net/2009/04/a-maioria-das-suas-visitas-vem-de-ferramentas-de-busca/</link>
		<comments>http://blog.alexandremagno.net/2009/04/a-maioria-das-suas-visitas-vem-de-ferramentas-de-busca/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 17:59:02 +0000</pubDate>
		<dc:creator>alexanmtz</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[UX]]></category>

		<guid isPermaLink="false">http://www.alexandremagno.net/blog/2009/04/16/a-maioria-das-suas-visitas-vem-de-ferramentas-de-busca/</guid>
		<description><![CDATA[Quando você analisa seu website, uma grande fatia da sua pizza vem de ferramentas de busca? Sua taxa de rejeição é alta? Esses dois fatores estão intimamente ligados, e seus resultados podem ter uma variedade de interpretações. Muitos usuários chegam ao seu site usando ferramentas de busca, acham seu objetivo e logo saem novamente. Algumas [...]]]></description>
			<content:encoded><![CDATA[<p>Quando você analisa seu website, uma grande fatia da sua pizza vem de ferramentas de busca? Sua <a href="http://www.mundoseo.com.br/blog/seo/bounce-rate-seo-popularidade-usabilidade-taxa-rejeicao/" title="Artigo sobre taxa de rejeição (com um ponto de vista diferente do citado aqui)" target="_blank">taxa de rejeição</a> é alta? Esses dois fatores estão intimamente ligados, e seus resultados podem ter uma variedade de interpretações. Muitos usuários chegam ao seu site usando ferramentas de busca, acham seu objetivo e logo saem novamente. Algumas vezes outro assunto lhe chama atenção. A maioria deles estão lá somente para um objetivo: consegui a informação que querem, diretamente. Sendo assim, nem sempre taxa de rejeição alta pode ser considerada ruim. Ela em conjunto com grande parte vindo das ferramentas de busca mostram que o usuário consegue o que quer. Quanto mais rápido ele entrou em seu website e saiu, a taxa de rejeição aumentará proporcionalmente. No entanto tudo depende de muita análise, pois ele também pode ter saído por que não era aquele resultado que esperava.</p>
<p>Para se ter um melhor entendimento do quão rápido seu usuário entrou e saiu do seu site, se foi sucesso ou falho, outros números devem ser observados. Um deles é o <a href="http://www.robotreplay.com" title="Robot Replay - Grave os movimentos que o usuário fazem enquanto navegam pelo site" target="_blank">Robot Replay</a>, que infelizmente possuem uma ótima idéia, mas não funciona bem. Tive vários problemas com ele, mas é muito boa a idéia de ter um sistema web que grava o rastreamento de usuários. O problema é o impacto que isto pode causar na perfomance.</p>
<p>Na mesma medida, se você investe em qualquer tipo de campanha publicitária, deve ser analisado as visitas que são feitas diretamente(alguém simplesmente senta e digita o seu endereço para entrar no website). O resultado esperado é aumentar esta outra fatia de pizza muito importante. Ela muitas vezes mostra que seu site é conhecido e não está limitado a ser somente um resultado na busca realizada.</p>
<p>A web está cada vez mais dinâmica e os resultados de busca dominaram o mercado. Usuários que usam esses sistemas, por exemplo, para realizarem uma simples tarefa, também é utilizado como navegação. Quantas vezes você sabe como chegar em algum conteúdo específico, mas você utiliza o sistema de busca mesmo assim?</p>
<p>Quais são suas fontes de visitas e como vocês interpretam as ações de seus usuários?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alexandremagno.net/2009/04/a-maioria-das-suas-visitas-vem-de-ferramentas-de-busca/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Navegação no Topo, esquerda ou direita?</title>
		<link>http://blog.alexandremagno.net/2009/04/navegacao-em-um-site-topo-esquerda-ou-direita/</link>
		<comments>http://blog.alexandremagno.net/2009/04/navegacao-em-um-site-topo-esquerda-ou-direita/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 12:52:12 +0000</pubDate>
		<dc:creator>alexanmtz</dc:creator>
				<category><![CDATA[UX]]></category>

		<guid isPermaLink="false">http://www.alexandremagno.net/blog/2009/04/14/navegacao-em-um-site-topo-esquerda-ou-direita/</guid>
		<description><![CDATA[Muitas discussões foram levantadas para escolher a melhor forma de navegação em um website. Alguns tem preferência pelo topo (muitas vezes utilizando abas e menus drop-down), outros pela direita (que possibilita maior escabilidade) e ainda a navegação pela esquerda (que é a mais recente, tendo em vista o seu uso recorrente em Blogs). Existe a [...]]]></description>
			<content:encoded><![CDATA[<p>Muitas discussões foram levantadas para escolher a melhor forma de navegação em um website. Alguns tem preferência pelo topo (muitas vezes utilizando abas e menus <a href="http://maujor.com/tutorial/ddownmenu.php" title="Como construir menus-dropdown com css" target="_blank">drop-down</a>), outros pela direita (que possibilita maior escabilidade) e ainda a navegação pela esquerda (que é a mais recente, tendo em vista o seu uso recorrente em Blogs). Existe a possibilidade também de usar uma combinação mista entre menu no topo com menus de contexto à direita ou esquerda. Existe uma minioria que falam sobre a disposição do menu na parte inferior, o &#8220;menu-bottom&#8221;. Esta irei até desconsiderar no restante do post, pois hoje está sendo muito utilizada somente como reforço dos outros tipos de menu. Ou seja, menus na parte inferior estão sendo utilizados como navegação auxiliar.</p>
<p>A usabilidade em uma barra de navegação é extremamente importante para o sucesso e facilidade de uso de um serviço web. Não é coicidência que uma das primeiras decisões que precisam ser tomadas para iniciar qualquer esboço de um website é a disposição da navegação. Cada projeto é um caso e vários objetivos diferentes são alcançados com as decisões referentes a estas disposições.  Muitos testes de usabilidade foram feitos para avaliar através do usuário a melhor forma de dispor a navegação.</p>
<p><span id="more-109"></span></p>
<p>O comportamento do usuário, assim como suas interações com o website são pesquisadas e muito utilizados como base para  uma decisão como esta. Uma opinião pessoal, de cliente e até mesmo de especialista podem entrar em contradição com o comportamento dinâmico de uma população em como eles devem agir. Um bom exemplo a ser dado são <a href="http://www.e-commerce.org.br/" title="Informações sobre e-commerce" target="_blank">e-commerces</a>, em que usuários tornaram-se grandes consumidores. Neste contexto, uma maior importância foi estabelecida a todas as suas ações, que foram pesquisadas e avaliadas de forma que se chegue em um sistema mais eficiente. Hoje lojas virtuais consagradas possuiem padrões de navegação muito confortáveis e com uso bastante eficiente.</p>
<p>Não se precipite em dizer que a melhor escolha é a esquerda como muitos o fazem. Como Nielsen já esperava, <a href="http://www.useit.com/alertbox/991114.html" title="Como implementações ruins conseguem ainda se tornarem padrões?" target="_blank">várias implementações ruins se tornam padrões na web</a>. Não é errado fugir de um padrão, pois criar novos padrões é criar novas perspectivas para o usuário interagir com o sistema, que muitas vezes não é tão familiar como parece.</p>
<h3><span>Navegação tradicional &#8211; Menu a esquerda</span></h3>
<p>Muitos guias de design surgiram na última década. Grande parte deles estavam com uma certa aceitação mútua de que a melhor utilização dos menus seriam na esquerda. Entre eles, <a href="http://jodi.tamu.edu/Articles/v04/i01/Kalbach/#Nielsen1" title="Artigo de Nielsen sobre usabilidade em menus de navegação" target="_blank">Jacob Nielsen</a>, um dos grandes nomes quando o assunto é usabilidade reforçaram esta idéia. Guias de Design utilizados pela IBM também aderiram o uso do padrão de menus conhecidos como &#8220;L invertido&#8221;. Pesquisas feitas na IBM constataram que esta forma de navegação é a mais confortável para o usuário.</p>
<p>Foi realizada uma pesquisa com a finalidade de obter modelos mentais de <a href="http://chnm.gmu.edu/digitalhistory/links/pdf/chapter4/4.26b.pdf" title="Como os elementos devem ser dispostos usando uma abordagem cognitiva" target="_blank">como os elementos devem ser dispostos em um site</a> (sistema de busca, login, menus de navegação). Foram gravados o tempo gasto dos usuários para se completar uma tarefa utilizando os diferentes tipos de menu. De acordo com os autores deste estudo mostram que o lugar ideal para a navegação é na esquerda devido ao processamento de informação no cérebro humano. A área esquerda é melhor usada para completar tarefas enquanto o lado direito é melhor para discursos e leitura. O estudo ainda mostrou que usuários mais avançados muitas vezes produzem melhores experiências navegando com menus ao topo em combinação com menus de contexto a esquerda.</p>
<p>O fato é que o menu na esquerda tem muitas vantagens. Uma delas é a escabilidade, pois ela se adapta muito bem a grandes portais ou websites que crescem exponencialmente. Mas nem sempre ela é a melhor opção.</p>
<h3><span>Formas alternativas</span></h3>
<p>As formas alternativas ganharam muito destaque depois que pesquisas de usabilidade começaram a serem amplamente utilizadas. Estudos recentes mostram que a disposição na direita é bastante eficiente, pois o usuário está mais próximo da barra de rolagem. Com isto o tempo final para navegar em um website é bastante reduzido, aumentando a eficiência do usuário seguir seus objetivos. O problema que apesar de estar próximo da barra lateral, ele está mais distante do botão de voltar do browser, o que diminiu a eficiência nesses casos.</p>
<h3><span>Estudo de caso &#8211; Redesign Audi.com</span></h3>
<p>Foi realizado testes de perfomance para saber a eficiência da disposição de menus à esquerda em relação a menus à direita. Este teste foi aplicado ao redesign do site da <a href="http://www.audi.com/" title="Projeto de redesign da Audi.com" target="_blank">Audi.com</a> e <a href="http://www.audi.de/" title="Redesign do site audi.de" target="_blank">Audi.de</a>. Os testes foram <a href="http://jodi.tamu.edu/Articles/v04/i01/Kalbach/" title="Testes de usabilidade para medir a eficiência dos menus à esquerda para o redesign do site da Audi.com" target="_blank">realizados em Hamburgo, Alemanha</a>.</p>
<p>Este teste foi realizado com 64 participante (44 homens e 20 mulheres). Todos participantes são público alvo da empresa.</p>
<p>Foram utilizados dois protótipos clicáveis para com os dois arranjos de menu: esquerda e direita. Todos os outros elementos foram mantidos constantes para não afetar a eficiência do teste.</p>
<p><img src="http://www.alexandremagno.net/blog/wp-content/uploads/2009/04/left-hand_test_condition.jpg" alt="Teste de usabilidade feito pela Audi para escolher a melhor disposição do menu de navegação" /></p>
<p><img src="http://www.alexandremagno.net/blog/wp-content/uploads/2009/04/right-hand_test_condition.jpg" alt="Teste de usabilidade feito pela Audi para escolher a melhor disposição do menu de navegação" /></p>
<p>Os participantes foram divididos e orientados a completarem as seguintes tarefas:</p>
<ul>
<li>Enviar e-mail para a compania sobre o serviço</li>
<li>Encontrar um representante da Audi em Hamburgo</li>
<li>Encontra informações sobre um modelo específico de carro</li>
<li>Configurar um carro online</li>
</ul>
<p>Todas as tarefas foram cronometradas. O resultado obtido mostrou que não há diferença considerável de perfomance em utilizar navegação à direita. No entanto, com essa nova perspectiva de navegação à direita, muitas vantagens foram descobertas:</p>
<ul>
<li>Como previsto por <a href="http://www.useit.com/" title="Portal de usabilidade do Jacob Nielsen" target="_blank">Jacob Nielsen</a>, uma navegação à direita foca o usuário no conteúdo. Isto justifica o motivo pelo qual grande parte dos Blogs usa este tipo de navegação</li>
<li>Usuários destros, que é grande maioria, se sentem mais confortáveis com navegação à direita. Usuários destros tendem a direcionar seu movimento à direita, além de terem uma maior proximidade da barra de rolagem.</li>
</ul>
<h3><span>Conclusão</span></h3>
<p>A resposta final para esta pergunta é meio óbvia para alguns e irritam muitos outros: não existe melhor local para disposição de menus. Depende do projeto, do foco e de toda arquitetura de informação do sistema em questão. Para tomar esta decisão, além de pesquisas com usuários, as considerações aqui passadas pode servir como o começo de uma discussão.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alexandremagno.net/2009/04/navegacao-em-um-site-topo-esquerda-ou-direita/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Formulários é com o Ajax Form e o Validate</title>
		<link>http://blog.alexandremagno.net/2009/04/controle-completo-de-formularios-ajax-form-e-validate/</link>
		<comments>http://blog.alexandremagno.net/2009/04/controle-completo-de-formularios-ajax-form-e-validate/#comments</comments>
		<pubDate>Sat, 04 Apr 2009 20:46:21 +0000</pubDate>
		<dc:creator>alexanmtz</dc:creator>
				<category><![CDATA[Jquery]]></category>
		<category><![CDATA[Plugins]]></category>

		<guid isPermaLink="false">http://www.alexandremagno.net/blog/2009/04/04/controle-completo-de-formularios-ajax-form-e-validate/</guid>
		<description><![CDATA[Já expliquei em posts anteriores como usar o validade e como usar o Ajax Form. Agora irei mostrar como os dois em conjunto oferece uma solução completa para controle de formulários, validação cliente, remota e envio de dados por Ajax de uma forma simples, intuitiva, de fácil manutenção e para qualquer situação. As validações que [...]]]></description>
			<content:encoded><![CDATA[<p>Já expliquei em posts anteriores como <a title="Como utilizar o plugin validate para jQuery" href="http://www.alexandremagno.net/blog/2008/07/23/validando-formularios-com-o-plugin-validate">usar o validade</a> e como usar o <a title="Ajax Form para jQuery" href="http://www.alexandremagno.net/blog/2008/01/22/ajax-form" target="_blank">Ajax Form</a>. Agora irei mostrar como os dois em conjunto oferece uma solução completa para controle de formulários, validação cliente, remota e envio de dados por Ajax de uma forma simples, intuitiva, de fácil manutenção e para qualquer situação.</p>
<p>As validações que serão feitas serão as seguintes:</p>
<ul>
<li><strong>Nome:</strong> é obrigatório e não poderá existir nomes duplicados (exemplo de validação remota)</li>
<li><strong>Idade:</strong> é necessário que seja número e não poderá ser maior que 18 (criação de um novo método de validação), <a title="Como criar métodos de validação para o Plugin Validate" href="http://www.alexandremagno.net/blog/2008/07/23/validando-formularios-com-o-plugin-validate">já demonstrado anteriormente</a></li>
<li><strong>E-mail:</strong> precisa ser um e-mail válido</li>
<li><strong>País:</strong> precisa escolher ao menos uma opção</li>
</ul>
<p><span id="more-107"></span>O código da marcação HTML é bem direto:</p>

<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar" style="right: 15px;" ><div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div></div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple"style=" height: 252px;"><table class="html4strict"><tbody><tr class="li1"><td class="ln"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="de1"><pre class="de1"><span class="sc2">&lt;<span class="kw2">form</span> <span class="kw3">name</span><span class="sy0">=</span><span class="st0">&quot;validate&quot;</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;validate&quot;</span> <span class="kw3">action</span><span class="sy0">=</span><span class="st0">&quot;enviar_dados.php&quot;</span> <span class="kw3">method</span><span class="sy0">=</span><span class="st0">&quot;post&quot;</span>&gt;</span>
&nbsp;
<span class="sc2">&lt;<span class="kw2">label</span> <span class="kw3">for</span><span class="sy0">=</span><span class="st0">&quot;nome&quot;</span>&gt;</span>Nome:<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">label</span>&gt;</span>
<span class="sc2">&lt;<span class="kw2">input</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text&quot;</span> <span class="kw3">name</span><span class="sy0">=</span><span class="st0">&quot;nome&quot;</span> <span class="sy0">/</span>&gt;</span>
&nbsp;
<span class="sc2">&lt;<span class="kw2">label</span> <span class="kw3">for</span><span class="sy0">=</span><span class="st0">&quot;idade&quot;</span>&gt;</span>Idade:<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">label</span>&gt;</span>
<span class="sc2">&lt;<span class="kw2">input</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text&quot;</span> <span class="kw3">name</span><span class="sy0">=</span><span class="st0">&quot;idade&quot;</span> <span class="sy0">/</span>&gt;</span>
&nbsp;
<span class="sc2">&lt;<span class="kw2">label</span> <span class="kw3">for</span><span class="sy0">=</span><span class="st0">&quot;email&quot;</span>&gt;</span>E-mail:<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">label</span>&gt;</span>
<span class="sc2">&lt;<span class="kw2">input</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text&quot;</span> <span class="kw3">name</span><span class="sy0">=</span><span class="st0">&quot;email&quot;</span> <span class="sy0">/</span>&gt;</span>
&nbsp;
<span class="sc2">&lt;<span class="kw2">label</span> <span class="kw3">for</span><span class="sy0">=</span><span class="st0">&quot;pais&quot;</span>&gt;</span>Pa<span class="sc1">&amp;iacute;</span>s:<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">label</span>&gt;</span>
<span class="sc2">&lt;<span class="kw2">select</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text&quot;</span> <span class="kw3">name</span><span class="sy0">=</span><span class="st0">&quot;pais&quot;</span>&gt;</span>
<span class="sc2">&lt;<span class="kw2">option</span> <span class="kw3">value</span><span class="sy0">=</span><span class="st0">&quot;&quot;</span>&gt;</span>Selecione<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">option</span>&gt;</span>
<span class="sc2">&lt;<span class="kw2">option</span> <span class="kw3">value</span><span class="sy0">=</span><span class="st0">&quot;brasil&quot;</span>&gt;</span>Brasil<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">option</span>&gt;</span>
<span class="sc2">&lt;<span class="kw2">option</span> <span class="kw3">value</span><span class="sy0">=</span><span class="st0">&quot;canada&quot;</span>&gt;</span>Inglaterra<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">option</span>&gt;</span>
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">select</span>&gt;</span>
&nbsp;
<span class="sc2">&lt;<span class="kw2">input</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;submit&quot;</span> <span class="kw3">value</span><span class="sy0">=</span><span class="st0">&quot;Validar&quot;</span> <span class="sy0">/</span>&gt;</span>
&nbsp;
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">form</span>&gt;</span></pre></td></tr></tbody></table></div>
<div class="bwp-syntax-source"><pre class="no-parse">&lt;form name="validate" id="validate" action="enviar_dados.php" method="post"&gt;

&lt;label for="nome"&gt;Nome:&lt;/label&gt;
&lt;input type="text" name="nome" /&gt;

&lt;label for="idade"&gt;Idade:&lt;/label&gt;
&lt;input type="text" name="idade" /&gt;

&lt;label for="email"&gt;E-mail:&lt;/label&gt;
&lt;input type="text" name="email" /&gt;

&lt;label for="pais"&gt;Pa&amp;iacute;s:&lt;/label&gt;
&lt;select type="text" name="pais"&gt;
&lt;option value=""&gt;Selecione&lt;/option&gt;
&lt;option value="brasil"&gt;Brasil&lt;/option&gt;
&lt;option value="canada"&gt;Inglaterra&lt;/option&gt;
&lt;/select&gt;

&lt;input type="submit" value="Validar" /&gt;

&lt;/form&gt;</pre></div></div>

<p>Depois de ter inserido o <a title="jQuery - escreva mais com menos código" href="http://www.jquery.com" target="_blank">jQuery</a>, <a title="Plugin Validate para jQuery" href="http://bassistance.de/jquery-plugins/jquery-plugin-validation/" target="_blank">Validate</a> e <a title="Plugin Form para jQuery" href="http://www.malsup.com/jquery/form/" target="_blank">Form Plugin</a> no cabeçalho, podemos usá-lo para validar o formulário de acordo com as regras estabelecidas. Irei demonstrar o código e depois explicar cada item:</p>

<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar" style="right: 15px;" ><div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div></div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple"style=" height: 252px;"><table class="javascript"><tbody><tr class="li1"><td class="ln"><pre class="de1">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
</pre></td><td class="de1"><pre class="de1">$<span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
$<span class="br0">&#40;</span><span class="st0">&quot;#validate&quot;</span><span class="br0">&#41;</span>.<span class="me1">validate</span><span class="br0">&#40;</span><span class="br0">&#123;</span>
&nbsp;
submitHandler<span class="sy0">:</span> <span class="kw2">function</span><span class="br0">&#40;</span>form<span class="br0">&#41;</span> <span class="br0">&#123;</span>
$<span class="br0">&#40;</span>form<span class="br0">&#41;</span>.<span class="me1">ajaxSubmit</span><span class="br0">&#40;</span><span class="br0">&#123;</span>
dataType<span class="sy0">:</span> <span class="st0">'html'</span><span class="sy0">,</span>
&nbsp;
success<span class="sy0">:</span> response
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span><span class="sy0">,</span>
rules<span class="sy0">:</span> <span class="br0">&#123;</span>
nome<span class="sy0">:</span> <span class="br0">&#123;</span>
required<span class="sy0">:</span> <span class="kw2">true</span><span class="sy0">,</span>
remote<span class="sy0">:</span> <span class="st0">'remote.php'</span>
<span class="br0">&#125;</span><span class="sy0">,</span>
idade<span class="sy0">:</span> <span class="br0">&#123;</span>
required<span class="sy0">:</span> <span class="kw2">true</span><span class="sy0">,</span>
minAge<span class="sy0">:</span> <span class="nu0">18</span>
<span class="br0">&#125;</span><span class="sy0">,</span>
email<span class="sy0">:</span> <span class="br0">&#123;</span>
required<span class="sy0">:</span> <span class="kw2">true</span><span class="sy0">,</span>
email<span class="sy0">:</span> <span class="kw2">true</span>
<span class="br0">&#125;</span><span class="sy0">,</span>
pais<span class="sy0">:</span> <span class="st0">'required'</span>
<span class="br0">&#125;</span><span class="sy0">,</span>
messages<span class="sy0">:</span> <span class="br0">&#123;</span>
nome<span class="sy0">:</span> <span class="br0">&#123;</span>
required<span class="sy0">:</span> <span class="st0">'Voc&amp;ecirc; n&amp;atilde;o preencheu seu nome'</span><span class="sy0">,</span>
remote<span class="sy0">:</span> <span class="st0">'Este nome ja existe'</span>
<span class="br0">&#125;</span><span class="sy0">,</span>
idade<span class="sy0">:</span> <span class="br0">&#123;</span>
required<span class="sy0">:</span> <span class="st0">'Voc&amp;ecirc; n&amp;atilde;o preencheu sua idade'</span>
<span class="br0">&#125;</span><span class="sy0">,</span>
email<span class="sy0">:</span> <span class="br0">&#123;</span>
required<span class="sy0">:</span> <span class="st0">'Voc&amp;ecirc; precisa preencher um e-mail'</span><span class="sy0">,</span>
email<span class="sy0">:</span> <span class="st0">'Endere&amp;ccedil;o de e-mail n&amp;atilde;o v&amp;aacute;lido'</span>
<span class="br0">&#125;</span><span class="sy0">,</span>
pais<span class="sy0">:</span> <span class="st0">'Voc&amp;ecirc; precisa escolher um pa&amp;iacute;s'</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></td></tr></tbody></table></div>
<div class="bwp-syntax-source"><pre class="no-parse">$(function(){

$("#validate").validate({

submitHandler: function(form) {
$(form).ajaxSubmit({
dataType: 'html',

success: response
});
},
rules: {
nome: {
required: true,
remote: 'remote.php'
},
idade: {
required: true,
minAge: 18
},
email: {
required: true,
email: true
},
pais: 'required'
},
messages: {
nome: {
required: 'Voc&amp;ecirc; n&amp;atilde;o preencheu seu nome',
remote: 'Este nome ja existe'
},
idade: {
required: 'Voc&amp;ecirc; n&amp;atilde;o preencheu sua idade'
},
email: {
required: 'Voc&amp;ecirc; precisa preencher um e-mail',
email: 'Endere&amp;ccedil;o de e-mail n&amp;atilde;o v&amp;aacute;lido'
},
pais: 'Voc&amp;ecirc; precisa escolher um pa&amp;iacute;s'
}

});

});</pre></div></div>

<p>A diferença deste código em relação ao <a title="Tutorial sobre o uso do Validate" href="http://www.alexandremagno.net/blog/2008/07/23/validando-formularios-com-o-plugin-validate/">post anterior sobre o validate</a> é o fato de agora existir uma validação remota. Observe a nova regra <em><strong>&#8216;remote&#8217;</strong></em>, em que podemos passar uma  url que será passado o valor daquele campo (por padrão como get), então ele irá esperar uma resposta no formato JSON com simplesmente um valor true ou false. Neste caso, como no código abaixo ele verifica se já existe um nome &#8216;alexandremagno&#8217;:</p>

<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar"><div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div></div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple"><table class="php"><tbody><tr class="li1"><td class="ln"><pre class="de1">1
2
3
4
5
6
7
8
9
10
</pre></td><td class="de1"><pre class="de1"><span class="kw2">&lt;?php</span>
&nbsp;
<span class="re0">$nome</span> <span class="sy0">=</span> <span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st_h">'nome'</span><span class="br0">&#93;</span><span class="sy0">;</span>
<span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$nome</span> <span class="sy0">==</span> <span class="st_h">'alexandremagno'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">echo</span> <span class="st_h">'false'</span><span class="sy0">;</span>
<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
<span class="kw1">echo</span> <span class="st_h">'true'</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="sy1">?&gt;</span></pre></td></tr></tbody></table></div>
<div class="bwp-syntax-source"><pre class="no-parse">&lt;?php

$nome = $_GET['nome'];
if($nome == 'alexandremagno') {
echo 'false';
} else {
echo 'true';
}

?&gt;</pre></div></div>

<p>Vale lembrar que este não é um código utilizado na prática, pois é simplesmente como demonstração. No server-side, devemos verificar nomes duplicados de acordo com o banco de dados, então provavelmente seria um select verificando se já existe este nome no banco de dados. O exemplo simples ilustra a situação. Com o este método, poderemos unificar no validate para toda resposta sobre validação, mesmo que seja remota. Não haverá mais desta forma diferenciação entre validação cliente/servidor. Apesar disto, a verificação no  back-end deve ser feita (para usuários que não tenha javascript habilitado ou que desabilitem o javascript).</p>
<h3><span>O método submitHandler do Validate</span></h3>
<p>Este método é onde os dois plugins se encontram. Com este método podemos controlar o que irá acontecer no envio do formulário. Quando não é utilizada, ela irá enviar o formulário normalmente. Após utilizá-la, podemos passar o formulário como parâmetro e usá-lo para por exemplo, impedir que o formulário seja enviado e assim podermos utilizar um envio por ajax ou qualquer lógica dependendo da situação. Neste caso nós o utilizamos para chamar o Ajax Form:</p>

<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar"><div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div></div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple"><table class="javascript"><tbody><tr class="li1"><td class="ln"><pre class="de1">1
2
3
4
5
6
</pre></td><td class="de1"><pre class="de1">submitHandler<span class="sy0">:</span> <span class="kw2">function</span><span class="br0">&#40;</span>form<span class="br0">&#41;</span> <span class="br0">&#123;</span>
$<span class="br0">&#40;</span>form<span class="br0">&#41;</span>.<span class="me1">ajaxSubmit</span><span class="br0">&#40;</span><span class="br0">&#123;</span>
type<span class="sy0">:</span> <span class="st0">'post'</span><span class="sy0">,</span>
success<span class="sy0">:</span> response
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span><span class="sy0">,</span></pre></td></tr></tbody></table></div>
<div class="bwp-syntax-source"><pre class="no-parse">submitHandler: function(form) {
$(form).ajaxSubmit({
type: 'post',
success: response
});
},</pre></div></div>

<p>No sucesso, passamos uma função chamada response que irá enviar os dados e retornar a mensagem de sucesso que será inserida no DOM como se segue:</p>
<pre>function response(data) {
$("#validate").resetForm();
$('#mensagem').remove();

var mensagem;

if(data) {

mensagem ='Dados validados com sucesso';

} else {

mensagem = 'Não foi possível validar os dados';

}

$('&lt;div id="mensagem"&gt;'+mensagem+'&lt;/div&gt;')
.hide()
.insertAfter('h1')
.fadeIn('slow');
}</pre>
<p>A função response aceita o parâmetro data que é o retorno da requisição feita por ajax. Vale lembrar que este uso pode ser totalmente não-obstrusivo, pois várias frameworks já possuem métodos em suas classes para identificar a natureza da requisição e retornar o tipo de dado adequado. Neste caso o retorno é uma parte de HTML que pode ser usado para ser inserido no DOM.</p>
<p>Primeiramente usamos um método do Form Plugin que limpa todos os dados do formulário, depois remove qualquer div com o id mensagem para evitar que seja inserida novamente. Logo depois os dados vindos da requisição são inseridos com um efeito fade logo após o título. Tive que utilizar o método hide do jQuery antes, pois o efeito fade pode é percebido em um elemento que esteja inicialmente escondido.</p>
<p>Desta forma, o controle de formulário fica totalmente na responsabilidade desses dois plugins integrados. Para formulários maiores e lógicas mais complexa podemos seguir o mesmo raciocínio sem maiores problemas.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alexandremagno.net/2009/04/controle-completo-de-formularios-ajax-form-e-validate/feed/</wfw:commentRss>
		<slash:comments>46</slash:comments>
		</item>
	</channel>
</rss>

