Português Português English English

Ascending and Descending Order and Pagination with LDAP

LDAP hasn’t a good documentation. Users of wonderful database API’s may feel no good when using this technology in PHP.

I had one of these problems when I needed to paginate LDAP entries. The ldap_sort function sorts in ascending order only. Result: I had to do pagination and ordering in two direction using ldap_count_entries, ldap_sort, ldap_first_entry, ldap_next_entry, ldap_get_attributes, array_reverse and a bit of voodoo :-P . The result is in a post left in the ldap_search documentation.

see the solution here

Posted in Development, PHP | No comments

Projects at Google Code

Hello all. Usually I post releases, documentation and everything related of some my libraries in this blog.

I opted to create some projects at GoogleCode because I don’t want to post about it here. I think this will be better for all of us.

I announce too that the WSDLDocument 0.2 was relasead at http://code.google.com/p/wsdldocument. There is a wiki with changelog and usage tips.

The BackTrace library don’t have news, but you can see it at http://code.google.com/p/backtrace.

Posted in Development, PHP | No comments

WSDL + PHP = WSDLDocument

This post was made to release the WSDLDocument, a WSDL generator in PHP to webservices.

The way how some subjects are saying about TI hides the expert developer that exists inside a lot of professionals from our area. One of these subjects is webservices. It’s easy to do a client in PHP. But to do a server it’s necessary more work because the WSDL generation. Of course there are others things to look at during the development with webservices.

WSDLDocument

Why is to make WSDL in PHP difficult? A variable in PHP change its type during the script running. The webservices needs you declare the returns’ and arguments’ type.

The goal is look out it to generate the WSDL. To do this isn’t easy, but this isn’t as hard as find mustache on Elephant. So dear, the WSDL generation may be made with two steps:

  1. Find out the type of the parameters and returns of the services;
  2. Generate the XML.

The developer who implemented each service must to describe any where the types information. No more magic, ok? We’re not mage, we’re TI professionals. A good place to put it is the method documentation. The notations help us to solve this problem and keep our code well documented. With the types information we can generate the WSDL. The WSDL generation must to follow W3C stardards.

I release today the WSDLDocument!

This library isn’t a new thing. I did it - only - to improve my knowledges and to understand the WSDL structure. Some another libraries:

As someone may see the WSDLDocument extends DOMDocument. You create a instance of this and… go planet! You have a XML in your hand. You may - for example - link a XSLT file to show a bit beautiful on the browser. I didn’t want to be intrusive and oblige you change your framework. This have to be saw as a library to be put inside your application.

Above a sample how to use this library.

<?php

// generating the wsdl
$class "MyWebserviceClass";
$url "http://mydomain.com/?class=" $class;
$wsdl = new WSDLDocument$class$url );

// showing the wsdl
echo $wsdl->saveXml();

<?php

class MyWebserviceClass
{
    
    
/**
     * Transfering complex type.
     *
     * @param Person
     * @return integer
     */
    
public function anyMethodPerson $type )
    {
        
// ...
        
return 100;
    }
    
    
/**
     * Transfering array of complex type.
     *
     * @param integer
     * @return Person[]
     */
    
public function another$quantity )
    {
        
$list = array();
        for ( 
$i 0$i $quantity$i++ )
        {
            
array_push$list, new Person() );
        }
        return 
$list;
    }
    
}

class 
Person
{
    
    
/**
     *
     * @var string
     */
    
public $name "";
    
    
/**
     *
     * @var integer
     */
    
public $children "";
    
}

I will try keep this library updated. I’m busiest this time, because this I don’t know what it’ll happen.

download the WSDLDocument here

Posted in Development, PHP | 5 Comments

A morte do Smarty

Em uma lista de discussão Hasin Hayder divulgou um post de seu blog (Foi se o tempo do Smarty), nele ele explica o motivo da não necessidade de se utilizar Smarty ou qualquer outra engine de template similar.

Hasin, basicamente, justifica sua teoria com uma pergunta, “Por que?”. Responda você as seguintes perguntas:

  • Por que minha equipe deve gastar tempo em aprender uma nova linguagem?
  • Por que devo utilizar uma nova linguagem que faz tudo que o PHP faz e ainda é mais lenta?
  • Por que não posso escolher/melhorar uma arquitetura para o meu projeto que implemente MVC, ao invés de forçar isso com bibliotecas isoladas em minha aplicação?

