Programação Especialista

Artigos de Programação em Geral

Subscribe to RSS feed

Array de ComplexTypes no Nusoap

, , , ...

Estou criando mais um post a respeito de criação de complexTypes utilizando o nuSoap, pois acredito que a complexidade e a falta de documentação na internet em português fazem com que as pessoas deixem de usar esse conceito que é extremamente importante e acabam fazendo muitos contornos para retornar uma coleção de dados de um webservice.
Para entendermos o complexTypes é importante que leiam o artigo anterior de complexTypes Aqui.
Antes da criação desse novo objeto que irei descrever, para retornar mais de um objeto ou mais de um dado era necessário alguns contornos como por exemplo, serializar o objeto e criptografar com base64 ja que o nuSoap reconhece o objeto serializado e recusa o envio.
A nossa criação de coleção de complexTypes usará o mesmo conceito ORM mapeando os campos da tabela em objetos para facilitar a manipulação.

<?php

class ComplexHelper {

    private $soap = null;
    private $current = '';

    /**
     *
     * @param type $server 
     * Add an instance of NuSoap to build the complex type
     */
    function __construct($server) {
        $this->soap = $server;
    }

    /**
     *
     * @param type $table
     * @return Array
     * Build an array with all the fields from the selected table 
     */
    private function getFields($table) {

        $qry = "show fields from {$table}";
        $rs = mysql_query($qry);
        while ($row = mysql_fetch_array($rs)) {
            $campos[] = $row['Field'];
        }

        return $campos;
    }

    /**
     *
     * @param type $table
     * @return ComplexHelper 
     * Build a simple complex type using the fields from a selected table
     */
    function SimpleComplexType($table) {
        $fields = $this->getFields($table);

        if (count($fields) > 0) {
            $fieldArr = null;
            foreach ($fields as $field) {
                $complex[$field] = array(
                    'name' => $field,
                    'type' => 'xsd:string'
                );
            }
        }
        $this->soap->wsdl->addComplexType(
                $table, 'element', 'struct', 'all', '', $complex
        );
        $this->current = $table;
        return $this;
    }

    /**
     *
     * @param type $prefix 
     * Bind an array from a simple complex type
     */
    final function bindArray($prefix) {
        $table = $this->current;
        $fields = $this->getFields($table);

        if (count($fields) > 0) {
            $fieldArr = null;
            foreach ($fields as $field) {
                $complex[$field] = array(
                    'name' => $field,
                    'type' => 'xsd:string'
                );
            }
        }
        $this->soap->wsdl->addComplexType(
                $prefix . $table, 
                'complexType', 
                'array', 
                '', 
                'SOAP-ENC:Array', 
                array(
                    $table => array(
                        'name' => $table,
                        'type' => 'tns:' . $table
                    )
                ), 
                array(
                    $table => array(
                    'ref' => 'SOAP-ENC:arrayType',
                    'wsdl:arrayType' => 'tns:' . $table . '[]'
                    )
                ), 'tns:' . $table
        );
    }

}

?>


Explicando a classe:

Bom, a classe em sí é bastante simples. O que você terá que fazer é instanciá-la com o objeto do nuSoap como parâmetro e o resto a classe se encarrega de fazer.

Existem 2 funções importantes, a SimpleComplexType e a bindArray.
A bindArray não pode ser usada separado sem ser aninhada a um SimpleComplexType. Pensem que você precisa primeiro criar a estrutura de dados para depois informar que você quer um array com aqueles dados.


Sua utilização:

A utilização é bem simples pois no SimpleComplexType você colocará como parâmetro a tabela do campo que quer que seja criado a estrutura de dados e o bindArray você colocará como parâmetro um prefixo para demonstrar que a coleção é um array para facilitar a sua utilização.

Criaremos a página do WebService que será consumida por outros clientes independente da linguagem:

<?php
include('nuSoap/lib/nusoap.php');
include('ComplexHelper.class.php');
$server = new soap_server;
$nuHelper = new ComplexHelper($server);
// WSDL Support
$server->configureWSDL('My WSDL Services', 'urn:server.businessData');
$server->wsdl->schemaTargetNamespace = 'urn:server.businessData';
mysql_connect('localhost', 'R0oT', 'N0n3P4s5');
mysql_select_db('mydbh');
$nuHelper->SimpleComplexType('cliente')->bindArray('Arr');

// registra o método a ser oferecido
$server->register('last10', //method name
        array(), //in
        array('return' => 'tns:Arrcliente'), //out
        'urn:server.businessData', //namespace
        'urn:server.businessData#businessData', //soapaction
        'rpc', //style
        'encoded', //use
        'get information of the latest 10 clients' //description
);

function last10() {
    $qry = "select * from cliente order by cod_cli DESC limit 10 ";
    $rs = mysql_query($qry);
    if (mysql_numrows($rs) > 0) {
        $dados = array();
        while ($row = mysql_fetch_array($rs, MYSQL_ASSOC)) {
                $dados[] = $row;            
        }
    }
    return $dados;
}

// requisição para uso do serviço
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
?>


Até a linha de conexão do banco é tudo normal e tudo padronizado de como deve ser a criação de um WebService.
A linha $nuHelper = new ComplexHelper($server); faz a instância do nosso ComplexHelper como explicado anteriormente mandando como padâmetro nossa instância do nuSoap.

