(41) 9225-6319
contato@felipemarques.com.br

Classe gera xml no formato XML-RPC para request

Olá pessoal,

Tive uma necessidade muito grande na empresa onde trabalho. Necessitava utilizar a função xmlrpc_encode_request() do php, porém a função não estava habilitada no servidor. Tentamos habilitar o módulo de várias formas sem sucesso. Então resolvi criar minha própria classe para gerar o xml de request no padrão XML-RPC.

Segue o código abaixo:

<?php
/**
 * @author Felipe Marques
 * @package XmlRPC 
 * @version 1.0
 * 
 * Baseado na documentação abaixo:
 * 
 * http://www.xmlrpc.com/spec
 * http://www.cafeconleche.org/books/xmljava/chapters/ch02s05.html
 * 
 * @example
 * 
    $content = array(
        'title'=>'Título do Post',
        'description'=>'Descrição do post',
        'mt_allow_comments'=>1,  // 1 to allow comments
        'mt_allow_pings'=>1,  // 1 to allow trackbacks
        'post_type'=>'post',
    	'post_status'=>'publish',
        'mt_keywords'=>'palavras chave',
        'categories'=>array('Categoria 1','Categoria 2')
    );	
	
	$xml = new XmlRPC();
	$xml->setUser('NomeDoUsuarioCadastradoNoBlog');
	$xml->setPass('SenhaDoUsuarioCadastradoNoBlog');
	$xml->setStruct($content);
	$request = $xml->getRequestNewPost();
 * 
 * 
 * */
class XmlRPC
{

	private $user;
	private $pass;
	private $struct = array();

	/**
	 * Método construtor da classe
	 * 
	 * @param
	 * @return
	 * */
	public function __construct()
	{
	
	}
	
	/**
	 * Set the user
	 * 
	 * @param $user
	 * @return
	 * */
	public function setUser($user)
	{
		$this->user = $user;
	}
	
	/**
	 * Get the user
	 * 
	 * @param
	 * @return
	 * */
	public function getUser()
	{
		return $this->user;
	}
	
	/**
	 * Set the pass
	 * 
	 * @param $pass
	 * @return
	 * */
	public function setPass($pass)
	{
		$this->pass = $pass;
	}
	
	/**
	 * Get the pass
	 * 
	 * @param
	 * @return
	 * */
	public function getPass()
	{
		return $this->pass;
	}
	
	/**
	 * Set the struct
	 * 
	 * @param
	 * @return
	 * */
	public function setStruct($struct = array())
	{
		$this->struct = $struct;
	}
	
	/**
	 * Get the struct
	 * 
	 * @param
	 * @return
	 * */
	public function getStruct()
	{
		return $this->struct;
	}
	
	/**
	 * Get the type
	 * 
	 * @param $string
	 * @return type
	 * */
	public function getType($string)
	{
		$type = gettype($string);
		
		if($type == 'integer')
			$type = 'int';
			
		return $type;
	}
	
	/**
	 * Método utilizado para incluir um novo post a um blog wordpress com o xmlrpc habilitado
	 * O código do método serve como exemplo para outras implementações em xmlrpc
	 * 
	 * @param
	 * @return
	 * */
	public function getRequestNewPost($encoding = "iso-8859-1")
	{
		$doc = new DOMDocument('1.0',$encoding);
		$doc->formatOutput = true;
		
		// criando a tag pai methodCall
		$methodCall = $doc->createElement('methodCall');
		$doc->appendChild($methodCall);
		
		// criando a tag methodName
		$methodName = $doc->createElement('methodName','metaWeblog.newPost');
		$methodCall->appendChild($methodName);

		// criando a tag pai de params
		$params = $doc->createElement('params');
			
			// criando o parametro int
			$this->addParam($doc,$params,0);
			
			// criando o parametro de usuario
			$this->addParam($doc,$params,$this->user);
			
			// criando o parametro de senha
			$this->addParam($doc,$params,$this->pass);
			
			// adicionando parametros do post
			$this->addParamStruct($doc,$params,$this->struct);
			
			// adicionando um parametro boolean
			$this->addParam($doc,$params,true);
		
		
		// adicionando a tag params na tag pai methodCall
		$methodCall->appendChild($params);
		
		return $doc->saveXML();
	}
	
	/**
	 * Adicionando um parametro normal
	 * 
	 * @param
	 * @return
	 * */
	public function addParam($domdocument,$tagpai,$value)
	{
		if($domdocument instanceof DomDocument)
		{
			$tagparam = $domdocument->createElement('param');
			$tagpai->appendChild($tagparam);
			
				$tagvalue = $domdocument->createElement('value');
				$tagparam->appendChild($tagvalue);
				
					$tagtype = $domdocument->createElement($this->getType($value),$value);
					$tagvalue->appendChild($tagtype);
		}
		
		return $domdocument;
	}
	
	/**
	 * Adicionando um parametro struct
	 * 
	 * @param
	 * @return
	 * */
	public function addParamStruct($domdocument,$tagpai,$arr)
	{
		if($domdocument instanceof DomDocument)
		{
			$tagparam = $domdocument->createElement('param');
			$tagpai->appendChild($tagparam);
			
				$tagvalue = $domdocument->createElement('value');
				$tagparam->appendChild($tagvalue);
				
					$tagstruct = $domdocument->createElement('struct');
					$tagvalue->appendChild($tagstruct);
					
					if(is_array($arr) && count($arr) > 0)
					{
						
						foreach($arr as $key => $value)
						{
							$tagmember = $domdocument->createElement('member');
							$tagstruct->appendChild($tagmember);
								
								$tagname = $domdocument->createElement('name',$key);
								$tagmember->appendChild($tagname);
								
								$tagvalue = $domdocument->createElement('value');
								$tagmember->appendChild($tagvalue);
								
									if(is_array($value) && count($value) > 0)
									{
										$tagArray = $domdocument->createElement('array');
										$tagvalue->appendChild($tagArray);
										
											$tagData = $domdocument->createElement('data');
											$tagArray->appendChild($tagData);
										
											foreach($value as $v)
											{
												$tagValue = $domdocument->createElement('value');
												$tagData->appendChild($tagValue);
												
												if($this->getType($v) == 'NULL' || $v == '')
												{
													$tagString = $domdocument->createElement('string');
													$tagValue->appendChild($tagString);
												}
												else
												{
													$tagString = $domdocument->createElement($this->getType($v),$v);
													$tagValue->appendChild($tagString);
												}
											}
									}
									else
									{
										if($value == '')
										{
											$tagtypevalue = $domdocument->createElement($this->getType($value));
											$tagvalue->appendChild($tagtypevalue);
										}
										else
										{
											$tagtypevalue = $domdocument->createElement($this->getType($value),$value);
											$tagvalue->appendChild($tagtypevalue);
										}
									}
						}
						
					}
		}
				
		return $domdocument;	
	}
	
	
}

?>
Sobre o autor
Felipe Marques é Consultor e Analista de Sistemas Web e Mobile. Mais de 10 anos de experiência.
Por :
Comentários : 0

Faça um comentário

*

Facebook Auto Publish Powered By : XYZScripts.com