<?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>Tales Augusto &#187; Tales</title>
	<atom:link href="http://www.talesaugusto.com.br/author/admin/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.talesaugusto.com.br</link>
	<description>Integrando PHP e Javascript</description>
	<lastBuildDate>Thu, 07 Jan 2010 02:05:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Fontes dos tutoriais</title>
		<link>http://www.talesaugusto.com.br/fontes-dos-tutoriais/</link>
		<comments>http://www.talesaugusto.com.br/fontes-dos-tutoriais/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 01:46:35 +0000</pubDate>
		<dc:creator>Tales</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.talesaugusto.com.br/?p=108</guid>
		<description><![CDATA[Olá pessoal,
estou recebendo muitos emails pedindo os fontes dos exemplos que posto aqui no blog. Para atender a todo mundo, achei legal publicar os fontes no repositório que uso para versionar minha biblioteca Tavs. Por falta de tempo, não consegui ainda publicar todos os fontes lá, mas quem se interessar pelo tutorial do flexigrid (mais [...]]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal,</p>
<p>estou recebendo muitos emails pedindo os fontes dos exemplos que posto aqui no blog. Para atender a todo mundo, achei legal publicar os fontes no repositório que uso para versionar minha biblioteca Tavs. Por falta de tempo, não consegui ainda publicar todos os fontes lá, mas quem se interessar pelo tutorial do flexigrid (mais procurado! <img src='http://www.talesaugusto.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ), pode fazer o <a title="SVN Repository" href="http://tavslibrary.googlecode.com/svn/trunk/tutorials/flexigrid" target="_blank">checkout do projeto</a> ou <a title="Download" href="http://code.google.com/p/tavslibrary/downloads/list" target="_blank">fazer o download dos arquivos</a>.</p>
<p>Com o tempo vou publicando os outros arquivos para download, ok?</p>
<p>Abraços!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.talesaugusto.com.br/fontes-dos-tutoriais/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cabeçalho sob demanda (JS e CSS)</title>
		<link>http://www.talesaugusto.com.br/cabecalho-sob-demanda-js-e-css/</link>
		<comments>http://www.talesaugusto.com.br/cabecalho-sob-demanda-js-e-css/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 18:43:42 +0000</pubDate>
		<dc:creator>Tales</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Head]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false">http://www.talesaugusto.com.br/?p=103</guid>
		<description><![CDATA[Para tentar otimizar o carregamento das páginas, procuro carregar somente o necessário para a correta exibição e funcionamento da mesma. Para isso, os arquivos para estilização (CSS) e os arquivos para interação com o usuário (JS) devem ser carregados somente quando necessários, ou seja, por demanda. Muitas pessoas colocam todas as funções JS em um [...]]]></description>
			<content:encoded><![CDATA[<p>Para tentar otimizar o carregamento das páginas, procuro carregar somente o necessário para a correta exibição e funcionamento da mesma. Para isso, os arquivos para estilização (CSS) e os arquivos para interação com o usuário (JS) devem ser carregados somente quando necessários, ou seja, por demanda. Muitas pessoas colocam todas as funções JS em um único arquivo, fazendo com que o carregamento fique um pouco mais demorado se fosse carregado somente o necessário para aquela página. O mesmo problema acontece com os arquivos CSS quem possuem toda a estilização do site em um único arquivo.</p>
<p>Com base nisso criei um plugin para o ZF que faz o carregamento dos arquivos sob demanda. Este plugin nada mais faz do que carregar os arquivos do módulo, controller, action (nesta ordem) no cabeçalho da página.</p>
<p>Para o correto funcionamento do plugin, é preciso que uma estrutura de pastas seja respeitada:</p>
<p><img class="alignnone size-full wp-image-105" title="head-sob-demanda" src="http://www.talesaugusto.com.br/wp-content/uploads/2009/08/imagem2.png" alt="head-sob-demanda" width="300" height="191" /></p>
<ul>
<li><strong>[moduleName]</strong> &#8211; Nome do modulo corrente;</li>
<li><strong>[scriptPathName]</strong> &#8211; Nome da pasta de scripts JS. Por padrão, é adotado o nome &#8217;scripts&#8217;;</li>
<li><strong>[controllerName]</strong> &#8211; Nome do controller corrente;</li>
<li><strong>[actionName]</strong> &#8211; Nome do action corrente;</li>
<li><strong>[scriptControllerName]</strong> &#8211; nome do script JS que será chamado a nível de controller. Por padrão, é adotado &#8216;controller&#8217;;</li>
<li><strong>[stylePathName]</strong> &#8211; Nome da pasta de estilos CSS. Por padrão, é adotado o nome &#8217;styles&#8217;;</li>
<li><strong>[styleControllerName]</strong> &#8211; nome do estilo CSS que será chamado a nível de controller. Por padrão, é adotado &#8216;controller&#8217;;</li>
</ul>
<blockquote><p>O plugin irá tentar incluir todos estes arquivos no head somente se o arquivo existir.</p></blockquote>
<p>O plugin deve ser registrado pelo objeto Zend_Controller_Front e o objeto de visualização (Zend_View_Interface) já deve estar previamente configurado para o correto funcionamento. O namespace Tavs_View_Helper deve ser adicionado através do método Zend_View::addHelperPath() para que o plugin acesse o helper Tavs_View_Helper_BaseUrl, responsável por incluir o baseUrl ao início do nome do arquivo.</p>
<p>Outra funcionalidade deste plugin é adicionar ao cabeçalho, códigos JS úteis para o javascript. Como o próprio baseUrl, ID da sessão e outros paths do sistema que só podem ser definidos pelo PHP.</p>
<p>O plugin Tavs_Controller_Plugin_View pode ser baixado juntamente com a minha biblioteca de códigos Tavs em <a href="http://tavslibary.googlecode.com/svn/trunk" target="_blank">http://tavslibary.googlecode.com/svn/trunk</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.talesaugusto.com.br/cabecalho-sob-demanda-js-e-css/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Bootstrapping Zend Framework 1.8</title>
		<link>http://www.talesaugusto.com.br/bootstrapping-new-zend-framework/</link>
		<comments>http://www.talesaugusto.com.br/bootstrapping-new-zend-framework/#comments</comments>
		<pubDate>Fri, 22 May 2009 19:34:12 +0000</pubDate>
		<dc:creator>Tales</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Bootstrap]]></category>

		<guid isPermaLink="false">http://www.talesaugusto.com.br/?p=78</guid>
		<description><![CDATA[A nova versão do Zend Framework (1.8) permite fazer as configurações principais da aplicação de uma maneira diferente das outras versões. Até a versão 1.7 não existia um padrão de bootstrapping e cada um fazia do jeito que achar melhor. Acredito que para incentivar os desenvolvedores a seguir um padrão de bootstrapping, a Zend criou [...]]]></description>
			<content:encoded><![CDATA[<p>A nova versão do Zend Framework (1.8) permite fazer as configurações principais da aplicação de uma maneira diferente das outras versões. Até a versão 1.7 não existia um padrão de bootstrapping e cada um fazia do jeito que achar melhor. Acredito que para incentivar os desenvolvedores a seguir um padrão de bootstrapping, a Zend criou classes de inicialização &#8211; bem práticas, por sinal &#8211; que auxiliam nas configurações necessárias do projeto.</p>
<p>Neste post mostrarei como é feito as principais configurações (View, Modulos, IncludePath e etc&#8230;) utilizando a nova versão do poderoso Zend Framework 1.8. Para isso, criarei um novo projeto no eclipse chamado <strong>Tests</strong> no localhost.</p>
<p><span id="more-78"></span>A primeira coisa a ser feita é criar as pastas e arquivos do projeto, como segue a imagem a baixo:</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-84" title="post-zend-181" src="http://www.talesaugusto.com.br/wp-content/uploads/2009/05/post-zend-181.jpg" alt="post-zend-181" width="240" height="346" /></p>
<p style="text-align: left;">Esta é a estrutura que gosto de usar, mas como o ZF é bem flexível, você pode organizar da maneira que achar mais conveniente. Neste caso, para acessar a aplicação, a url seria: <a href="http://localhost/Tests/httpdocs" target="_blank">http://localhost/Tests/httpdocs.</a></p>
<p style="text-align: left;">Criado os diretórios colocaremos &#8220;conteúdo&#8221; nos arquivos para iniciar a aplicação. O primeiro arquivo arquivo a ser editado é o <strong>.htaccess</strong> que reescreve as url&#8217;s de modo que todo acesso ao projeto seja redirecionado para o arquivo <strong>index.php</strong>.</p>
<pre class="brush: plain;">
SetEnv APPLICATION_ENV development

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
</pre>
<p>Neste momento, qualquer acesso à url <a href="http://localhost/Tests" target="_blank">http://localhost/Tests/httpdocs/</a> será redirecionado para o arquivo index.php. Para testar, digite qualquer coisa depois de httpdocs. Se não der erro de página não encontrada, é porque você está no caminho certo. <img src='http://www.talesaugusto.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>O próximo passo é criar o arquivo index.php que definirá o ambiente que o a aplicação será rodada.</p>
<pre class="brush: php;">
&lt;?php

/**
* Define o diretorio onde a aplicacao esta rodando.
* Se não tiver definido anteriormente, define usando realpath(dirname(__FILE__) . '/../application').
* O resultado será C:\&lt;caminho_para_localhost&gt;\Tests\application
*/
defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application') . DIRECTORY_SEPARATOR);

/**
* Define o ambiente da aplicacao.
* Assume 'production' como ambiente padrao se a variavel APPLICATION_ENV nao tiver sido setada
*/
defined('APPLICATION_ENV') || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

//Zend_Application
require_once 'Zend/Application.php';

/**
* Cria uma instancia de Zend_Application passando o ambiente e o caminho para o arquivo de configuracoes.
* Este componente irá automatizar algumas configurações definidas no config.ini
*/
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . 'config/config.ini'
);

//Faz as configuraçoes basicas (Views, Layout, DB, ...)
$application-&gt;bootstrap();

//Inicia efetivamente a aplicacao. Neste momento é dado o dispatch para instanciar os controllers e chamar os actions
$application-&gt;run();
</pre>
<blockquote>
<p style="text-align: left;">Para setar variáveis de ambiente no Windows basta pressionar as teclas Window+Pause para a abrir a janela de propriedades do computador. Vá na guia Advanced/Avançado clica botão Environment Variables/Variáveis de Ambiente. Na próxima tela, acrescente a variável APPLICATION_ENV no grupo de System Variables/Variáveis de Sistema com o valor &#8216;<strong>development</strong>&#8216;. Para não perder o costume, <span style="text-decoration: line-through;">reinicie o computador</span>. Uma alternativa seria setar a variável no .htaccess, igual ao citado anteriormente.</p>
</blockquote>
<p style="text-align: left;">Agora teremos que criar a classe Bootstrap para iniciar as configurações básicas. Por padrão, o ZF consegue configurar algumas coisas como conexão com banco, diretorios dos modulos/controllers e etc apenas lendo o config.ini. Eu prefiro colocar no config.ini tudo aquilo que varia de ambiente para ambiente, configurando o restante na classe Bootstrap.</p>
<p style="text-align: left;">Um dos grandes benefícios desta classe é a inteligência para chamar os métodos de inicialização. Todo método iniciado por <strong>_init</strong> da classe Zend_Application_Bootstrap_Bootstrap será chamado, assim fica mais organizado o bootstrap onde cada método configura somente uma parte do projeto. No exemplo abaixo, criei somente o método <strong>_initFrontController</strong> para informar ao dispatcher onde está as pastas com os módulos. Nos próximos posts, mostrarei outras configurações como BD, View, IncludePath e etcs&#8230;.</p>
<pre class="brush: php;">

&lt;?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
/**

* Configura o objeto FrontControoler.     *
* @return Zend_Controller_Front
*/
protected function _initFrontController()
{
$front = Zend_Controller_Front::getInstance();
$front
-&gt;addModuleDirectory(APPLICATION_PATH . 'modules')
-&gt;setDefaultModule('default');

return $front;
}
}
</pre>
<p style="text-align: left;">Para o exemplo, defini a pasta modules como o diretorio que conterá todos os modulos do projeto. O Zend automaticamente lê cada diretório de &#8216;modules&#8217; como sendo um módulo do projeto.</p>
<p style="text-align: left;">Agora criaremos os controller, actions e views para fazer a renderização. Edite o arquivo IndexController.php e implemente a classe IndexController como abaixo:</p>
<p style="text-align: left;">
<pre class="brush: php;">

class IndexController extends Zend_Controller_Action
{
/**
* Irá renderizar o arquivo view/scripts/index/index.phtml
*
*/
public function indexAction()
{

}
}
</pre>
<p style="text-align: left;">Código do script index.phtml</p>
<p style="text-align: left;">
<pre class="brush: php;">

&lt;h3&gt;Hello World&lt;/h3&gt;
</pre>
<p style="text-align: left;">Neste momento, ao acessar <a href="http://" target="_blank">http://localhost/Tests/httpdocs</a>, você deverá ver uma página com o texto <strong>Hello World</strong>. No próximo post, mostrarei como configurar o banco de dados e o Zend_Layout, ótimo componente para utilização do MVC.</p>
<p style="text-align: left;">Abraços.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.talesaugusto.com.br/bootstrapping-new-zend-framework/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Paginação com Zend Framework</title>
		<link>http://www.talesaugusto.com.br/paginacao-zend-framework/</link>
		<comments>http://www.talesaugusto.com.br/paginacao-zend-framework/#comments</comments>
		<pubDate>Sat, 09 May 2009 18:51:08 +0000</pubDate>
		<dc:creator>Tales</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Paginação]]></category>

		<guid isPermaLink="false">http://www.talesaugusto.com.br/?p=63</guid>
		<description><![CDATA[Mostrarei neste post como é simples fazer uma paginação usando o poderoso Zend Framework. O componente Zend_Paginator possibilita ao programador configurar uma série de opções afim de tornar a paginação mais intuitiva.
Atualmente o Zend_Paginator no permite paginar quatro tipos de model:

Array
DbSelect
DbTableSelect
Iterator

Para este exemplo farei a paginação usando o DbSelect, que acredito ser o mais utilizado [...]]]></description>
			<content:encoded><![CDATA[<p>Mostrarei neste post como é simples fazer uma paginação usando o poderoso Zend Framework. O componente Zend_Paginator possibilita ao programador configurar uma série de opções afim de tornar a paginação mais intuitiva.</p>
<p>Atualmente o Zend_Paginator no permite paginar quatro tipos de model:</p>
<ul>
<li><strong>Array</strong></li>
<li><strong>DbSelect</strong></li>
<li><strong>DbTableSelect</strong></li>
<li><strong>Iterator</strong></li>
</ul>
<p>Para este exemplo farei a paginação usando o DbSelect, que acredito ser o mais utilizado por retornar registros do banco de dados.</p>
<p><span id="more-63"></span>A primeira coisa  a ser feita é fazer a consulta ao banco de dados. Apenas selecionei todos os registros da tabela <em>cliente</em>:</p>
<pre class="brush: php;">

//fazendo a consulta no banco de dados
$db = Zend_Db_Table::getDefaultAdapter();
$select = $db-&gt;fetchAll(&quot;SELECT * FROM cliente&quot;);
</pre>
<p>Realizada a consulta, vamos criar a paginação:</p>
<pre class="brush: php;">

//criando a paginaçao
Zend_Paginator::setDefaultScrollingStyle('Sliding');
Zend_View_Helper_PaginationControl::setDefaultViewPartial('partials/paginator.phtml');
$paginator = Zend_Paginator::factory($select);

//pagina atual. Se nao vier nenhuma pagina, mostra a primeira
$currentPage = $this-&gt;_getParam('page', 1);
$paginator
-&gt;setCurrentPageNumber($currentPage)
-&gt;setItemCountPerPage(5);

//manda para a viewer
$this-&gt;view-&gt;paginator = $paginator;
</pre>
<p>As chamadas estáticas servem para mostrar ao paginator qual o tipo de paginação e qual será a template padrão da paginação. No exemplo, a template padrão será o paginator.phtml, localizado em view/scripts/partials/paginator.phtml. Segue o código dela:</p>
<pre class="brush: php;">

&lt;?php if ($this-&gt;pageCount): ?&gt;
&lt;div class=&quot;paginationControl&quot;&gt;
&lt;!-- Previous page link --&gt;
&lt;?php if (isset($this-&gt;previous)): ?&gt;
&lt;a href=&quot;&lt;?php echo $this-&gt;url(array('page' =&gt; $this-&gt;previous)); ?&gt;&quot;&gt;
&lt; Previous
&lt;/a&gt; |
&lt;?php else: ?&gt;
&lt;span class=&quot;disabled&quot;&gt;&lt; Previous&lt;/span&gt; |
&lt;?php endif; ?&gt;

&lt;!-- Numbered page links --&gt;
&lt;?php foreach ($this-&gt;pagesInRange as $page): ?&gt;
&lt;?php if ($page != $this-&gt;current): ?&gt;
&lt;a href=&quot;&lt;?php echo $this-&gt;url(array('page' =&gt; $page)); ?&gt;&quot;&gt;
&lt;?php echo $page; ?&gt;
&lt;/a&gt; |
&lt;?php else: ?&gt;
&lt;?php echo $page; ?&gt; |
&lt;?php endif; ?&gt;
&lt;?php endforeach; ?&gt;

&lt;!-- Next page link --&gt;
&lt;?php if (isset($this-&gt;next)): ?&gt;
&lt;a href=&quot;&lt;?php echo $this-&gt;url(array('page' =&gt; $this-&gt;next)); ?&gt;&quot;&gt;
Next &gt;
&lt;/a&gt;
&lt;?php else: ?&gt;
&lt;span class=&quot;disabled&quot;&gt;Next &gt;&lt;/span&gt;
&lt;?php endif; ?&gt;
&lt;/div&gt;
&lt;?php endif; ?&gt;
</pre>
<blockquote><p>Dica: Se o seu sistema possui várias paginações, seria interessante se as chamadas dos métodos estáticos mostrados acima ficassem no bootstrap. Com isso, a configuração da paginação serviria para toda aplicação.</p></blockquote>
<p>Para finalizar a paginação, falta somente o script que renderizará a listagem e mostrar a paginação:</p>
<pre class="brush: php;">

&lt;?php
if ( count($this-&gt;paginator) &gt; 0) :
foreach ($this-&gt;paginator as $item) :
Zend_Debug::dump($item);
endforeach;
echo $this-&gt;paginator;
endif;
?&gt;
</pre>
<p>Checa se a paginacao possui algum registro, faz o loop para exibir os registros e, por fim, renderiza a lista de páginas renderizadas pelo Zend_Paginator.</p>
<p>Simples assim. <img src='http://www.talesaugusto.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Leitura recomendada: <a href="http://framework.zend.com/manual/en/zend.paginator.html" target="_blank">Zend_Paginator</a></p>
<p>Abraços.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.talesaugusto.com.br/paginacao-zend-framework/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Zend Framework + Upload+ ProgressBar</title>
		<link>http://www.talesaugusto.com.br/zend-framework-upload-progressbar/</link>
		<comments>http://www.talesaugusto.com.br/zend-framework-upload-progressbar/#comments</comments>
		<pubDate>Tue, 05 May 2009 20:54:56 +0000</pubDate>
		<dc:creator>Tales</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[ProgressBar]]></category>
		<category><![CDATA[Upload]]></category>

		<guid isPermaLink="false">http://www.talesaugusto.com.br/?p=54</guid>
		<description><![CDATA[Neste post irei mostrar como fazer uma barra de progresso nos formulário que possuem upload. A teoria da operação é a seguinte: Utilizaremos dois actions &#8220;processAction&#8221; e &#8220;progressAction&#8221;. O 1° irá fazer o processamento do formulário (nada fora do normal até aqui  . Mas a mágica acontece no action &#8220;progressAction&#8221; que envia para o [...]]]></description>
			<content:encoded><![CDATA[<p>Neste post irei mostrar como fazer uma barra de progresso nos formulário que possuem upload. A teoria da operação é a seguinte: Utilizaremos dois actions &#8220;processAction&#8221; e &#8220;progressAction&#8221;. O 1° irá fazer o processamento do formulário (nada fora do normal até aqui <img src='http://www.talesaugusto.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Mas a mágica acontece no action &#8220;progressAction&#8221; que envia para o browser como está o progresso do upload. Quando envia o formulário, um javascript faz requisições para &#8220;progressAction&#8221; via ajax e este retorna as informações necessárias para fazer a barra de progresso funcionar.<br />
Para este tutorial, é necessário a extensão uploadprogress. Esta extensão que permite ao php recuperar o status do envio. Segue o link para o download da extensão:</p>
<ul>
<li><a title="Para Windows" href="http://www.iwid.co.uk/e107_files/downloads/php_uploadprogress_dll_WIN32.zip" target="_blank">php_uploadprogress_dll_WIN32.zip</a></li>
<li><a href="http://pecl.php.net/get/uploadprogress-1.0.0.tgz" target="_blank">uploadprogress-1.0.0.tgz</a></li>
</ul>
<p><span id="more-54"></span>A extensão precisa acessar a pasta de uploads temporária, portanto é necessário configurar no php.ini o caminho. Inclua as seguintes linhas no seu arquivo de configurações do php:</p>
<pre class="brush: php;">

[UploadProgress]

extension=php_uploadprogress.dll
uploadprogress.file.contents_template=&quot;C:WINDOWSTempupload_contents_%s&quot;
uploadprogress.file.filename_template=&quot;C:WINDOWSTempupt_%s.txt&quot;
</pre>
<p>Obs: Reparem para a última parte dos caminhos que devem ser mantidos (&#8220;upload_contents_%s&#8221; e &#8220;upt_%s.tx&#8221;)</p>
<p>Obs2: Sei que não é a melhor opção, mas estou fazendo o tutorial baseado em ambiente Windows. Mas os passos são os mesmos para ambiente Unix.</p>
<p>Segue o controller que fará todo o controle do upload:</p>
<pre class="brush: php;">

class IndexController extends Zend_Controller_Action
{
/**
* Monta o formulário
*
* @return void
*/
public function indexAction()
{
$request = $this-&gt;getRequest();
$this-&gt;view-&gt;id = md5(microtime() . rand());
}

/**
* Processo os arquivos quando forem finalizados
*
* @return void
*/
public function processAction()
{
Zend_Layout::getMvcInstance()-&gt;disableLayout();
$this-&gt;_helper-&gt;viewRenderer-&gt;setNoRender();

Zend_Debug::dump($_FILES);
Zend_Debug::dump($_POST);

}

/**
* Retorna o json com as informações do progresso do upload.
*
* @return void
*/
public function processInfoAction()
{
Zend_Layout::getMvcInstance()-&gt;disableLayout();
$this-&gt;_helper-&gt;viewRenderer-&gt;setNoRender();

$id = $this-&gt;_getParam('id');
echo Zend_Json::encode(uploadprogress_get_info($id));
}
}
</pre>
<p><strong>indexAction </strong>apenas renderiza o formulário passando o ID do post. É por este ID que a extensão saberá identificar de qual upload deve ser retornado as informações.</p>
<p><strong>processAction</strong> apenas recebe os arquivos e ecoa na tela as informações.</p>
<p><strong>processInfoAction </strong>recebe o ID do upload e retorna o json necessário para o javascript fazer a barra de progresso.</p>
<p>Este é o HTML montado para o upload. Notem que é obrigatório o campo hidden com o identificador gerado no indexAction.</p>
<pre class="brush: xml;">

&lt;form action=&quot;&lt;?= $this-&gt;url(array('action'=&gt;'process')) ?&gt;&quot; id=&quot;frmUpload&quot; enctype=&quot;multipart/form-data&quot; method=&quot;post&quot;&gt;
&lt;input type=&quot;hidden&quot; name=&quot;UPLOAD_IDENTIFIER&quot; value=&quot;&lt;?= $this-&gt;id; ?&gt;&quot; id=&quot;UPLOAD_IDENTIFIER&quot;/&gt;

&lt;label&gt;Select File:&lt;/label&gt;
&lt;input type=&quot;file&quot; name=&quot;file&quot; style=&quot;display:block&quot; /&gt;

&lt;input type=&quot;submit&quot; value=&quot;ok&quot; /&gt;
&lt;/form&gt;
&lt;div id=&quot;uploadprogressbar&quot;&gt;&lt;/div&gt;
</pre>
<p>A div identificada por &#8220;uploadprogressbar&#8221; é onde o será feita a barra de progresso.</p>
<p>O que resta agora é somente o javascript. Para a barra de progresso é necessário o <a title="Core jQuery" href="http://code.google.com/p/jqueryjs/downloads/detail?name=jquery-1.3.2.min.js&amp;downloadBtn=" target="_blank">jQuery </a>e o plugin <a title="Plugin ProgressBar" href="http://t.wits.sg/2008/06/20/jquery-progress-bar-11/" target="_blank">jQuery ProgressBar</a>.</p>
<p>Inclua o seguinte código JS no header da página que terá o formulário.</p>
<pre class="brush: jscript;">

&lt;script type=&quot;text/javascript&quot;&gt;
var progress_key;

$(document).ready(function() {
progress_key = $(&quot;#UPLOAD_IDENTIFIER&quot;).val();
$(&quot;#frmUpload&quot;).bind(&quot;submit&quot;, function() {
beginUpload();
});
$(&quot;#uploadprogressbar&quot;).progressBar();
});

function beginUpload() {
$(&quot;#uploadprogressbar&quot;).fadeIn();
setTimeout(&quot;showUpload()&quot;, 100);
}

function showUpload() {
$.get(&quot;&lt;?= $this-&gt;url(array('action'=&gt;'process.info')); ?&gt;/id/&quot; + progress_key, function(data) {
if (!data)
return;

var response;
eval (&quot;response = &quot; + data);

if (!response)
return;

var percentage = Math.floor(100 * parseInt(response['bytes_uploaded']) / parseInt(response['bytes_total']));
$(&quot;#uploadprogressbar&quot;).progressBar(percentage);

});
setTimeout(&quot;showUpload()&quot;, 100);
}
&lt;/script&gt;
</pre>
<p>Feito isso, é só testar e ver o resultado.  <img src='http://www.talesaugusto.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Para mais informações do plugin ProgressBar acesse o <a href="http://t.wits.sg/2008/06/20/jquery-progress-bar-11/" target="_blank">site </a>do mesmo.</p>
<p>Qualquer dúvida entre em contato que farei o possível para ajudar.</p>
<p>Abraços!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.talesaugusto.com.br/zend-framework-upload-progressbar/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>1° Encontro do PHP MG</title>
		<link>http://www.talesaugusto.com.br/1%c2%b0-encontro-do-php-mg/</link>
		<comments>http://www.talesaugusto.com.br/1%c2%b0-encontro-do-php-mg/#comments</comments>
		<pubDate>Wed, 22 Apr 2009 18:31:56 +0000</pubDate>
		<dc:creator>Tales</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.talesaugusto.com.br/?p=39</guid>
		<description><![CDATA[Acontecerá neste fim de semana próximo o 1° encontro do grupo de desenvolvedores mineiros.  O 1º Encontro do PHP MG será realizado no dia 25/04/2009 na Uni-BH, campus Estoril, auditório B5, em Belo Horizonte. É um evento focado no mercado de desenvolvimento web, proporcionando aos participantes o contato interpessoal e o conhecimento das melhores práticas [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.phpmg.com/wp-content/themes/black-and-red/images/logo.gif" alt="" width="68" height="62" align="left" />Acontecerá neste fim de semana próximo o 1° encontro do grupo de desenvolvedores mineiros.  O 1º Encontro do PHP MG será realizado no dia 25/04/2009 na <a href="http://www.unibh.br/">Uni-BH</a>, campus Estoril, auditório B5, em Belo Horizonte. É um evento focado no mercado de desenvolvimento web, proporcionando aos participantes o contato interpessoal e o conhecimento das melhores práticas e últimas novidades e tendências, no que se diz respeito à tecnologia.</p>
<p>Mais informações à respeito do evento pode ser encontradas no <a title="phpMG" href="http://www.phpmg.com/1-encontro-do-php-mg" target="_blank">site oficial do grupo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.talesaugusto.com.br/1%c2%b0-encontro-do-php-mg/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Zend Framework + jQuery Flexigrid</title>
		<link>http://www.talesaugusto.com.br/zend-framework-jquery-flexigrid/</link>
		<comments>http://www.talesaugusto.com.br/zend-framework-jquery-flexigrid/#comments</comments>
		<pubDate>Mon, 30 Mar 2009 02:25:52 +0000</pubDate>
		<dc:creator>Tales</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Ajax]]></category>

		<guid isPermaLink="false">http://www.talesaugusto.com.br/?p=16</guid>
		<description><![CDATA[Como muitos plugins escritos em javascript para o jQuery, o Flexigrid é mais uma opção para os desenvolvedores que procuraram agilidade e qualidade em seus sistemas. Este plugin é capaz de transformar uma simples tabela (isso, aquela mesma&#8230;&#60;table&#62;&#60;/table&#62;) em uma fantástica grade de exibição de dados. Nela é possível acrescentar botões que executam rotinas em [...]]]></description>
			<content:encoded><![CDATA[<p>Como muitos plugins escritos em javascript para o jQuery, o Flexigrid é mais uma opção para os desenvolvedores que procuraram agilidade e qualidade em seus sistemas. Este plugin é capaz de transformar uma simples tabela (isso, aquela mesma&#8230;&lt;table&gt;&lt;/table&gt;) em uma fantástica grade de exibição de dados. Nela é possível acrescentar botões que executam rotinas em javascript, ordenar as colunas, esconder colunas, paginar os registros e outras coisas legais. Após alguns testes com este plugin, surgiu a idéia de integrá-lo com o ZF. Criei as classes para controlar as configurações do Flexigrid e um helper que renderiza as configurações no cabeçalho da página. Procurei tornar as configurações mais genéricas possíveis. Havendo algum problema, entre em contato para tentar-mos solucioná-lo.</p>
<p>Para tentar exemplificar, irei fazer um passo-a-passo da integração. Estou assumindo que seu projeto já esteja funcionando corretamente, ou seja, MVC configurado corretamente e etc.</p>
<p>A primeira coisa a se fazer é adicionar o componente no mesmo nível onde está o ZF:</p>
<p>/library</p>
<p>/library/Tavs</p>
<p>/library/Zend</p>
<p>Feito isso, seu projeto já terá acesso ao componente Flexigrid. Obs: Tomei o cuidado de escrever as classes mantendo o padrão adotado pelo ZF, onde cada &#8220;/&#8221; é representada por &#8220;_&#8221; no nome da classe.</p>
<p>Com o componente incluído, já podemos escrever no controller os métodos que farão configuração do Flexigrid.</p>
<p>IndexController.php</p>
<pre class="brush: php;">

&lt;?php

class IndexController extends Zend_Controller_Action
{
/**
* Retorna a instancia do flexigrid
*
* @return Tavs_jQuery_Flexigrid
*/
private function _getFlexigrid()
{
$front = $this-&amp;gt;getFrontController();
$flexigrid = new Tavs_jQuery_Flexigrid($front-&amp;gt;getBaseUrl() . '/index/list');

$flexigrid
-&amp;gt;setTitle('Clientes')
-&amp;gt;orderBy(
$this-&amp;gt;_getParam('sortname', 'cliente_nome'),
$this-&amp;gt;_getParam('sortorder', Tavs_jQuery_Flexigrid::SORT_ASC)
);

$flexigrid
-&amp;gt;addColumn('text', 'cliente_nome', array(
'label' =&amp;gt; 'Nome'
))
-&amp;gt;addColumn('text', 'cliente_email', array(
'label' =&amp;gt; 'Email'
))
-&amp;gt;addColumn('date', 'cliente_nascimento', array(
'label' =&amp;gt; 'Data de Nascimento',
'align' =&amp;gt; Tavs_JQuery_Flexigrid_Column_Abstract::ALIGN_CENTER
))
-&amp;gt;addColumn('checkbox', 'cliente_ativo', array(
'label' =&amp;gt; 'Ativo?',
'align' =&amp;gt; Tavs_JQuery_Flexigrid_Column_Abstract::ALIGN_CENTER
));

//seletor e atributos da tabela
$flexigrid
-&amp;gt;setSelector('#grid-clientes')
-&amp;gt;addTableAttrib('id', 'grid-clientes');

//paginacao
$flexigrid-&amp;gt;configPaginator($this-&amp;gt;_getParam('rp', 20), $this-&amp;gt;_getParam('page', 1));

return $flexigrid;

}

/**
* Recupera e a manda para a view a instancia do Flexigrid
*/
public function indexAction()
{
$this-&amp;gt;view-&amp;gt;flexigrid = $this-&amp;gt;_getFlexigrid();
}

/**
* Faz a busca no banco de dados para listar no flexigrid.
*
*/
public function listAction()
{

Zend_Layout::getMvcInstance()-&amp;gt;disableLayout();
$this-&amp;gt;_helper-&amp;gt;viewRenderer-&amp;gt;setNoRender(true);

//cria o objeto para montar da query
$db = Zend_Db_Table::getDefaultAdapter();
$select = $db-&amp;gt;select();

//monta o select
$select-&amp;gt;from(array('C'=&amp;gt;'cliente'), array('cliente_id', 'cliente_nome', 'cliente_email', 'cliente_nascimento', 'cliente_ativo'));

$field_search = $this-&amp;gt;_getParam('qtype');
$field_search_value = $this-&amp;gt;_getParam('query');

if ( !empty($field_search) &amp;amp;&amp;amp; !empty($field_search_value) )
{
$select-&amp;gt;where($field_search . ' LIKE ?', '%' . $field_search_value . '%');
}

$flexigrid = $this-&amp;gt;_getFlexigrid();

echo $flexigrid-&amp;gt;generateRows($select, 'cliente_id');

}

}
</pre>
<p>É importante lembrar que a inclusão de colunas no flexigrid é obrigatória. O parâmetro do construtor é a URL que o flexigrid irá chamar para popular o grid com o dados. Lembrando que essa requisição é feita com AJAX. <img src='http://www.talesaugusto.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>A principal característica deste componente é a personalização das colunas. No exemplo acima temos 4 colunas: duas com texto normal, uma para exibição de data e outra para checkbox. Atualmente, o componente suporta colunas para:</p>
<p>1. Checkbox<br />
2. Date<br />
3. Link<br />
4. Select<br />
5. Text</p>
<p>Para criar uma coluna personalizada por você, é necessário extender a classe Tavs_JQuery_Flexigrid_Column_Abstract e implementar o método render(). Ainda não tive tempo para documentar a utilização do componente, mas é só fazer uma boa leitura no código que fica trivial.</p>
<p>O método listAction monta a consulta para executar no banco de dados. Depois de criado o objeto $select, este é passado como parametro para o método $flexigrid-&gt;generateRows onde será configurada a paginação e trazer somente os registros necessários para a página em questão.</p>
<p>Depois de configurado o flexigrid, ecoamos a instância que foi enviada para a view:</p>
<p>index.phtml</p>
<pre class="brush: php;">

&lt;?php echo $this-&gt;flexigrid ?&gt;
</pre>
<p>Está quase pronto! Agora falta incluirmos os arquivos jquery.js, flexigrid.js e flexigrid.css. Normalmente se faz essas inclusões no layout &#8220;master&#8221; da aplicação, no meu caso:</p>
<p>main.phtml</p>
<pre class="brush: php;">

&lt;?php

$base = Zend_Controller_Front::getInstance()-&gt;getBaseUrl();

$this
-&gt;headScript()
-&gt;appendFile( $base . '/scripts/jquery-1.2.6.min.js' )
-&gt;appendFile( $base . '/scripts/flexigrid.js' );

$this
-&gt;headLink()
-&gt;appendStylesheet( $base . '/styles/flexigrid.css' );

echo $this-&gt;doctype()
?&gt;
&lt;html&gt;

&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot;; content=&quot;text/html; charset=UTF-8&quot; /&gt;
&lt;?php
echo $this-&gt;headScript();
echo $this-&gt;headLink();
echo $this-&gt;JQuery();
?&gt;
&lt;/head&gt;

&lt;body&gt;
&lt;?php echo $this-&gt;layout()-&gt;content ?&gt;
&lt;/body&gt;

&lt;/html&gt;
</pre>
<p>Arquivos utilizados para o tutorial:</p>
<p>* <a href="http://www.talesaugusto.com.br/downloads/jquery-1.2.6.min.js">Biblioteca jQuery</a><br />
* <a href="http://www.talesaugusto.com.br/downloads/flexigrid.zip">Flexigrid</a><br />
* <a href="http://www.talesaugusto.com.br/downloads/Tavs.zip">Tavs Library baseado em ZF (Classes PHP).</a></p>
<p>Script de banco de dados usado no tutorial:</p>
<p>CREATE TABLE `cliente` (<br />
`cliente_id` int(11) NOT NULL,<br />
`cliente_nome` varchar(50) NOT NULL,<br />
`cliente_email` varchar(50) NOT NULL,<br />
`cliente_nascimento` datetime NOT NULL,<br />
`cliente_ativo` int(11) NOT NULL default &#8216;1&#8242;,<br />
PRIMARY KEY  (`cliente_id`)<br />
) ENGINE=InnoDB DEFAULT CHARSET=latin1;</p>
<p>&#8211;<br />
&#8211; Extraindo dados da tabela `cliente`<br />
&#8211;</p>
<p>INSERT INTO `cliente` VALUES(1, &#8216;Tales&#8217;, &#8216;tales@gmail.com&#8217;, &#8216;2009-03-29 22:15:00&#8242;, 0);<br />
INSERT INTO `cliente` VALUES(2, &#8216;Tales&#8217;, &#8216;tales@hotmail.com&#8217;, &#8216;2009-03-27 22:15:11&#8242;, 1);</p>
<p>Qualquer contribuição é sempre bem vinda. Correção de bugs ou coisas do gênero pode ser informado através do email contato@talesaugusto.com.br</p>
<p>É isso aí pessoal, espero que ter conseguido passar alguma informação útil a vocês.</p>
<p>Abraços.</p>
<p> <img src='http://www.talesaugusto.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.talesaugusto.com.br/zend-framework-jquery-flexigrid/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Automatização de tabindex com Zend_Form</title>
		<link>http://www.talesaugusto.com.br/automatizacao-de-tabindex-com-zend_form/</link>
		<comments>http://www.talesaugusto.com.br/automatizacao-de-tabindex-com-zend_form/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 23:22:36 +0000</pubDate>
		<dc:creator>Tales</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.talesaugusto.com.br/?p=3</guid>
		<description><![CDATA[Olá pessoal.
Para este primeiro post no blog, mostrarei um simples exemplo de como adicionar uma funcionalidade trivial no componente Zend_Form do ZF.
Basicamente, o que fiz é extender a classe Zend_Form e sobrepor o método addElement. Este método adiciona um novo elemento ao Zend_Form e seta o atributo tabindex se este não estiver setado anteriormente.


class MyForm [...]]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal.</p>
<p>Para este primeiro post no blog, mostrarei um simples exemplo de como adicionar uma funcionalidade trivial no componente Zend_Form do ZF.</p>
<p>Basicamente, o que fiz é extender a classe Zend_Form e sobrepor o método addElement. Este método adiciona um novo elemento ao Zend_Form e seta o atributo tabindex se este não estiver setado anteriormente.</p>
<pre class="brush: php;">

class MyForm extends Zend_Form {

private $_elementTabindex = 1;

public function addElement($element, $name = null, $options = null) {

parent::addElement($element, $name, $options);

if (null !== $name) {
$element = $this-&gt;getElement($name);
}

if (!isset($element-&gt;tabindex)) {
$element-&gt;tabindex = $this-&gt;_elementTabindex++;
}

return $element;

}

}
</pre>
<p>Este foi post, na verdade, foi para me familiarizar com a ferramenta Worpress. Estou preparando materiais para outros posts mais &#8220;robustos&#8221;. Pretendo escrever algo sobre ZF e jQuery.</p>
<p>Aguardem!</p>
<p> <img src='http://www.talesaugusto.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.talesaugusto.com.br/automatizacao-de-tabindex-com-zend_form/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