logo mais abaixo fazemos o seguinte comando:
$nuHelper->SimpleComplexType('cliente')->bindArray('Arr'); e isso faz a criação de uma folha de dados cliente e uma coleção de dados correspondente com o prefixo Arr criando a coleção com o nome Arrcliente.

Feito isso podemos utilizar nossos dois complexTypes, cliente e Arrcliente do jeito que bem entendermos, como no exemplo de criação do last10() que coloca como saída a coleção dos 10 últimos clientes.


Espero que tenham entendido a utilização da classe acima e que as utilizações dos WebSerices se tornem cada vez mais enxutas e comuns.

Até a próxima!


ComplexHelper.class.php

index.php (WebService)

complexTypeClient.php (Script para acessar)


Autenticar Usuário no Linux utiliando PHP + (passwd ou shadow)

, , , ...

Hoje surgiu um desafio aqui onde eu trabalho:

Fazer autenticação de um usuário utilizando o passwd ou o shadow pois evitariamos ter uma senha de root para cada sistema

Então pensei, pesquisei e cheguei no seguinte código que eu espero que seja útil para alguem algum dia

Read more...

Como utilizar complexTypes no nuSoap

, , , ...

Resolvi fazer este post, pelo simples fato de ser uma utilidade para todos os programadores PHP que tem certas dificuldades para trabalhar com webservices, pelo fato de que em 100% dos tutoriais em portugues ou até mesmo artigos, as pessoas simplesmente nos dão exemplos com tipos simples de dados e esquecem que no mundo OOP é impossível viver enviando centenas de dados simples sendo que seria muito mais fácil o envio de um agrupamento de dados como um array de tipos simples, e é isso que irei explicar neste artigo

Read more...

Introdução ao GTK com PHP

, , , ...

Depois de longos dois anos sem postar absolutamente nada no blog, resolvi voltar para tentar fazer posts periódicos afim de ajudar e esclarecer dúvidas de desenvolvedores.
Irei abrir a nova 'temporada' de posts com uma introdução sobre PHP GTK utilizando a ferramenta GLADE no linux, já que não existe nenhuma referência em português sobre o assunto.

O que você precisará ter:
GTK+
GLADE (http://glade.gnome.org/)
PHP + Apache {+ Mysql Opcional mas ja é bom ter tudo instalado }

Read more...

Herança de classes no PHP

Herança de classes é a coisa mais importante para o aproveitar funcionalidades de uma classe sem a necessidade de reescrever todo o código.
Não sei porque ainda não fiz um artigo sobre isso, que é de extrema importância.

Veremos como estender uma classe reutilizando códigos com facilidade

Read more...

Agrupar propriedades de várias classes

, , , ...

Esses dias precisei fazer uma coisa realmente interessante e vou compartilhar aqui no blog!
Precisei agrupar todas as propriedades de 3 classes para passar pra uma para uma função que enviava um e-mail para o cliente com todos seus dados, e para evitar ter q ficar pegando id e instanciando N objetos em tempo de envio de email para compor o email, resolvi criar esta função que eu agrupo todas as propriedades em uma classe ja tratada do jeito que deve ser feito e utilizo os dados ja prontos no objeto.
Claro que para funcionar corretamente deve ter uma nomenclatura de banco de dados bem feita pois se em duas classes tiver a propriedade nome, elas irão se sobrescrever, então o correto é colocar a propriedade no tipo : nome_cliente, nome_pedido e assim por diante.

Read more...

Criando um webservice para outras pessoas acessarem via programação

, , , ...

Bom dia galera.
Irei começar o dia com um post sobre WebServices e espero que gostem.
Este post tem como foco, criar, disponibilizar e acessar seu WebService para teste, aprendendo como liberar partes do seus sistemas para acesso externo e abrindo uma porta para a sincronização de seu sistema com outros, não necessariamente feitos em PHP ou rodando em interpretadores (ISS,Apache).

Requisitos:

Para o entendimento deste post é necessário ter um ou mais requisitos abaixo:

  • É de extrema importancia saber criar tabelas no Mysql;
  • Entender o que é uma classe, propriedades e métodos;
  • Vontade de aprender;

Read more...

Colocando marca d água em imagens zipadas

, , , ...

Muitas pessoas sentem dificuldade em tratamento de imagens com PHP. Muitas destas dificuldades se da ao fato que quase ninguém utiliza os recursos que a biblioteca GD oferece.
Irei mostrar um script extremamente simples.

Pega um arquivo zipado (pré-supondo que você ja fez o upload dele em uma pasta temporária);
Extrai os arquivos para uma pasta temporária ( a mesma ou outra que o desenvolvedor definir);
Exclui o arquivo ZIP;
Para cada imagem coloca a marca definida e move para uma outra pasta que o desenvolvedor definir;
Exclui as imagens temporárias.

Read more...

Design Pattern - FACTORY

, , , ...

O Design Pattern Factory nos fornece uma interface para criação de objetos relacionados ou dependentes.
Para criarmos um objeto no PHP utilizamos o seguinte comando: $pessoa = new Pessoa;
Porém nosso sistema fica extremamente inflexível, tendo só um tipo de objeto atuando no sistema.
Para darmos a flexibilidade de criação de objetos para o nosso sistema utilizamos o Factory.

Read more...

Criando uma classe comum para seu projeto - P2

, , , ...

Bom dia pessoal.
Começaremos esta semana com a continuação da nossa classe comum. Hoje incluiremos mais um método que será para calcular a diferença entre duas datas.

Read more...