Alguns podem falar “mas o Smarty faz filtro e um monte de mágicas pra mim”. Hoje é possível manipular frameworks para que nos auxiliem nessas tarefas e em diversas outras. E o melhor, tudo em PHP. Sem precisar gastar tempo aprendendo outra linguagem. Zend_View, por exemplo, adota a idéia de helpers, que nada mais é que disponibilizar métodos para a camada de visualização. Nos helpers você pode aplicar o filtro ou qualquer outra coisa que quiser!

Na minha opnião arquitetura da aplicação é mais importante que as bibliotecas que ela utiliza. Utilizar uma biblioteca não significa que sua aplicação seja uma maravilha. Mas sem escapar muito do assunto, acho que Smarty morreu mesmo quando se iniciou o boom de frameworks para PHP como o Cake, PHP2Go, ZendFramework, CodeIgniter, Prado e tantos outros.

Posted in Development, PHP | 2 Comments

how to: fazer hello world em PHP-CLI

Estudando um pouco de PHP - pra variar - acabei conhecendo mais a fundo uma biblioteca muito legal do Zend Framework (ZF), é o Zend_Console_Getopt. Neste post vou fazer um passo-a-passo para quem quiser saber como fazer um script com interface via linha de comando (CLI) utilizando essa biblioteca.

Pra entender esse post você precisa saber programar (em qualquer linguagem que use o paradigma imperativo) e o que é CLI. Quem é da computação, com os links indicados, consegue prosseguir em poucos minutos de leitura.

Primeiro precisamos saber o que essa biblioteca faz e no que ela irá nos ajudar. Zend_Console_Getopt é uma classe que auxilia aplicações com interface linha de comando a fazerem o parser dos parâmetros. Imagino eu que essa atividade é a mais difícil pra quem está iniciando no mundo CLI. Logo essa biblioteca vai tornar as coisas mais fáceis.

Precisamos também definir o que nossa aplicação vai fazer. Eu sugiro que ele imprima um “hello world”, e como não tem ninguém pra contrariar é isso que ele vai fazer e pronto! :-) .

Mas (…) ele não exibirá um simples “alô”. Nosso programa devera mostrar um alô em três línguas: português, espanhol e inglês. Isso deverá ser determinado pelo usuário com o parâmetro language, exemplo de uso: “–language=pt” ou “-l es”.

Outra opção que nossa aplicação vai ter é o famoso “verbose”. Passando esse parâmetro (”-v” ou “–verbose”) o nosso programa vai imprimir o que está acontecendo.

