<?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>Chris B. - idéias e pensamentos &#187; js calls php</title>
	<atom:link href="http://www.chrisb.com.br/blog/category/js-calls-php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.chrisb.com.br/blog</link>
	<description>Misturando ideias e pensamentos: tecnologia (PHP, Wordpress, javascript, programação), web 2.0 (javascript, ajax, prototype, jQuery) e experiências de vida</description>
	<lastBuildDate>Tue, 18 May 2010 19:32:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Mostrando o potencial da JS Calls PHP #5 – geolocalização</title>
		<link>http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-5-%e2%80%93-geolocalizacao/</link>
		<comments>http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-5-%e2%80%93-geolocalizacao/#comments</comments>
		<pubDate>Sat, 11 Jul 2009 21:19:38 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[js calls php]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.chrisb.com.br/blog/?p=1786</guid>
		<description><![CDATA[Fazia muito tempo que não postava nada sobre a JS Calls PHP &#8211; muito trabalho, pouco tempo livre&#8230; coisas da vida. Aproveitei um tempinho livre nesse sábado para integrar uma classe que vi de geolocalização com a biblioteca, possibilitando que sejam retornados dados como cidade e estado relativos a um IP via javascript, requisitando assincronamente [...]]]></description>
			<content:encoded><![CDATA[<p>Fazia muito tempo que não postava nada sobre a <strong>JS Calls PHP</strong> &#8211; muito trabalho, pouco tempo livre&#8230; coisas da vida.</p>
<p>Aproveitei um tempinho livre nesse sábado para integrar uma classe que vi de <strong>geolocalização</strong> com a biblioteca, possibilitando que sejam retornados dados como cidade e estado relativos a um IP via javascript, requisitando assincronamente uma classe PHP.</p>
<p><strong></strong><strong><a href="http://www.chrisb.com.br/jscallsphp/unit/ip.php">Veja aqui uma página de exemplo!</a></strong></p>
<p>A <a href="http://www.phpclasses.org/browse/package/3813.html">classe original pode ser baixada aqui</a>, só tive que fazer algumas modificações na mesma, conforme o código abaixo:</p>
<pre class="brush: php;">
&lt;?php
include 'PHP45.XML.php';

class GeoLocalizacao {
// XML document
var $doc  = null;
// string describing the host of the geo location service
var $host = "http://api.hostip.info/?ip=&lt;IP&gt;";

// string describing the city
public $city      = 'unknown';
// string describing the country
public $country   = 'unknown';
// longitude
public $longitude = '0';
// latitude
public $latitude  = '0';

public function __construct() {

}

public function geoLocation($ip) {

$this-&gt;doc = new PHP45XML();
$this-&gt;doc-&gt;preserveWhiteSpace = false;

// prepare url of service
$host  = str_replace( "&lt;IP&gt;", $ip, $this-&gt;host);

$reply = $this-&gt;fetch($host);

// decode the reply and make it available
//echo $reply;
//return false;
$this-&gt;decode($reply);
return array("city"=&gt;$this-&gt;city, "country"=&gt;$this-&gt;country, "lng"=&gt;$this-&gt;longitute, "lat"=&gt;$this-&gt;latitude);
}

function fetch($host) {
$reply = 'error';
// try curl or fopen
if( function_exists('curl_init') ) {
// use curl too fetch site
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL           , $host);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$reply = curl_exec($ch);
curl_close ($ch);
} else {
// fall back on fopen
$reply = file_get_contents($host, 'r');
}
return $reply;
}

function decode($text) {
// load in php version independent manner
$this-&gt;doc-&gt;loadXML($text);
// use the PHP4/5 XML wrapper to decode the result
$result = $this-&gt;doc-&gt;xpath("//gml:name");

$this-&gt;city      = $result['city'];

$this-&gt;country   = $result['country'];
$this-&gt;longitude = $result['lng'];
$this-&gt;latitude  = $result['lat'];
}
}
?&gt;
</pre>
<p>Essa classe utiliza a <em>API</em> do site <a href="http://api.hostip.info">http://api.hostip.info</a>, que passando um endereço IP retorna um XML com as informações. A classe trata esses dados e retorna um <em>array</em> com as chaves/valores para cidade, estado, longitude e latitude.</p>
<p>Depois de expor essa classe no config.php (conforme <a href="http://www.chrisb.com.br/blog/js-calls-php-interacao-entre-javascript-e-php/">explicado na documentação oficial</a>) sob o nome <em>geo</em>, o único trabalho foi fazer um html que chama o método <em>geoLocation</em> passando o valor de um <em>input</em> como parâmetro, e no retorno dou um alert exibindo a cidade e o estado.</p>
<pre class="brush: php;">
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;
&lt;title&gt;IP&lt;/title&gt;
&lt;script type="text/javascript" src="../engine.js"&gt;&lt;/script&gt;
&lt;script type="application/javascript" src="../interface/geo.js"&gt;&lt;/script&gt;
&lt;script type="application/javascript"&gt;
window.onload = function() {
document.getElementById("submit").onclick = function() {

var ip = document.getElementById("ip").value;

geo.geoLocation(ip, function(myIp) {
alert("cidade: " + myIp.city + "\npaís: " + myIp.country);
})

}
}
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

Digite um endereço de IP para ver qual a cidade e país de origem:
&lt;input type="text" name="ip" id="ip" /&gt;
&lt;input type="button" value="checar" id="submit" /&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Funcionamento simples, como sempre, com a <strong>JS Calls PHP</strong>!</p>
<p><a href="../jscallsphp.zip">Faça download da JS Calls PHP aqui</a></p>
<h3  class="related_post_title">Veja também</h3><ul class="related_post"></ul>]]></content:encoded>
			<wfw:commentRss>http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-5-%e2%80%93-geolocalizacao/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Mostrando o potencial da JS Calls PHP #4 &#8211; enviando e-mail</title>
		<link>http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-4-enviando-e-mail/</link>
		<comments>http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-4-enviando-e-mail/#comments</comments>
		<pubDate>Sun, 31 May 2009 16:38:17 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[js calls php]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.chrisb.com.br/blog/?p=1587</guid>
		<description><![CDATA[Estava fazendo para um freela um envio de e-mail num formulário, com backend PHP, e resolvi usar a JS Calls PHP. Demorou mais tempo do que se fizesse um send.php comum, mas serviu para testar a biblioteca e descobrir uma incompatibilidade em alguns momentos com a Prototype &#8211; imcompatibilidade essa já corrigida. Então, vou mostrar [...]]]></description>
			<content:encoded><![CDATA[<p>Estava fazendo para um freela um envio de e-mail num formulário, com backend PHP, e resolvi usar a <strong>JS Calls PHP</strong>. Demorou mais tempo do que se fizesse um <em>send.php</em> comum, mas serviu para testar a biblioteca e descobrir uma incompatibilidade em alguns momentos com a Prototype &#8211; imcompatibilidade essa já corrigida.</p>
<p>Então, vou mostrar um exemplo de como fazer um formulário onde o usuário digita o e-mail dele, um e-mail de destino e uma mensagem, e a <strong>JS Calls PHP</strong> faz o envio por e-mail dessa mensagem.</p>
<p><strong><a href="http://www.chrisb.com.br/jscallsphp/unit/teste_mail.html">Veja aqui uma página de exemplo!</a></strong></p>
<p>Criei uma classe chamada <em>MailContato</em> e nela um método, <em>simpleSend</em>(), que recebe três parámetros: e-mail de quem envie, e-mail de destino e a mensagem</p>
<blockquote><p><em>&lt;?php<br />
class MailContato {<br />
function __construct() {</em></p>
<p><em>}</em></p>
<p><em>function simpleSend($sender, $receiver, $message) {<br />
$header = &#8220;Content-type: text/html; charset=UTF-8\r\n&#8221;;<br />
ini_set(&#8216;sendmail_from&#8217;, $sender);<br />
mail($receiver, &#8220;Contato&#8221;, $message, $header) or die(&#8220;-1&#8243;);<br />
return true;</em></p>
<p><em>}<br />
}<br />
?&gt;</em></p></blockquote>
<p>No config.php da <strong>JS Calls PHP</strong> expus a classe sob o nome <em>mailContato</em> e, com isso, posso acessar o método <em>simpleSend </em>passandoos três parâmetros, conforme pode ser visto no html abaixo</p>
<blockquote><p><em>&lt;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.0 Transitional//EN&#8221; &#8220;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#8221;&gt;<br />
&lt;html xmlns=&#8221;http://www.w3.org/1999/xhtml&#8221;&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=UTF-8&#8243; /&gt;<br />
&lt;title&gt;Untitled Document&lt;/title&gt;<br />
&lt;script type=&#8221;text/javascript&#8221; src=&#8221;../engine.js&#8221;&gt;&lt;/script&gt;<br />
&lt;script type=&#8221;text/javascript&#8221; src=&#8221;../interface/mailContato.js&#8221;&gt;&lt;/script&gt;<br />
&lt;script type=&#8221;application/javascript&#8221;&gt;<br />
window.onload = function() {<br />
document.getElementById(&#8220;submit&#8221;).onclick = function() {<br />
var sender = document.getElementById(&#8220;sender&#8221;).value;<br />
var receiver = document.getElementById(&#8220;receiver&#8221;).value;<br />
var msg = document.getElementById(&#8220;message&#8221;).value;<br />
mailContato.simpleSend(sender, receiver, msg, function(status) {</em></p>
<p><em>if(status==true)<br />
alert(&#8220;Mensagem enviada com sucesso&#8221;);<br />
})</em></p>
<p><em>}<br />
}<br />
&lt;/script&gt;<br />
&lt;/head&gt;</em></p>
<p><em>&lt;body&gt;<br />
&lt;h1&gt;JS Calls PHP&lt;/h1&gt;<br />
&lt;h2&gt;Exemplo de uso &#8211; mensagem por e-mail&lt;/h2&gt;</em></p>
<p><em>&lt;form action=&#8221;#&#8221; id=&#8221;commentform&#8221; method=&#8221;POST&#8221; onsubmit=&#8221;return false;&#8221;&gt;<br />
&lt;label for=&#8221;sender&#8221;&gt;seu e-mail:&lt;/label&gt;&lt;input type=&#8221;text&#8221; id=&#8221;sender&#8221; /&gt;&lt;br /&gt;<br />
&lt;label for=&#8221;receiver&#8221;&gt;e-mail destino:&lt;/label&gt;&lt;input type=&#8221;text&#8221; id=&#8221;receiver&#8221; /&gt;&lt;br /&gt;<br />
sua mensagem:&lt;br /&gt;<br />
&lt;textarea id=&#8221;message&#8221;&gt;&lt;/textarea&gt;<br />
&lt;input type=&#8221;submit&#8221; id=&#8221;submit&#8221; value=&#8221;enviar&#8221; /&gt;<br />
&lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</em></p></blockquote>
<p>No retorno da função, exibo a mensagem de sucesso caso a funcão retorne <em>true</em>. Simples!</p>
<p><a href="http://www.chrisb.com.br/blog/jscallsphp.zip">Faça download da JS Calls PHP aqui</a></p>
<h3  class="related_post_title">Posts relacionados</h3><ul class="related_post"><li><a href="http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-3-acessando-a-api-do-youtube/" title="Mostrando o potencial da JS Calls PHP #3 &#8211; acessando a API do Youtube">Mostrando o potencial da JS Calls PHP #3 &#8211; acessando a API do Youtube</a> (2)</li><li><a href="http://www.chrisb.com.br/blog/pagina-de-debug-na-js-calls-php/" title="Página de debug na JS Calls PHP">Página de debug na JS Calls PHP</a> (1)</li><li><a href="http://www.chrisb.com.br/blog/consulta-de-cep-em-ajax/" title="Consulta de CEP em ajax">Consulta de CEP em ajax</a> (17)</li><li><a href="http://www.chrisb.com.br/blog/classe-para-acessar-a-api-do-blogblogs/" title="Classe para acessar a API do BlogBlogs">Classe para acessar a API do BlogBlogs</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-4-enviando-e-mail/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Mostrando o potencial da JS Calls PHP #3 &#8211; acessando a API do Youtube</title>
		<link>http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-3-acessando-a-api-do-youtube/</link>
		<comments>http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-3-acessando-a-api-do-youtube/#comments</comments>
		<pubDate>Tue, 19 May 2009 14:45:35 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[js calls php]]></category>
		<category><![CDATA[web 2.0]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://www.chrisb.com.br/blog/?p=1561</guid>
		<description><![CDATA[Segue abaixo mais um exemplo do que pode ser feito com a JS Calls PHP: acessar a API do Youtube. Veja aqui uma página de exemplo! Como? Primeiro, baixei essa classe que está no repositório do PHPClasses, que faz todo o trabalho de requisitar a API e trabalhar com o retorno, num xml. Só alterer [...]]]></description>
			<content:encoded><![CDATA[<p>Segue abaixo mais um exemplo do que pode ser feito com a <a href="http://www.chrisb.com.br/blog/js-calls-php-interacao-entre-javascript-e-php/"><strong>JS Calls PHP</strong></a>: acessar a <em>API</em> do <strong>Youtube</strong>.</p>
<p><a href="http://www.chrisb.com.br/jscallsphp/unit/teste_youtubeapi.php"><strong>Veja aqui uma página de exemplo!</strong></a></p>
<p>Como? Primeiro, baixei<a href="http://www.phpclasses.org/browse/package/4664.html"> essa classe que está no repositório do PHPClasses</a>, que faz todo o trabalho de requisitar a <em>API</em> e trabalhar com o retorno, num xml. Só alterer a mesma criando o método <em>searchStreamingLinks()</em>, o qual exponho para a biblioteca.</p>
<blockquote><p><em>&lt;?php<br />
define(&#8220;ANY&#8221;,0);<br />
define(&#8220;PC&#8221;,1);<br />
define(&#8220;MOBILE&#8221;,2);</em></p>
<p><em>/**<br />
* This class fetching live streaming links of youtube videos, both for mobile (real player) and PC (flash player)<br />
*<br />
*@author Rochak Chauhan [www.dmwtechnologies.com]<br />
*/<br />
class YoutubeAPI {<br />
private $startIndex=1;<br />
private $format=PC;<br />
private $maxResults=10;<br />
private $keyword=&#8221;";<br />
private $feedString=&#8221;";<br />
private $downloadUrl=&#8221;http://demo.dmwtechnologies.com/YouTubeDownloader/index.php&#8221;;</em></p>
<p><em>public function __construct() {</em></p>
<p><em>}</em></p>
<p><em>/**<br />
* Function to get the XML code from the YouTubeAPI<br />
*<br />
* @param string $url<br />
* @access private<br />
*<br />
* @return string<br />
*/<br />
private function getXmlCodeViaFopen($url){<br />
$returnStr=&#8221;";<br />
$fp=fopen($url, &#8220;r&#8221;) or die(&#8220;ERROR: Illigal YouTube API URL&#8221;);<br />
while (!feof($fp)) {<br />
$returnStr.=fgetc($fp);<br />
}<br />
fclose($fp);<br />
return $returnStr;<br />
}</em></p>
<p><em>/**<br />
* Function to get the Title from the XML/RSS Feed<br />
*<br />
* @param string $str<br />
* @access private<br />
* @return string<br />
*/<br />
private function getTitle($str) {<br />
$final=array();<br />
$returnArray=array();<br />
$pattern=&#8221;/&lt;title type=&#8217;text&#8217;&gt;(.*)\&lt;\/title\&gt;/Uis&#8221;;<br />
preg_match_all($pattern, $str, $returnArray, PREG_SET_ORDER);<br />
if(isset($returnArray[0][1])) {<br />
return $returnArray[0][1];<br />
}<br />
else {<br />
return &#8220;NA&#8221;;<br />
}<br />
}</em></p>
<p><em>/**<br />
* Function to get the FLV/SWF url from the XML/RSS Feed<br />
*<br />
* @param string $str<br />
* @access private<br />
* @return string<br />
*/<br />
private function getFlvUrl($str) {<br />
$final=array();<br />
$returnArray=array();<br />
$pattern=&#8221;/&lt;media:player url=&#8217;(.*)&#8217;/Uis&#8221;;<br />
//$pattern=&#8221;/&lt;media:content url=&#8217;(.*)&#8217; type=&#8217;application\/x-shockwave-flash&#8217;/Uis&#8221;;<br />
preg_match_all($pattern, $str, $returnArray, PREG_SET_ORDER);</em></p>
<p><em>if(isset($returnArray[0][1])) {<br />
return $returnArray[0][1];<br />
}<br />
else {<br />
return &#8220;#&#8221;;<br />
}<br />
}</em></p>
<p><em>/**<br />
* Function to get the mobile streaming url from the XML/RSS Feed<br />
*<br />
* @param string $str<br />
* @access private<br />
* @return string<br />
*/<br />
private function getMobileUrl($str) {</em></p>
<p><em>$final=array();<br />
$returnArray=array();<br />
$pattern=&#8221;/&lt;media:content url=&#8217;(.*)&#8217; type=&#8217;video\/3gpp&#8217;/Uis&#8221;;<br />
preg_match_all($pattern, $str, $returnArray, PREG_SET_ORDER);</em></p>
<p><em>if(isset($returnArray[1][1])) {<br />
return $returnArray[1][1];<br />
}<br />
else {<br />
return &#8220;#&#8221;;<br />
}<br />
}</em></p>
<p><em>/**<br />
* Function to get the video thumbnail from the XML/RSS Feed<br />
*<br />
* @param string $str<br />
* @access private<br />
* @param boolean $returnAllThumbsAsArray<br />
* @return string<br />
*/<br />
private function getThumbnailUrl($str,$returnAllThumbsAsArray=false) {<br />
$final=array();<br />
$returnArray=array();<br />
$imgArray=array();<br />
$imgPattern=&#8221;/&lt;media:thumbnail url=&#8217;(.*)&#8217;/Uis&#8221;;<br />
preg_match_all($imgPattern, $str, $tmp, PREG_SET_ORDER);</em></p>
<p><em>$c=count($tmp);<br />
$l=-1;<br />
foreach($tmp as $key=&gt;$value){<br />
$value=$value[1];<br />
$imgArray[]=$value;<br />
}<br />
if($returnAllThumbsAsArray===true){<br />
return $imgArray;<br />
}<br />
else{<br />
return $imgArray[3];<br />
}<br />
}</em></p>
<p><em>/**<br />
* Function to get Streaming link info<br />
*<br />
* @param string $feed<br />
* @access public<br />
* @return array<br />
*/<br />
public function getStreamingLinks() {<br />
$feed=$this-&gt;feedString;<br />
$final=array();<br />
$returnArray=array();<br />
$pattern=&#8221;/&lt;title type=&#8217;text&#8217;&gt;(.*)&lt;category scheme=&#8217;http:\/\/gdata.youtube.com\/schemas\/2007\/keywords.cat&#8217;/Uis&#8221;;<br />
preg_match_all($pattern, $feed, $returnArray, PREG_SET_ORDER);</em></p>
<p><em>for($i=1;$i&lt;count($returnArray);$i++){<br />
$str=$returnArray[$i][0];<br />
$title=$this-&gt;getTitle($str);<br />
$flvUrl=$this-&gt;getFlvUrl($str);<br />
$mobileUrl=$this-&gt;getMobileUrl($str);<br />
$thumbnailUrl=$this-&gt;getThumbnailUrl($str);<br />
if ($this-&gt;format==PC) {<br />
$final[]=array(&#8220;title&#8221;=&gt;$title,&#8221;flvurl&#8221;=&gt;$flvUrl,&#8221;thumbnailUrl&#8221;=&gt;$thumbnailUrl);<br />
}<br />
elseif ($this-&gt;format==MOBILE) {<br />
$final[]=array(&#8220;title&#8221;=&gt;$title,&#8221;mobileurl&#8221;=&gt;$mobileUrl,&#8221;thumbnailUrl&#8221;=&gt;$thumbnailUrl);<br />
}<br />
else {<br />
$final[]=array(&#8220;title&#8221;=&gt;$title,&#8221;flvurl&#8221;=&gt;$flvUrl,&#8221;mobileurl&#8221;=&gt;$mobileUrl,&#8221;thumbnailUrl&#8221;=&gt;$thumbnailUrl);<br />
}<br />
}<br />
return $final;<br />
}</em></p>
<p><em>/**<br />
* Function to get the downloadable link of the flv file<br />
*<br />
* @param string $youtubeUrl<br />
* @return array on success else false<br />
* @access public<br />
*/<br />
public function getDownloadLink($youtubeUrl) {<br />
// get download link Page<br />
$post_data=&#8221;url=$youtubeUrl&#8221;;<br />
$ch = curl_init();<br />
curl_setopt($ch, CURLOPT_URL, $this-&gt;downloadUrl);<br />
curl_setopt($ch, CURLOPT_POST, 1 );<br />
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);<br />
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);<br />
$htmlCode = curl_exec($ch);<br />
curl_close($ch);<br />
$returnArray=array();<br />
// extract link from the htmlcode<br />
$pattern=&#8221;/&lt;a href=&#8217;(.*)\&lt;\/a\&gt;/Uis&#8221;;<br />
preg_match_all($pattern, $htmlCode, $returnArray, PREG_SET_ORDER);<br />
if(isset($returnArray[0][1])) {<br />
$str=trim($returnArray[0][1]);<br />
$pos=strpos($str,&#8221;&#8216;&#8221;);<br />
$link=substr($str,0,$pos);<br />
$title=strip_tags($returnArray[0][0]);<br />
return array(&#8220;title&#8221;=&gt;$title,&#8221;link&#8221;=&gt;$link);<br />
}<br />
else {<br />
return false;<br />
}<br />
}</em></p>
<p><em>public function searchStreamingLinks($keyword,$maxResults=10,$startIndex=1) {<br />
$this-&gt;keyword=$keyword;<br />
$this-&gt;format=ANY;<br />
$this-&gt;maxResults=$maxResults;<br />
$this-&gt;startIndex=$startIndex;<br />
$url=&#8221;http://gdata.youtube.com/feeds/api/videos?vq=&#8221; . urlencode($keyword) .&#8221;&amp;start-index=$startIndex&amp;max-results=$maxResults&#8221;;<br />
$this-&gt;feedString=$this-&gt;getXmlCodeViaFopen($url);<br />
return $this-&gt;getStreamingLinks();<br />
}</em></p>
<p><em>}<br />
?&gt;<br />
</em></p></blockquote>
<p>No config.php da <strong>JS Calls PHP</strong> expus a classe sob o nome <em>youtube</em> e, com isso, posso acessar o método <em>searchStreamingLinks </em>passando uma palavra-chave como parâmetro e, ainda, quantos items quero exibir e qual o primeiro item a ser exibido.<em><br />
</em></p>
<blockquote><p><em>&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;script type=&#8221;text/javascript&#8221; src=&#8221;../engine.js&#8221;&gt;&lt;/script&gt;<br />
&lt;script type=&#8221;text/javascript&#8221; src=&#8221;../interface/youtube.js&#8221;&gt;&lt;/script&gt;<br />
&lt;script type=&#8221;text/javascript&#8221;&gt;</em></p>
<p><em>function getVideos() {<br />
document.getElementById(&#8220;videos&#8221;).innerHTML = &#8220;aguarde, buscando&#8230;&#8221;;<br />
youtube.searchStreamingLinks(document.getElementById(&#8220;keyword&#8221;).value, 10, 1, function(videos) {<br />
var ul = document.createElement(&#8220;ul&#8221;);<br />
for(var i=0; i&lt;videos.length; i++) {<br />
var video = videos[i];</em></p>
<p><em>var a = document.createElement(&#8220;a&#8221;);<br />
a.innerHTML = video.title;<br />
a.href = video.flvurl;</em></p>
<p><em>var img = document.createElement(&#8220;img&#8221;);<br />
img.src = video.thumbnailUrl;</em></p>
<p><em>var li = document.createElement(&#8220;li&#8221;);<br />
li.appendChild(img);<br />
li.appendChild(a);</em></p>
<p><em>ul.appendChild(li);<br />
}<br />
document.getElementById(&#8220;videos&#8221;).innerHTML = &#8220;&#8221;;<br />
document.getElementById(&#8220;videos&#8221;).appendChild(ul);<br />
});</em></p>
<p><em>}</em></p>
<p><em>&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;h1&gt;JS Calls PHP&lt;/h1&gt;<br />
&lt;h2&gt;Exemplo de uso &#8211; acesso a API do Youtube&lt;/h2&gt;<br />
&lt;label for=&#8221;keyword&#8221;&gt;Palavra-chave:&lt;/label&gt;&lt;input type=&#8221;text&#8221; name=&#8221;keyword&#8221; id=&#8221;keyword&#8221; /&gt;<br />
&lt;a href=&#8221;#&#8221; onClick=&#8221;getVideos(); return false;&#8221;&gt;buscar&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;<br />
&lt;div id=&#8221;videos&#8221;&gt;&lt;/div&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</em></p></blockquote>
<p>No retorno da chamada tenho uma lista de objetos, e cada objeto possui atributos title, flvurl e thumbnailUrl &#8211; com os quais posso montar a lista de vídeos!</p>
<p><a href="../../jscallsphp.zip">Faça download da JS Calls PHP aqui</a></p>
<h3  class="related_post_title">Posts relacionados</h3><ul class="related_post"><li><a href="http://www.chrisb.com.br/blog/classe-para-acessar-a-api-do-blogblogs/" title="Classe para acessar a API do BlogBlogs">Classe para acessar a API do BlogBlogs</a> (0)</li><li><a href="http://www.chrisb.com.br/blog/flickr-ou-picasa-depende-se-voce-e-desenvolvedor-ou-designer/" title="Flickr ou Picasa: depende se você é desenvolvedor ou designer?">Flickr ou Picasa: depende se você é desenvolvedor ou designer?</a> (13)</li><li><a href="http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-4-enviando-e-mail/" title="Mostrando o potencial da JS Calls PHP #4 &#8211; enviando e-mail">Mostrando o potencial da JS Calls PHP #4 &#8211; enviando e-mail</a> (7)</li><li><a href="http://www.chrisb.com.br/blog/pagina-de-debug-na-js-calls-php/" title="Página de debug na JS Calls PHP">Página de debug na JS Calls PHP</a> (1)</li><li><a href="http://www.chrisb.com.br/blog/google-charts-prototype-plugin/" title="Google Charts Prototype Plugin">Google Charts Prototype Plugin</a> (3)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-3-acessando-a-api-do-youtube/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Página de debug na JS Calls PHP</title>
		<link>http://www.chrisb.com.br/blog/pagina-de-debug-na-js-calls-php/</link>
		<comments>http://www.chrisb.com.br/blog/pagina-de-debug-na-js-calls-php/#comments</comments>
		<pubDate>Fri, 15 May 2009 01:42:33 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[js calls php]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.chrisb.com.br/blog/?p=1550</guid>
		<description><![CDATA[Já havia feito há algum tempo a página de debug/testes da JS Calls PHP, mas estava testando-a primeiro. Me parece que está bem estável e por isso resolvi disponibilizar. O que ela faz é listar todos os as classes expostas no arquivo de configuração, e todos os métodos das mesmas, para que o desenvolvedor possa [...]]]></description>
			<content:encoded><![CDATA[<p>Já havia feito há algum tempo a página de <em>debug/testes</em> da <a href="http://www.chrisb.com.br/blog/category/js-calls-php/">JS Calls PHP</a>, mas estava testando-a primeiro. Me parece que está bem estável e por isso resolvi disponibilizar.</p>
<p>O que ela faz é listar todos os as classes expostas no arquivo de configuração, e todos os métodos das mesmas, para que o desenvolvedor possa fazer testes unitários dos métodos expostos.<br />
A página de <em>debug</em> gera automaticamente os campos para os testes, como<a href="http://www.chrisb.com.br/jscallsphp/debug.php"> pode ser visto nesse exemplo em que expûs todas as classes</a> usadas nos exemplos que acompanham o pacote da <strong>JS Calls PHP</strong>.</p>
<p><a href="http://www.chrisb.com.br/jscallsphp.zip">Faça download da JS Calls PHP aqui</a></p>
<p>Para acessar a sua página de <em>debug</em>, é só acessar <em>debug.php</em> dentro do contexto onde está instalada a biblioteca (por exemplo: <em>http://localhost/meusite/jscallsphp/debug/php</em>)</p>
<p>Ainda aproveitei essa atualização para<a href="http://www.chrisb.com.br/blog/consulta-de-cep-em-ajax/"> corrigir um bug reportado pelo André nas páginas de exemplos</a>, que gerava erro no <em>IE</em> (o erro era nos htmls dos exemplos, nada a ver com a biblioteca).</p>
<h3  class="related_post_title">Posts relacionados</h3><ul class="related_post"><li><a href="http://www.chrisb.com.br/blog/consulta-de-cep-em-ajax/" title="Consulta de CEP em ajax">Consulta de CEP em ajax</a> (17)</li><li><a href="http://www.chrisb.com.br/blog/5-novos-blogs-que-tenho-seguido-2/" title="5 novos blogs que tenho seguido #2">5 novos blogs que tenho seguido #2</a> (4)</li><li><a href="http://www.chrisb.com.br/blog/8-perguntas-para-o-julio-greff/" title="8++ perguntas para o Julio Greff">8++ perguntas para o Julio Greff</a> (4)</li><li><a href="http://www.chrisb.com.br/blog/qual-o-melhor-pog-ate-agora/" title="Qual o melhor POG até agora?">Qual o melhor POG até agora?</a> (4)</li><li><a href="http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-2/" title="Mostrando o potencial da JS Calls PHP #2">Mostrando o potencial da JS Calls PHP #2</a> (6)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.chrisb.com.br/blog/pagina-de-debug-na-js-calls-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mostrando o potencial da JS Calls PHP #2</title>
		<link>http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-2/</link>
		<comments>http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-2/#comments</comments>
		<pubDate>Mon, 04 May 2009 01:28:38 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[js calls php]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web 2.0]]></category>
		<category><![CDATA[jscallsphp]]></category>

		<guid isPermaLink="false">http://www.chrisb.com.br/blog/?p=1497</guid>
		<description><![CDATA[Outro exemplo do que é possível fazer com a JS Calls PHP: listar arquivos de um certo diretório. Uma classe simples com um método que recebe o caminho de uma pasta e retorna a lista de arquivos, como a seguinte &#60;?php class FileSystemBrowser { function __construct() { } function getFilesFromFolder($path) { //pastas que não devem [...]]]></description>
			<content:encoded><![CDATA[<p>Outro exemplo do que é possível fazer com a <strong>JS Calls PHP</strong>: listar arquivos de um certo diretório.</p>
<p>Uma classe simples com um método que recebe o caminho de uma pasta e retorna a lista de arquivos, como a seguinte</p>
<blockquote><p><em>&lt;?php<br />
class FileSystemBrowser {<br />
function __construct() {</em></p>
<p><em>}</em></p>
<p><em>function getFilesFromFolder($path) {<br />
//pastas que não devem ser listadas a partir delas<br />
if(strstr($path, &#8220;../../&#8221;) || strstr($path, &#8220;/blog&#8221;))<br />
return &#8220;Not allowed&#8221;;</em></p>
<p><em>if ($handle = opendir($path)) {<br />
$files = array();<br />
while (false !== ($file = readdir($handle))) {<br />
if ($file != &#8220;.&#8221; &amp;&amp; $file != &#8220;..&#8221; &amp;&amp; !is_dir($path . $file)) {<br />
array_push($files, $file);<br />
}<br />
}<br />
closedir($handle);<br />
return $files;<br />
}<br />
}</em></p>
<p><em>}<br />
?&gt;</em></p></blockquote>
<p>quando exposta no arquivo de configuração da forma apropriada (ver a página principal da <a href="http://www.chrisb.com.br/blog/js-calls-php-interacao-entre-javascript-e-php/">JS Calls PHP</a>) pode ter uma implementação <em>javascript</em> que espera um caminho de uma pasta do servidor e lista os arquivos dela, após fazer uma requisição no <strong>backend</strong> ao método <em>getFilesFromFolder($path)</em> da classe <em>FileSystemBrowser</em>:</p>
<blockquote><p><em>&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;script type=&#8221;application/javascript&#8221; src=&#8221;../engine.js&#8221;&gt;&lt;/script&gt;<br />
&lt;script type=&#8221;application/javascript&#8221; src=&#8221;../interface/fileSystem.js&#8221;&gt;&lt;/script&gt;<br />
&lt;script type=&#8221;application/javascript&#8221;&gt;</em></p>
<p><em>function getFiles() {<br />
fileSystem.getFilesFromFolder(document.getElementById(&#8220;texto&#8221;).value, function(cb) {</em></p>
<p><em>var ul = document.getElementById(&#8220;files&#8221;);<br />
ul.innerHTML = &#8220;&#8221;;<br />
for(var i=0; i&lt;cb.length; i++) {<br />
var li = document.createElement(&#8220;li&#8221;);<br />
li.innerHTML = cb[i];<br />
ul.appendChild(li);<br />
}</em></p>
<p><em>});<br />
}</em></p>
<p><em>&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;h1&gt;JS Calls PHP&lt;/h1&gt;<br />
&lt;h2&gt;Exemplo de uso &#8211; listando arquivos de uma pasta&lt;/h2&gt;<br />
&lt;label for=&#8221;texto&#8221;&gt;Seu texto:&lt;/label&gt;&lt;input type=&#8221;text&#8221; name=&#8221;texto&#8221; id=&#8221;texto&#8221; value=&#8221;../jscallsphp/&#8221; /&gt;<br />
&lt;a href=&#8221;#&#8221; onClick=&#8221;getFiles(); return false;&#8221;&gt;listar arquivos&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;<br />
&lt;ul id=&#8221;files&#8221;&gt;&lt;/ul&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</em></p></blockquote>
<p>Você pode ver esse <a href="http://www.chrisb.com.br/jscallsphp/unit/teste_filebrowser.html"><strong>exemplo funcionando aqui</strong></a>. Alguns caminhos para testar: <em>../jscallsphp, ../, ../files/</em></p>
<h3  class="related_post_title">Posts relacionados</h3><ul class="related_post"><li><a href="http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-1/" title="Mostrando o potencial da JS Calls PHP #1">Mostrando o potencial da JS Calls PHP #1</a> (2)</li><li><a href="http://www.chrisb.com.br/blog/5-novos-blogs-que-tenho-seguido-2/" title="5 novos blogs que tenho seguido #2">5 novos blogs que tenho seguido #2</a> (4)</li><li><a href="http://www.chrisb.com.br/blog/8-perguntas-para-o-julio-greff/" title="8++ perguntas para o Julio Greff">8++ perguntas para o Julio Greff</a> (4)</li><li><a href="http://www.chrisb.com.br/blog/qual-o-melhor-pog-ate-agora/" title="Qual o melhor POG até agora?">Qual o melhor POG até agora?</a> (4)</li><li><a href="http://www.chrisb.com.br/blog/pagina-de-debug-na-js-calls-php/" title="Página de debug na JS Calls PHP">Página de debug na JS Calls PHP</a> (1)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-2/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Mostrando o potencial da JS Calls PHP #1</title>
		<link>http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-1/</link>
		<comments>http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-1/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 00:59:18 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[js calls php]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web 2.0]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[jscallsphp]]></category>
		<category><![CDATA[prototype]]></category>

		<guid isPermaLink="false">http://www.chrisb.com.br/blog/?p=1440</guid>
		<description><![CDATA[Já faz alguns meses que tive a idéia de criar uma biblioteca PHP, opensource, para facilitar as interações entre javascript e PHP. Batizei a mesma de JS Calls PHP, e com ela é possível acessar métodos de classes PHP de uma forma simples, com sintaxe clara e orientada a objetos. Veja a página completa da [...]]]></description>
			<content:encoded><![CDATA[<p>Já faz alguns meses que tive a idéia de criar uma biblioteca <strong>PHP</strong>, <em>opensource</em>, para facilitar as interações entre <em>javascript</em> e <strong>PHP</strong>. Batizei a mesma de <strong>JS Calls PHP</strong>, e com ela é possível acessar métodos de classes <strong>PHP</strong> de uma forma simples, com sintaxe clara e orientada a objetos.</p>
<p><strong><a href="http://www.chrisb.com.br/blog/js-calls-php-interacao-entre-javascript-e-php/">Veja a página completa da biblioteca aqui.</a></strong></p>
<p>Então resolvi criar uma série de posts onde vou mostrar o que é possível fazer com essa biblioteca. Basicamente, ela possibilita qualquer interação da interface com o <strong>backend</strong> desde que esse seja em <strong>PHP</strong> e o que você quiser que interaja esteja orientado a objetos.<br />
Vale ressaltar que sempre me perguntam se é uma biblioteca <em>AJAX</em>; <span style="text-decoration: underline;">tecnicamente falando, não, ela não é</span>. Ela utiliza requisicões assíncronas via <em>javascript</em> com troca de dados no formato JSON, e não dá suporte nenhum a manipulação <em>DOM</em>, como uma <strong>jQuery</strong> ou <strong>Prototype</strong> faz. Mas o que nela é diferente do que tem por aí? Possibilita você acessar métodos do <strong>PHP</strong>, colocando toda abstração de orientação a objetos (<em>nome_da_classe.nome_do_metodo([argumentos])</em>) sem precisar utilizar, por exemplo. o método <em>load()</em> ou <em>$.ajax()</em> da <strong>jQuery</strong> ou a classe <em>Ajax</em> da <strong>Prototype</strong> passando URLs inteiras como caminho.</p>
<p>Nesse primeiro post, criei uma rotina que chama via <em>javascript</em> um método de uma classe do <strong>PHP</strong> que recebe três parâmetros: largura, altura e um texto e cria no sistema de arquivos uma imagem com fundo preto e o texto passado como parâmetro em vermelho, e quando ela acaba de ser executada, no javascript dou <em>reload</em> na imagem.</p>
<p><strong><a href=" http://www.chrisb.com.br/jscallsphp/unit/teste_gd.html">Veja o exemplo rodando aqui.</a></strong></p>
<p>Utilizei <a href="http://www.andafter.org/blogs/odesenvolvedor/publicacoes/biblioteca-gd-trabalhe-com-imagens-no-php_1025.html">esse exemplo que postei no O Desenvolvedor de manipulação de imagens no PHP com a biblioteca GD</a> como base.</p>
<p>Código da classe:</p>
<blockquote><p><em>&lt;?php<br />
class GDTest {<br />
function __construct() {</em></p>
<p><em>}</em></p>
<p><em>function createImageWithText($width, $height, $txt) {<br />
//cria uma imagem com largura x altura definida pelo usuário<br />
$im = imagecreatetruecolor($width, $height);<br />
//aloca as cores para imagem<br />
$text_color = imagecolorallocate($im, 233, 14, 91);<br />
//escreve o texto na imagem<br />
imagestring($im, 1, 5, 5,  $txt, $text_color);</em></p>
<p><em>//iunicia buffer<br />
ob_start();<br />
// cria imagem de saída, formato jpeg, bom 85% de qualidade<br />
imagejpeg($im, NULL, 85);<br />
//captura saída para string<br />
$contents = ob_get_contents();<br />
//finaliza captura<br />
ob_end_clean();<br />
//libera memória<br />
imagedestroy($im);<br />
//escreve arquivo em disco, usando os comando básicos do PHP<br />
$fh = fopen(&#8220;temp/img2.jpg&#8221;, &#8220;w+&#8221; );<br />
fwrite( $fh, $contents );<br />
fclose( $fh );<br />
return true;</em></p>
<p><em>}</em></p>
<p><em>}</em></p>
<p><em>?&gt;</em></p></blockquote>
<p>Então expus essa classe na JS Calls PHP sob o nome gd e habilitei o método a ser acessado, no arquivo de configuração (config.php) e criei o html que faz essa chamada.</p>
<blockquote><p><em>&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;script type=&#8221;application/javascript&#8221; src=&#8221;../engine.js&#8221;&gt;&lt;/script&gt;<br />
&lt;script type=&#8221;application/javascript&#8221; src=&#8221;../interface/gd.js&#8221;&gt;&lt;/script&gt;<br />
&lt;script type=&#8221;application/javascript&#8221;&gt;</em></p>
<p><em>function getImg() {<br />
gd.createImageWithText(300, 100, document.getElementById(&#8220;texto&#8221;).value, function(cb) {<br />
if(cb) {</em></p>
<p><em>document.getElementById(&#8220;myImage&#8221;).src = &#8220;../temp/img2.jpg?date=&#8221; + new Date();<br />
}<br />
});<br />
}</em></p>
<p><em>&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;h1&gt;JS Calls PHP&lt;/h1&gt;<br />
&lt;h2&gt;Exemplo de uso&lt;/h2&gt;<br />
&lt;label for=&#8221;texto&#8221;&gt;Seu texto:&lt;/label&gt;&lt;input type=&#8221;text&#8221; name=&#8221;texto&#8221; id=&#8221;texto&#8221; /&gt;<br />
&lt;a href=&#8221;#&#8221; onClick=&#8221;getImg(); return false;&#8221;&gt;criar/atualizar imagem&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;<br />
&lt;img src=&#8221;#&#8221; id=&#8221;myImage&#8221; /&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</em></p></blockquote>
<p>Espero que o exemplo tenha ficado bem explicado e que seja de utilidade. Se tiverem dúvidas ou sugestões de exemplos, enviem <img src='http://www.chrisb.com.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3  class="related_post_title">Posts relacionados</h3><ul class="related_post"><li><a href="http://www.chrisb.com.br/blog/js-calls-php-biblioteca-que-possibilita-interacao-entre-javascript-e-php/" title="JS Calls PHP &#8211; biblioteca que possibilita interacão entre javascript e PHP &#8211; versão 0.2">JS Calls PHP &#8211; biblioteca que possibilita interacão entre javascript e PHP &#8211; versão 0.2</a> (10)</li><li><a href="http://www.chrisb.com.br/blog/novo-release-da-prototype-e-atualizacao-da-scriptaculous-agora-scripty2/" title="Novo release da Prototype e atualização da Scriptaculous &#8211; agora scripty2">Novo release da Prototype e atualização da Scriptaculous &#8211; agora scripty2</a> (2)</li><li><a href="http://www.chrisb.com.br/blog/8-perguntas-para-o-julio-greff/" title="8++ perguntas para o Julio Greff">8++ perguntas para o Julio Greff</a> (4)</li><li><a href="http://www.chrisb.com.br/blog/como-pegar-dimensoes-da-janela-e-da-barra-de-rolagem-por-javascript/" title="Como pegar dimensões da janela e da barra de rolagem por javascript">Como pegar dimensões da janela e da barra de rolagem por javascript</a> (1)</li><li><a href="http://www.chrisb.com.br/blog/javascript-cheat-sheet/" title="Javascript Cheat Sheet">Javascript Cheat Sheet</a> (4)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Utilizando a API do MigreMe por javascript com a JS Calls PHP</title>
		<link>http://www.chrisb.com.br/blog/utilizando-a-api-do-migreme-por-javascript-com-a-js-calls-php/</link>
		<comments>http://www.chrisb.com.br/blog/utilizando-a-api-do-migreme-por-javascript-com-a-js-calls-php/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 20:14:54 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[js calls php]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web 2.0]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[jscallsphp]]></category>
		<category><![CDATA[migreme]]></category>

		<guid isPermaLink="false">http://www.chrisb.com.br/blog/?p=1388</guid>
		<description><![CDATA[Aproveitei um tempo livre nesse feriado emendado para criar uma integração entre a JS Calls PHP e a API do MigreMe: com ela, é possível fazer uma consulta assíncrona no MigreMe passando uma URL e gerando uma outra URL, menor. Para isso, fiz uso da classe PHP para gerar URLs menores com a API do [...]]]></description>
			<content:encoded><![CDATA[<p>Aproveitei um tempo livre nesse feriado emendado para criar uma integração entre a <strong>JS Calls PHP</strong> e a <em>API</em> do <strong>MigreMe</strong>: com ela, é possível fazer uma consulta assíncrona no <strong>MigreMe</strong> passando uma <em>URL</em> e gerando uma outra <em>URL</em>, menor. Para isso, fiz uso da <a href="http://www.screencaster.com.br/classe-para-trabalhar-com-a-api-do-migreme-e-php/">classe <strong>PHP</strong> para gerar URLs menores com a API do MigreME</a> criada pelo <em>Guilherme Rambo</em> do <a href="http://www.screencaster.com.br">Screencaster</a> (a única coisa que alterei foi retirar o código que faz a consulta a <strong>API</strong> do <em>MigreMe</em> do construtor da classe e colocá-lo num método chamado <em>migre</em>).</p>
<p style="text-align: center;"><img class="aligncenter" style="border: 1px solid black;" title="MigreMe" src="http://migre.me/migreme-titulo.gif" alt="" width="212" height="151" /></p>
<p>Inserindo a classe <strong>PHP</strong> (o terceiro item do array, sendo que o segundo é o caminho da pasta onde está a classe) no arquivo de configuração da <strong>JS Calls PHP</strong> e mapeando o método <strong>migre</strong>, usando migreme (o primeiro parâmetro) como apelido a ser usado no <em>javascript</em>:</p>
<p><em>$jsCallsPhpClasses = array(<br />
array(&#8220;migreme&#8221;, &#8220;lib&#8221;, &#8220;MigreMe&#8221;, array(&#8220;migre&#8221;))<br />
);</em></p>
<p>é possível no html fazer uma chamada do tipo:</p>
<p><em>var url = &#8220;http://www.chrisb.com.br&#8221;<br />
migreme.migre(url, function(shortUrl) {<br />
var str = shortUrl.item.migre;<br />
alert(str);<br />
});</em></p>
<p><a href=" http://www.chrisb.com.br/jscallsphp/unit/testemigreme.htm">Aqui pode-se ver um exemplo de teste unitário, funcionando</a>.</p>
<p>O <a href="http://www.chrisb.com.br/jscallsphp.zip">download da JS Calls PHP</a> com essa classe e outras &#8211; para consulta de <strong>CEPs</strong>, <strong>CRUD</strong>, etc&#8230; &#8211; e testes unitários <a href="http://www.chrisb.com.br/jscallsphp.zip">pode ser feito aqui</a>. E a <a href="http://www.chrisb.com.br/blog/js-calls-php-interacao-entre-javascript-e-php/">documentação completa da mesma pode ser vista na página principal do projeto</a>! Espero que seja de utilidade para vocês <img src='http://www.chrisb.com.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>*e não se esqueçam de ver a página do Guilherme para saber mais da classe que ele fez e quais são todos os atributos disponíveis assim que a consulta é efetuada &#8211; existem várias outras informações!</p>
<h3  class="related_post_title">Posts relacionados</h3><ul class="related_post"><li><a href="http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-2/" title="Mostrando o potencial da JS Calls PHP #2">Mostrando o potencial da JS Calls PHP #2</a> (6)</li><li><a href="http://www.chrisb.com.br/blog/google-charts-prototype-plugin/" title="Google Charts Prototype Plugin">Google Charts Prototype Plugin</a> (3)</li><li><a href="http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-1/" title="Mostrando o potencial da JS Calls PHP #1">Mostrando o potencial da JS Calls PHP #1</a> (2)</li><li><a href="http://www.chrisb.com.br/blog/upload-de-arquivos-do-file-system-direto-pela-interface-web/" title="Upload de arquivos do file system direto pela interface web">Upload de arquivos do file system direto pela interface web</a> (3)</li><li><a href="http://www.chrisb.com.br/blog/o-pog-nosso-de-cada-dia-18/" title="O POG nosso de cada dia #18">O POG nosso de cada dia #18</a> (10)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.chrisb.com.br/blog/utilizando-a-api-do-migreme-por-javascript-com-a-js-calls-php/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>CRUD em ajax</title>
		<link>http://www.chrisb.com.br/blog/crud-em-ajax/</link>
		<comments>http://www.chrisb.com.br/blog/crud-em-ajax/#comments</comments>
		<pubDate>Sat, 07 Mar 2009 01:16:40 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[js calls php]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web 2.0]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[jscallsphp]]></category>

		<guid isPermaLink="false">http://www.chrisb.com.br/blog/?p=1077</guid>
		<description><![CDATA[Desenvolvendo mais a JS Calls PHP, fiz um exemplo de CRUD (Create, Retrieve, Update, Delete) de um usuário (simples, apenas com nome, e-mail e telefone) onde todas as requisições são assíncronas. O exemplo de uso está aqui. Disponibilizei um pacote para download, totalmente funcional. Requer uma base de dados MySQL. São necessárias algumas poucas configurações. [...]]]></description>
			<content:encoded><![CDATA[<p>Desenvolvendo mais a <a href="http://www.chrisb.com.br/blog/js-calls-php-interacao-entre-javascript-e-php/">JS Calls PHP</a>, fiz um exemplo de <strong>CRUD</strong> (<em>Create</em>, <em>Retrieve</em>, <em>Update</em>, <em>Delete</em>) de um usuário (simples, apenas com nome, e-mail e telefone) onde todas as requisições são assíncronas. O <a href="http://www.chrisb.com.br/crud/crud.htm">exemplo de uso está aqui</a>.</p>
<p>Disponibilizei um <a href="http://www.chrisb.com.br/crud.zip">pacote para download</a>, totalmente funcional. Requer uma base de dados <em>MySQL</em>.</p>
<p>São necessárias algumas poucas configurações. Vamos lá:</p>
<ul>
<li>crie um banco de dados no <em>MySQL</em>. No meu caso, chamei-o de <strong>jcphp</strong></li>
<li>crie uma tabela com a seguinte <em>query</em>:<br />
<em>CREATE TABLE `jcphp_user` (<br />
`id` int(11) NOT NULL auto_increment,<br />
`name` varchar(64) NOT NULL,<br />
`email` varchar(64) NOT NULL,<br />
`phone` varchar(16) NOT NULL,<br />
PRIMARY KEY  (`id`)<br />
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 ;</em></li>
<li>na classe<em> CRUDUtils.php</em> (jscallsphp/lib), que á a classe que faz as requisições ao banco, na linha 10, defina as configurações de conexão com o banco: url, base de dados, usuário e senha. Ficará algo como:<br />
<em>$this-&gt;db = new DBConnect(&#8220;localhost&#8221;, &#8220;jcphp&#8221;, &#8220;root&#8221;, &#8220;password&#8221;);</em></li>
</ul>
<p>Pronto. Você poderá acessar pelo browser o caminho <strong>crud/crud.htm</strong> e o cadastro/consulta estará funcionando. Deixei o código todo comentado, creio que seja a melhor maneira para ver como funciona.</p>
<h3  class="related_post_title">Posts relacionados</h3><ul class="related_post"><li><a href="http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-1/" title="Mostrando o potencial da JS Calls PHP #1">Mostrando o potencial da JS Calls PHP #1</a> (2)</li><li><a href="http://www.chrisb.com.br/blog/xmlhttprequest-cross-site-mais-uma-vez-o-ie-fora-do-padrao/" title="XMLHttpRequest cross-site: mais uma vez o IE fora do padrão">XMLHttpRequest cross-site: mais uma vez o IE fora do padrão</a> (6)</li><li><a href="http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-2/" title="Mostrando o potencial da JS Calls PHP #2">Mostrando o potencial da JS Calls PHP #2</a> (6)</li><li><a href="http://www.chrisb.com.br/blog/leituras-recomendadas-para-quem-usa-a-jquery/" title="Leituras recomendadas para quem usa a jQuery">Leituras recomendadas para quem usa a jQuery</a> (3)</li><li><a href="http://www.chrisb.com.br/blog/utilizando-a-api-do-migreme-por-javascript-com-a-js-calls-php/" title="Utilizando a API do MigreMe por javascript com a JS Calls PHP">Utilizando a API do MigreMe por javascript com a JS Calls PHP</a> (5)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.chrisb.com.br/blog/crud-em-ajax/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Consulta de CEP em ajax</title>
		<link>http://www.chrisb.com.br/blog/consulta-de-cep-em-ajax/</link>
		<comments>http://www.chrisb.com.br/blog/consulta-de-cep-em-ajax/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 11:40:57 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[js calls php]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web 2.0]]></category>
		<category><![CDATA[biblioteca]]></category>

		<guid isPermaLink="false">http://www.chrisb.com.br/blog/?p=1070</guid>
		<description><![CDATA[Resolvi juntar duas bibliotecas que fiz (e estão disponibilizadas no site): a de consulta de endereço por CEP e a JS Calls PHP (interação entre javascript e PHP) para criar uma consulta de endereços através do CEP usando requisição assíncrona. Faça download aqui! No pacote, há um arquivo cep.htm e a subpasta jscallsphp; não é [...]]]></description>
			<content:encoded><![CDATA[<p>Resolvi juntar duas bibliotecas que fiz (e estão disponibilizadas no site): a de <a href="http://www.chrisb.com.br/blog/consulta-livre-em-base-de-ceps-com-php/">consulta de endereço por CEP</a> e a <a href="http://www.chrisb.com.br/blog/js-calls-php-interacao-entre-javascript-e-php/">JS Calls PHP</a> (interação entre javascript e PHP) para criar uma<a href="http://www.chrisb.com.br/cep/cep.zip"> consulta de endereços através do CEP usando requisição assíncrona</a>.</p>
<p><a href="http://www.chrisb.com.br/cep/cep.zip">Faça download aqui!</a></p>
<p>No pacote, há um arquivo <em>cep.htm</em> e a subpasta jscallsphp; não é necessário alterar nada na pasta ou nos arquivos delas, já está configurada pronta para uso.<br />
O <em>cep.htm</em> contém um <a href="http://www.chrisb.com.br/cep/cep.html">exemplo de uso (veja funcionando)</a>. Só é necessário fazer a chamada aos arquivos da <strong>JS Calls PHP</strong>. Com isso, no <em>javascript</em> você terá no contexto um objeto chamado  <em>cepLivre</em> que possui o método <em>buscaEndereco(String cep)</em>. O <em>CEP</em> deve ser passado no formato <em>XXXXX-XXX</em>.<br />
No exemplo, passei também uma função de <em>callback</em> que trata retorno do método; é retornado um objeto com vários atributos que possuem as informações do endereço. Os atributos são:</p>
<ul>
<li><em>status</em> &#8211; 1 para CEP válido, 0 para inválido</li>
<li><em>tipoLogradouroDesc </em>- descrição do tipo de logradouro (rua, avenida, etc…)</li>
<li><em>logradouro</em> &#8211; logradouro</li>
<li><em>bairro</em> &#8211; bairro</li>
<li><em>cidade </em>- cidade</li>
<li><em>uf</em> &#8211; unidade da Federação (por extenso)</li>
<li><em>ufSigla</em> &#8211; unidade da Federação (sigla, por exemplo SP)</li>
<li><em>cep</em> &#8211; o próprio CEP</li>
</ul>
<p>Dúvidas e sugestões, são bem vindos.</p>
<p>[UPDATE] Esqueci de expor que todo esse pacote está disponibilizado sob a licença <a href="http://pt.wikipedia.org/wiki/GNU_General_Public_License">GPL</a>. Sintam-se livres para baixar, usar e modificar. Obrigado a quem avisou! [/UPDATE]</p>
<h3  class="related_post_title">Posts relacionados</h3><ul class="related_post"><li><a href="http://www.chrisb.com.br/blog/pagina-de-debug-na-js-calls-php/" title="Página de debug na JS Calls PHP">Página de debug na JS Calls PHP</a> (1)</li><li><a href="http://www.chrisb.com.br/blog/5-novos-blogs-que-tenho-seguido-2/" title="5 novos blogs que tenho seguido #2">5 novos blogs que tenho seguido #2</a> (4)</li><li><a href="http://www.chrisb.com.br/blog/8-perguntas-para-o-julio-greff/" title="8++ perguntas para o Julio Greff">8++ perguntas para o Julio Greff</a> (4)</li><li><a href="http://www.chrisb.com.br/blog/qual-o-melhor-pog-ate-agora/" title="Qual o melhor POG até agora?">Qual o melhor POG até agora?</a> (4)</li><li><a href="http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-2/" title="Mostrando o potencial da JS Calls PHP #2">Mostrando o potencial da JS Calls PHP #2</a> (6)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.chrisb.com.br/blog/consulta-de-cep-em-ajax/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Novidades na JS Calls PHP</title>
		<link>http://www.chrisb.com.br/blog/novidades-na-js-calls-php/</link>
		<comments>http://www.chrisb.com.br/blog/novidades-na-js-calls-php/#comments</comments>
		<pubDate>Mon, 16 Feb 2009 01:04:12 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[js calls php]]></category>
		<category><![CDATA[web 2.0]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.chrisb.com.br/blog/?p=887</guid>
		<description><![CDATA[No começo da semana lancei a JS Calls PHP, uma biblioteca open source para facilitar ajax em aplicações PHP. Algumas novidades na última versão, a 0.3: página do projeto no Google Code: http://code.google.com/p/jscallsphp/ ele está versionado no SVN. Ou seja, a versão em desenvolvimento pode ser acompanhada pela linha de comando svn checkout http://jscallsphp.googlecode.com/svn/trunk/ jscallsphp-read-only [...]]]></description>
			<content:encoded><![CDATA[<p>No começo da semana lancei a <a href="http://www.chrisb.com.br/blog/js-calls-php-interacao-entre-javascript-e-php/">JS Calls PHP</a>, uma biblioteca open source para facilitar ajax em aplicações <strong>PHP</strong>.</p>
<p>Algumas novidades na última versão, a 0.3:</p>
<ul>
<li>página do projeto no Google Code: <a href="http://code.google.com/p/jscallsphp/">http://code.google.com/p/jscallsphp/</a></li>
<li>ele está versionado no SVN. Ou seja, a versão em desenvolvimento pode ser acompanhada pela linha de comando <a href="svn checkout http://jscallsphp.googlecode.com/svn/trunk/ jscallsphp-read-only">svn checkout http://jscallsphp.googlecode.com/svn/trunk/ jscallsphp-read-only</a></li>
<li>não há mais necessidade de utilizar a biblioteca prototype (javascript).  Agora, a biblioteca não tem dependências externas</li>
<li>até a versão 0.2, era gerado código javascript para todas as classes PHP. Agora, pode ser modularizado. Como? Você deve habilitar o mod_rewrite no <em>Apache</em>. Com isso, ao invés de fazer a chamada á biblioteca <em>JSCallsPHP.php.js</em>, podem ser feitas várias chamadas, uma para cada classe do PHP, com o caminho <em>interface/{nome da classe}.js</em>Por exemplo, para chamar duas classes configuradas no config.php, ao invés de fazer assim:<br />
<em>&lt;script type=”application/javascript” src=”engine.js”&gt;&lt;/script&gt;<br />
&lt;script type=”application/javascript” src=”JSCallsPHP.js.php”&gt;&lt;/script&gt;</em></p>
<p><em>Chamam-se assim:<br />
</em><em>&lt;script type=”application/javascript” src=”engine.js”&gt;&lt;/script&gt;<br />
&lt;script type=”application/javascript” src=”interface/classe1.js”&gt;&lt;/script&gt;<br />
</em><em>&lt;script type=”application/javascript” src=”interface/classe2.js”&gt;&lt;/script&gt;</em></li>
</ul>
<p>Por enquanto, é isso!</p>
<h3  class="related_post_title">Posts relacionados</h3><ul class="related_post"><li><a href="http://www.chrisb.com.br/blog/mostrando-o-potencial-da-js-calls-php-1/" title="Mostrando o potencial da JS Calls PHP #1">Mostrando o potencial da JS Calls PHP #1</a> (2)</li><li><a href="http://www.chrisb.com.br/blog/js-calls-php-biblioteca-que-possibilita-interacao-entre-javascript-e-php/" title="JS Calls PHP &#8211; biblioteca que possibilita interacão entre javascript e PHP &#8211; versão 0.2">JS Calls PHP &#8211; biblioteca que possibilita interacão entre javascript e PHP &#8211; versão 0.2</a> (10)</li><li><a href="http://www.chrisb.com.br/blog/5-novos-blogs-que-tenho-seguido-2/" title="5 novos blogs que tenho seguido #2">5 novos blogs que tenho seguido #2</a> (4)</li><li><a href="http://www.chrisb.com.br/blog/8-perguntas-para-o-julio-greff/" title="8++ perguntas para o Julio Greff">8++ perguntas para o Julio Greff</a> (4)</li><li><a href="http://www.chrisb.com.br/blog/qual-o-melhor-pog-ate-agora/" title="Qual o melhor POG até agora?">Qual o melhor POG até agora?</a> (4)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.chrisb.com.br/blog/novidades-na-js-calls-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->