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