Vamos ao trabalho!

  • instale um linux qualquer em sua máquina com php5-cgi (é CGI e não módulo do apache!);
  • crie um diretório da aplicação chamado “sample” em qualquer lugar que você tenha permissão de escrita;
  • crie um arquivo dento do diretório criado acima chamado “hello_world”;
  • dê permissão de execução para o arquivo criado no passo anterior, use “chmod 753 hello_cli” ;-) ;
  • baixe o ZendFramework e copie o diretório “library” (somente esse diretório!) no mesmo lugar que você colocou o arquivo “hello_cli” (deve ficar assim: sample/libray/Zend/*);
  • edite o arquivo “hello_cli” com o código que será apresentado.

O código do arquivo “hello_cli” está “jogado” logo abaixo, porém irei detalhá-lo depois.

Nota: na primeira linha é necessário indicar que o php é quem irá interpretar nosso código. O caminho do interpretador PHP no meu computador é “/usr/bin/php5-cgi”, caso em seu sistema operacional seja diferente altere essa linha (use o comando locate no terminal caso não lembre aonde está).

#!/usr/bin/php5-cgi -q
<?php

############### CONFIGURATION

# Error
# programmers wrong never! rigth?
ini_set"error_reporting"E_ALL );
ini_set"display_errors");
ini_set"display_startup_errors");
ini_set"html_errors");

# Constants
define"DIR_ROOT"realpathdirname__FILE__ ) ) . "/" );
define"DIR_LIBRARY"DIR_ROOT "library/" );

# alter include_path
ini_set"include_path"ini_get"include_path" ) . PATH_SEPARATOR DIR_LIBRARY );

# Zend Framework
# configures autoload to call zend class loader
require "Zend/Loader.php";
spl_autoload_register( array( "Zend_Loader""autoload" ) );

# Functions
function output$sText )
{
    echo 
$sText "\n";
}

############### ARGUMENTS

# configure arguments and options
# see http://framework.zend.com/manual/en/zend.console.getopt.rules.html
$_rules = array(
    
"verbose|v" => "",
    
"language|l=s" => ""
);
$_argument = new Zend_Console_Getopt$_rules );

# fetchs arguments
try
{
    
$verbose = isset( $_argument->verbose );
    
$language $_argument->language;
}
catch ( 
Zend_Console_Getopt_Exception $_exception )
{
    
output$_exception->getUsageMessage() );
    exit();
}

############### APPLICATION

# finally, the application!
# let's go!
if ( $verbose )
{
    
output"starting..." );
}
switch ( 
strtolower$language ) )
{
    case 
"pt":
        
output"Alô mundo CLI!" );
        break;
    case 
"es":
        
output"¡Hola mundo CLI!" );
        break;
    case 
"en":
    default:
        
output"Hello CLI world!" );
        break;
}
if ( 
$verbose )
{
    
output"ending, bye..." );
}

Perceba que nosso código possui, na ordem, três partes: configuração; tratamento da entrada; regra de negócio. Inicialmente configuramos a exibição de erro, o ZendFramework e criamos uma funçãozinha de output. A configuração do ZF exige algumas tarefas específicas que não vou abordar aqui, mas fica pra outro post, ok?

A segunda parte é a mais importante, nela determinamos quais os parâmetros possíveis para nossa aplicação, capturamos os dados e tratamos os erros de entrada. A variável “$_rules” possui os parâmetros que a classe da Zend deverá tratar, não vou aqui detalhar como funciona, mas olhando já da pra se ter uma idéia, mas quem quiser saber mais acesse o link de configuração de parâmetros. No bloco “try” pegamos os parâmetros que foram passados à nossa aplicação, veja que basta acessar os parâmetros como se fossem atributos da classe Zend_Console_Getopt. Ao mesmo tempo que pegamos as entradas o tratamento de erro é feito com a captura de possíveis exceções que são soltas pela biblioteca Zend.

A última parte é tranquila, com tudo feito e os parâmetros carregados nos resta aplicar as regras que definimos anteriormente e acenar para o novo mundo que nos abre. Veja alguns exemplos de uso da nossa apliação.

renan@renan:~/sample$ ./hello_cli -l pt
Alô mundo CLI!
renan@renan:~/sample$ ./hello_cli --language=es
¡Hola mundo CLI!
renan@renan:~/sample$ ./hello_cli
Hello CLI world!
renan@renan:~/sample$ ./hello_cli -vl en
starting...
Hello CLI world!
ending, bye
renan@renan:~/sample$ ./hello_cli -vl pt
starting...
Alô mundo CLI!
ending, bye

Abaixo o download do resultado final pra quem estiver com preguiça de seguir os passos indicados ou teve problemas na criação da aplicação.

Hello CLI World!

Posted in Development, PHP | 1 Comment

PHPSource 0.0.1

Alguns posts meus aqui vão precisar que eu mostre alguns código fontes em PHP. Procurei um pouco e não achei nenhum simples. Procurei insistentemente durante 60 segundos (…) ok, não é muito tempo, mas o que eu queria era muito simples, e como não achei decidi fazer o meu próprio.

A intenção foi ser simples. Você precisa, antes, fazer o upload de um arquivo PHP que deseje exibir em seu blog WordPress. O primeiro “parâmetro” é a altura do bloco de código. O segundo é o caminho do arquivo relativo ao diretório “wp-content/uploads/”. Os parâmetros são separados por “:”. É preciso colocar esses parâmetros como no exemplo abaixo:

[phpsource:250:2001/02/exemplo.php]

O plugin é um filtro que captura o que estiver escrito parecido com o que está aí em cima e exibe o arquivo acionando a função highlight_file.

Baixe o plugin PHPSource 0.0.1

Como no mundo nada se cria, tudo se transforma. Créditos ao Élcio Ferreira e seu plugin Dirty PHP Include, que me permitiu fazer esse aqui.

Posted in Development, Linux, PHP | No comments

Namespaces no PHP 6

Navegando - e procurando coisas novas sobre PHP - achei um post interessante no blog PHP 10.0. É um FAQ sobre como vai funcionar namespaces no PHP 6. Tudo bem, não é novidade que o PHP terá namespace, mas o legal é assistir como ele está sendo construído. Achei o texto interessante e resolvi traduzí-lo.

Para acessar o texto original clique aqui. Veja também outro post sobre namespace e o design de como poderá ser o namespace em PHP 6.

Por que é necessário namespaces em PHP?
Porque nomes grandes como PEAR_Form_Loader_Validate_Table_Element_Validator_Exception são cansativos.

Qual é o principal objetivo do namespace?
Resolver o problema acima citado.

O que significa “namespace X::Y::Z”?
Todas as classes e funções são prefixadas com X::Y::Z

O que significa “import X::Y::Z as Foo”?
Um apelido para um namespace. Toda vez que uma classe ou função com o prefixo Foo for chamado, ele será traduzido para X::Y::Z.

O que significa “import X::Y::Z”?
Significa “import X::Y::Z as Z”, como no item anterior.

O que significa “import Foo”?
Nada.

Qual é o escopo do namespace e import?
Arquivo atual.

Um mesmo namespace pode ser utilizado em vários arquivos?
Sim.

Existe relação entre os namespaces X::Y::Z e X::Y?
Só na cabeça do programador.

Como faço para importar todas as classes de um namespace X::Y::Z para o escopo global?
Não é possível, isso nos traria o problema global da poluição espacial.
Entretanto você pode importar X::Y::Z e então prefixar sua classe com Z::.

Isso não faz com que haja nomes grandes?
Não maiores que três elementos: Namespace::Classe::Elemento.

Por que isso não é implementado como em <coloque sua linguagem favorita aqui>?
Porque PHP não é <coloque sua linguagem favorita aqui>.

Posted in Development, PHP | No comments

BackTrace 0.0.1

Há muito tempo fiquei devendo a publicação de uma biblioteca que exibe o rastro de uma execução de um script PHP. Fiz uma biblioteca que manipula um rastro e faz algumas coisa a mais que a chamada de um var_dump() com o parâmetro debug_backtrace().

O que essa biblioteca faz? De acordo com a documentação da classe principal: “Manipula e fornece acesso aos dados de uma determinada pilha de execução. Por meio de métodos é possível caminhar entre os níveis e capturar informações respectivas a cada um deles.”

E o que eu programador ganho com isso? Essa biblioteca tem me ajudado muito na correção de erros. Quem não utiliza debug para programar em PHP vai gostar bastante. Quem utiliza também, pois ele não serve apenas para exibir um erro durante a fase de construção de um projeto, ele pode ser utilizado no log ou envio de e-mail para facilitar a detecção e correção de erros. Conforme exemplo exibido o trace exibe parte do código (configurável) e destaca a linha em que ocorre mudança de nível no rastro.

Como utilizar?

Primeiro é necessário carregar as classes:

include_once “backtrace/BackTrace.php”;
include_once
“backtrace/BackTraceExplain.php”;

Depois utilizar onde deseja exibir o rastro:

$oTrace = new BackTrace();
echo
$oTrace->explain();

A classe BackTrace tem um monte de metódos interessantes, mas o explain é o mais legal. Pra quem for curioso dê uma olhadinha na classe BackTraceExplain, que é a classe utilizada por esse método.

Outra possibilidade de utilização dessa biblioteca é em uma função que faz dump de qualquer coisa. Enfim, as possibilidade são diversas. Abaixo o link para download da biblioteca.

BackTrace 0.0.1

exemplo BackTrace

A imagem ao lado ilustra um exemplo do resultado da utilização integrada com outra biblioteca de manipulação de erro em um site com o Zend Framework. Perceba que o exemplo é a exibição de um notice.

Qualquer bug, sugestão ou reclamação, por favor, serão bem-vindos neste tópico.

Posted in Development, PHP | 4 Comments
BrasilMato GrossoRondôniaDistrito Federal