<?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>Battisti - Blog &#187; Joomla</title>
	<atom:link href="http://battisti.etc.br/tag/joomla/feed/" rel="self" type="application/rss+xml" />
	<link>http://battisti.etc.br</link>
	<description>Tecnologia, Web e um pouco de cultura inútil</description>
	<lastBuildDate>Fri, 27 Jan 2012 11:49:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Joomla Plugin XMLRPC Exemplo</title>
		<link>http://battisti.etc.br/2009/11/17/joomla-xmlrpc-exemplo/</link>
		<comments>http://battisti.etc.br/2009/11/17/joomla-xmlrpc-exemplo/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 13:12:49 +0000</pubDate>
		<dc:creator>battisti</dc:creator>
				<category><![CDATA[Joomla]]></category>

		<guid isPermaLink="false">http://battisti.etc.br/?p=710</guid>
		<description><![CDATA[Objetivo Escrever e entender os plugin que recebem as chamadas utilizando XMLRPC, vamos mexer com um cliente e um servidor Introdução O XMLRPC é uma tecnologia que permite a você executar métodos do Joomla remotamente a partir de outro aplicativo. Nativamente no joomla já vem instalado com algumas chamadas XMLRPC: Plugin joomla: fornece o método [...]]]></description>
			<content:encoded><![CDATA[<div class="mwordstext"><h1>Objetivo</h1>
<p>Escrever e entender os plugin que recebem as chamadas utilizando XMLRPC, vamos mexer com um cliente e um servidor</p>
<h1>Introdução</h1>
<p>O XMLRPC é uma tecnologia que permite a você executar métodos do Joomla remotamente a partir de outro aplicativo. Nativamente no joomla já vem instalado com algumas chamadas XMLRPC:<span id="more-710"></span></p>
<ol>
<li>Plugin joomla: fornece o método searchSite permite executar consultas ao conteúdo de um site remotamente;</li>
<li>System: são os métodos nativos do próprio joomla para manipular os demais plugins que executam XMLRPC.</li>
</ol>
<p>O Joomla utilizar a biblioteca <a href="http://phpxmlrpc.sourceforge.net/ ">phpxmlrpc</a>, para gerenciar as chamadas XMLRPC, eu aconselho você a também utilizá-la em seus clientes.</p>
<h1>Antes de Começar</h1>
<p>Antes de começar a codificar vamos configurar no joomla</p>
<ol>
<li>Acesse as configurações globais</li>
<li>System</li>
<li>Enable Web Services (Habilitar Web Services): marque como <strong>Sim</strong></li>
<li>Debug Settings (Debugar Configurações) marque como <strong>Sim</strong></li>
</ol>
<p>A configuração Debug Settings deve apenas ficar ativa no seu ambiente de desenvolvimento, no ambiente de produção ela deve ficar marcada como <strong>não</strong>.</p>
<h1>Debugger</h1>
<p>Desenvolver Web Service requer ferramentas de debug mais elaboradas haja visto que os print_r e die causam efeitos estranhos no códgo fonte, sendo assim vou apresentar duas ferramentas de debug.</p>
<h2>Debug Nativo</h2>
<p>O próprio joomla já fornece um debug para XMLRPC, para o acessar:</p>
<ol>
<li>Acesse as configurações globais</li>
<li>System</li>
<li>Habilite a opção Debug System</li>
</ol>
<p>Depois disso acesse:</p>
<p>http://seusite/xmlrpc/client.php</p>
<h2>Debug com o Phpxmlrpc</h2>
<p>Dentro da pasta do phpxmlrpc existe uma pasta chamada debbuger, para utilizar o debug:  e acesse a pasta debugger, por aqui você pode testar o seu webservice.</p>
<ol>
<li>Copie o arquivo xmlrpc.inc que está na pasta lib para dentro da pasta debugger</li>
<li>Copie o arquivo xmlrpc_wrappers.inc que está na pasta lib para dentro da pasta debugger</li>
<li>Acesse o endereço http://seusite/debugger/</li>
<li>Configure o campo Address para Endereço do site onde está o seu plugin, exemplo localhost e o campo Path com o caminho APÓS o localhost onde estão os plugins, no caso do joomla é /xmlrpc/index.php.</li>
<li>Escolha uma das ações: List available methods, Describe method, Execute method, Generate stub for method call</li>
<li>Clique no botão executar</li>
</ol>
<p>Caso você esteja trabalhando com uma instalação nova do Joomla então você terá a disposição os seguintes métodos:</p>
<ol>
<li>joomla.searchSite</li>
<li>system.listMethods</li>
<li>system.methodHelp</li>
<li>system.methodSignature</li>
<li>system.multicall</li>
<li>system.getCapabilities</li>
</ol>
<h1>Criando um Cliente</h1>
<p>Vamos criar um cliente para acessar o método searchSite da classe plgXMLRPCJoomla, o retorno desse método é um vetor um todas as matérias que contenham um determinado texto:</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span class="kw2">function</span> xmlrpc_joomla_searchSite <span class="br0">&#40;</span><span class="re0">$p1</span><span class="sy0">,</span> <span class="re0">$p2</span><span class="sy0">,</span> <span class="re0">$debug</span><span class="sy0">=</span><span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="re0">$client</span> <span class="sy0">=&amp;</span>amp<span class="sy0">;</span> <span class="kw2">new</span> xmlrpc_client<span class="br0">&#40;</span><span class="st_h">'/xmlrpc/index.php'</span><span class="sy0">,</span> <span class="st_h">'seu_site_sem_http'</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>port <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>method <span class="sy0">=</span> <span class="st_h">'http'</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>errno <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
port <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>method <span class="sy0">=</span> <span class="st_h">'http'</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>errno <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>errstr <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>authtype <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>cert <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>certpass <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>cacert <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>cacertdir <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>key <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>keypass <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>verifypeer <span class="sy0">=</span> <span class="kw4">true</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>verifyhost <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>no_multicall <span class="sy0">=</span> <span class="kw4">false</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>proxy <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>proxyport <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>proxy_user <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>proxy_pass <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>proxy_authtype <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>cookies <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a> <span class="br0">&#40;</span>
<span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>accepted_compression <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>request_compression <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>xmlrpc_curl_handle <span class="sy0">=</span> <span class="kw4">NULL</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>keepalive <span class="sy0">=</span> <span class="kw4">true</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>accepted_charset_encodings <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a> <span class="br0">&#40;</span>
  <span class="nu0">0</span> <span class="sy0">=&amp;</span>gt<span class="sy0">;</span> <span class="st_h">'UTF-8'</span><span class="sy0">,</span>
  <span class="nu0">1</span> <span class="sy0">=&amp;</span>gt<span class="sy0">;</span> <span class="st_h">'ISO-8859-1'</span><span class="sy0">,</span>
  <span class="nu0">2</span> <span class="sy0">=&amp;</span>gt<span class="sy0">;</span> <span class="st_h">'US-ASCII'</span><span class="sy0">,</span>
<span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>request_charset_encoding <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>return_type <span class="sy0">=</span> <span class="st_h">'xmlrpcvals'</span><span class="sy0">;</span>
<span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>setDebug<span class="br0">&#40;</span><span class="re0">$debug</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$msg</span> <span class="sy0">=&amp;</span>amp<span class="sy0">;</span> <span class="kw2">new</span> xmlrpcmsg<span class="br0">&#40;</span><span class="st_h">'joomla.searchSite'</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$p1</span> <span class="sy0">=&amp;</span>amp<span class="sy0">;</span> <span class="kw2">new</span> xmlrpcval<span class="br0">&#40;</span><span class="re0">$p1</span><span class="sy0">,</span> <span class="st_h">'string'</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$msg</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>addparam<span class="br0">&#40;</span><span class="re0">$p1</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$p2</span> <span class="sy0">=&amp;</span>amp<span class="sy0">;</span> <span class="kw2">new</span> xmlrpcval<span class="br0">&#40;</span><span class="re0">$p2</span><span class="sy0">,</span> <span class="st_h">'string'</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$msg</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>addparam<span class="br0">&#40;</span><span class="re0">$p2</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$res</span> <span class="sy0">=&amp;</span>amp<span class="sy0">;</span> <span class="re0">$client</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>send<span class="br0">&#40;</span><span class="re0">$msg</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="st_h">''</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$res</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>faultcode<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">return</span> <span class="re0">$res</span><span class="sy0">;</span> <span class="kw1">else</span> <span class="kw1">return</span> php_xmlrpc_decode<span class="br0">&#40;</span><span class="re0">$res</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>value<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="re0">$result</span> <span class="sy0">=</span> xmlrpc_joomla_searchSite<span class="br0">&#40;</span><span class="st_h">'Palavra Chave'</span><span class="sy0">,</span><span class="st_h">'exact'</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<a href="http://www.php.net/print_r"><span class="kw3">print_r</span></a><span class="br0">&#40;</span><span class="re0">$result</span><span class="br0">&#41;</span><span class="sy0">;</span>
<a href="http://www.php.net/die"><span class="kw3">die</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>

<p>Pronto temos o nosso cliente rodando. Todos os plugins devem estar dentro da pasta plugins/xmlrpc o método que estamos executando é o joomla.searchSite ou seja abra o arquivo joomla.php que dentro dele tem a definição deste método.</p>
<p>Este plugin joomla na versão 1.5.14 tem um bug que eu acabei  acertando e mandando para o repositório. http://joomlacode.org/gf/project/joomla/tracker/?action=TrackerItemEdit&amp;tracker_item_id=18748</p>
<h1>Criando o Servidor</h1>
<p>A parte do servidor exige atenção pois a partir daqui você estará dando permissão para qualquer pessoa de qualquer lugar do mundo executar algum método então escreva-o com sabedoria:</p>
<p>Vou colar aqui um exemplo do plugin joomla ok:</p>
<pre>defined( '_JEXEC' ) or die( 'Restricted access' );

jimport('joomla.plugin.plugin');

class plgXMLRPCJoomla extends JPlugin
{
	function plgXMLRPCJoomla(&amp; $subject, $config){
		parent::__construct($subject, $config);
	}

	function onGetWebServices(){
		global $xmlrpcString;
		// Initialize variables
		$services = array();
		// Site search service
		$services['joomla.searchSite'] = array( // nome do método que você irá chamar do cliente
			'function' =&gt; 'plgXMLRPCJoomlaServices::searchSite', // nome do método que irá executar qnd uma chamada acontecer
			'docstring' =&gt; 'Searches a remote site.', // apenas uma descrição
			'signature' =&gt; array(array($xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString)) // o primeiro parâmetro indica o tipo do retorno e os demais são os parâmetros da função			);
		return $services;
	}
}

class plgXMLRPCJoomlaServices {

	function searchSite($searchword, $phrase='', $order='')
	{
		global $mainframe;

		// Initialize variables
		$db		=&amp; JFactory::getDBO();

		// Prepare arguments
		$searchword	= $db-&gt;getEscaped( trim( $searchword ) );
		$phrase		= '';
		$ordering	= '';

		// Load search plugins and fire the onSearch event
		JPluginHelper::importPlugin( 'search' );
		$results = $mainframe-&gt;triggerEvent( 'onSearch', array( $searchword, $phrase, $ordering ) );

		// Iterate through results building the return array
		require_once(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_search'.DS.'helpers'.DS.'search.php');

		foreach ($results as $i=&gt;$rows)
		{
			foreach ($rows as $j=&gt;$row) {
				$results[$i][$j]-&gt;href = eregi('^(http|https)://', $row-&gt;href) ? $row-&gt;href : JURI::root().'/'.$row-&gt;href;
				$results[$i][$j]-&gt;text = SearchHelper::prepareSearchContent( $row-&gt;text, 200, $searchword);
			}
		}
		return $results;
	}
}</pre>
<p>Algumas dicas sobre o servidor:</p>
<ol>
<li>Para manter compatibilidade com o php4 não use __construct e sim o nome da classe como sendo o construtor</li>
<li>Após criar o plugin você precisa <span style="color: #ff0000;">INSTALAR</span> e <span style="color: #ff0000;">ATIVAR</span> antes de fazer qualquer chamada ao plugin caso contrário irá receber uma mensagem de Unknow Method</li>
</ol>
<h1>Observação Importantes</h1>
<ol>
<li>Em ambiente de teste onde você tem o seu cliente e o servidor no MESMO servidor é importante que o servidor conheça o endereço que você está acessando caso contrário vai dar um erro de (An error occurred: Code: 5 Reason: &#8216;Didn&#8217;t receive 200 OK from remote server. (HTTP/1.0 302 Found)&#8217;) ou seja, o seu site não foi encontrado, nesse caso adicione o seu ambiente de teste no host da sua máquina servidora.</li>
<li>&#8216;signature&#8217; =&gt; array(array($xmlrpcString, $xmlrpcString, $xmlrpcString)) : Na  assinatura do método o primeiro parâmetro define o tipo do retorno e os demais são os tipos dos parâmetros da função que será chamada</li>
</ol>
<h1>Descrição do Erros</h1>
<p>Abaixo tem uma lista dos erros que o RPC pode te retornar</p>
<pre>
Fault codes for your servers should start at the value indicated by the global $xmlrpcerruser + 1.
Standard errors returned by the server include:
1 Unknown method
Returned if the server was asked to dispatch a method it didn't know about

2 Invalid return payload
This error is actually generated by the client, not server, code, but signifies that a server returned something it couldn't understand. A more detailed error report is sometimes added onto the end of the phrase above.

3 Incorrect parameters
This error is generated when the server has signature(s) defined for a method, and the parameters passed by the client do not match any of signatures.

4 Can't introspect: method unknown
This error is generated by the builtin system.* methods when any kind of introspection is attempted on a method undefined by the server.

5 Didn't receive 200 OK from remote server
This error is generated by the client when a remote server doesn't return HTTP/1.1 200 OK in response to a request. A more detailed error report is added onto the end of the phrase above.

6 No data received from server
This error is generated by the client when a remote server returns HTTP/1.1 200 OK in response to a request, but no response body follows the HTTP headers.

7 No SSL support compiled in
This error is generated by the client when trying to send a request with HTTPS and the CURL extension is not available to PHP.

8 CURL error
This error is generated by the client when trying to send a request with HTTPS and the HTTPS communication fails.

9-14 multicall errors
These errors are generated by the server when something fails inside a system.multicall request.

100- XML parse errors
Returns 100 plus the XML parser error code for the fault that occurred. The faultString returned explains where the parse error was in the incoming XML stream.
</pre>
<h1>Livros</h1>
<p>Infelizmente os livros sobre joomla em português não são muitos mas se você quiser dar uma olhada o submarino oferece algumas opção como o  <a href="http://www.submarino.com.br/produto/1/21403480?franq=264916">Joomla Guia do Operador,</a> caso queira em inglês eu recomendo o livro Mastering Joomla.</p>
<h1>Links Úteis</h1>
<ul>
<li><a href='http://forum.joomla.org/index.php/topic,252028.msg1168161.html'>http://forum.joomla.org/index.php/topic,252028.msg1168161.html</a></li>
<li><a href='http://phpxmlrpc.sourceforge.net/'>Download da Lib</a></li>
<li><a href='http://www.packtpub.com/files//code/2820_Code.zip'> Download dos exemplos do livro Mastering Joomla</a></li>
<li><a href='http://phpxmlrpc.sourceforge.net/doc-2/ch07s05.html'>Problemas com o xmlrpc<a/></li>
<li><a href='http://docs.joomla.org/How_to_create_a_content_plugin'>Como criar plugins<a/></li>
<li><a href='http://issuu.com/wonkateuton/docs/manualjoomla'>Livro mastering joomla<a/></li>
</ul>
</div><!-- fim mwordstext -->]]></content:encoded>
			<wfw:commentRss>http://battisti.etc.br/2009/11/17/joomla-xmlrpc-exemplo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

