<?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; PHP</title>
	<atom:link href="http://www.talesaugusto.com.br/tag/php/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>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>
