alexmontoanelli

a place to have some fun..

Gerando relatórios com Jasper no PHP – mini how-to

Para quem tem a necessidade de gerar relatórios, o php não possui nenhuma ferramenta a nível da já  consagrada
Jasper, disponível no Java.

A solução então é usar o projeto phpJavaBridge para criar uma ponte entre o mundo Java e PHP e assim conseguir conversar
com o Jasper.

Vamos lá para a receita, lembre-se que vocẽ precisar ter um certo conhecimento para fazer isso e saber oque está acontencedo,
ter uma certa intimidade com Java e Tomcat e outros.

Primeiro você vai precisar de um servidor web  tomcat rodando -  vários how-to podem ser encontrados no google;

Depois disso baixe o  phpjavabridge (binário), disponível em http://php-java-bridge.sourceforge.net/pjb/download.php,e
baixe tambŕm o Java.inc, disponível na mesma página.

Copie o .war do phpjavabridge (JavaBridge.war) para a pasta webapps do tomcat para fazer o deploy da aplicação.

Acesse então: http://localhost:8080/JavaBridge e se tudo der certo você verá a tela de boas vindas do phpjavabridge.

Feito isso baixe o jasper aqui e após descompactar copie os  *.jar para a basta WEB-INF/lib dentro da pasta do JavaBridge
que esta no webapps do tomcat.

Aqui estão uns scripts para testar a a aplicação no console (linux), já com um modelo básico de relatório feito no iReport
usando csv para backend de dados.

Você pode usar xml e até conexão direta com o banco de dados como origem dos dados.

Nota: todos os paths são relativos ao tomcat e não ao php.

Aconselho a ler e reler muito a documentação que se encontra no site.

Mais uma vez digo, essa tarefa não é para iniciantes, então tenha muita paciência.

Abraços

April 13th, 2010 by alexm
Posted in php | No Comments »

ZendFramework – Usando parâmentros nas Actions

Para quem usa o ZendFramework, em modo MVC, sabe que o modo para pegar uma váriavel  passada por GET/POST/COOKIE, deve ser realizada através dos métodos: getRequest()->getParam(‘nome_da_variavel’), do objeto Zend_Coontroller_Action.

Abaixo mostro uma implementação, que extende a classe Zend_Action para que seja usado os parâmentros no corpo da função.

Hoje você utiliza da seguinte forma:

<?php
class IndexController extends Zend_Controller_Action {

public function indexAction(){

//obterá o parâmentro GET/POST teste
 echo $this->getRequest()->getParam('teste');

}

}

A nova forma será:

<?php
class IndexController extends My_Action {

public function indexAction(string $teste){

//obterá o parâmentro GET/POST teste
 echo $teste;

}

}

Abaixo a classe My_Action.

Abraços

—————

<?php                                                                                                                                  
/**                                                                                                                                    
 * Map request parameters to action method                                                                                             
 * @author Albert Varaksin                                                                                                             
 * @licence public domain                                                                                                              
 */                                                                                                                                    
class My_Action extends Zend_Controller_Action                                                                           
{                                                                                                                                      
 /**                                                                                                                                
 * Dispatch the requested action                                                                                                   
 *                                                                                                                                 
 * @param string $action Method name of action                                                                                     
 * @return void                                                                                                                    
 */                                                                                                                                
 public function dispatch($action)                                                                                                  
 {                                                                                                                                  
 // Notify helpers of action preDispatch state                                                                                  
 $this->_helper->notifyPreDispatch();                                                                                           

 $this->preDispatch();
 if ($this->getRequest()->isDispatched()) {
 if (null === $this->_classMethods) {  
 $this->_classMethods = get_class_methods($this);
 }                                                   

 // preDispatch() didn't change the action, so we can continue
 if ($this->getInvokeArg('useCaseSensitiveActions')
|| in_array($action, $this->_classMethods)) {
 if ($this->getInvokeArg('useCaseSensitiveActions')) {                                       
 trigger_error('Using case sensitive actions without word separators is deprecated;
please do not rely on this "feature"');
 }                                                                                                                             

 $reflMethod = new Zend_Reflection_Method($this, $action);                                                                     
 $actionParams = $reflMethod->getParameters();                                                                                 
 $requestParams = $this->_request->getParams();                                                                                
 $args = array ();                                                                                                             
 foreach ($actionParams as $param)
 {
 // get parameter type
 if (($reflClass = $param->getClass()) instanceof Zend_Reflection_Class) {
 $type = $reflClass->getName();
 } else if ($param->isArray()) {
 $type = 'array';
 } else {
 $type = $param->getType();
 }

 // get passed parameter
 $name = $param->getName();
 if (isset($requestParams[$name])) {
 $value = $requestParams[$name];
 } else if ($param->isDefaultValueAvailable()) {
 $value = $param->getDefaultValue();
 $type = '';
 } else {
 $docBlock = $reflMethod->getDocblock();
 if (($tagRefl = $docBlock->getTag("require_$name"))
instanceof Zend_Reflection_Docblock_Tag) {
 $tryClass = trim($tagRefl->getDescription());
 if (class_exists($tryClass, true))
 throw new $tryClass("Missing value for argument $name");
 else
 throw new Zend_Controller_Action_Exception("Missing value for argument $name");
 }
 $value = null;
 }

 // fix value type
 $basicTypes = array(
 'int', 'integer', 'bool', 'boolean',
 'string', 'array', 'object',
 'double', 'float'
 );
 if (in_array($type, $basicTypes)) settype($value, $type);
 else if (strlen($type) && class_exists($type, true)) $value = new $type($value);

 $args[] = $value;
 }
 // dispatch the action
 call_user_func_array(array($this, $action), $args);
 } else {
 $this->__call($action, array());
 }
 $this->postDispatch();
 }

 // whats actually important here is that this action controller is
 // shutting down, regardless of dispatching; notify the helpers of this
 // state
 $this->_helper->notifyPostDispatch();
 }
}
October 17th, 2009 by alexm

Threads no PHP

Exemplo básico de utilização de threads no PHP

$pid = pcntl_fork();

if ($pid == -1) {

     die('Erro ao lançar thread');

} else if ($pid) {

     // thread principal
     //aguardamos a thread child terminar
     pcntl_wait($status); 

     echo "Processo child terminado\n";

     exit(0);

} else {

     //thread secundario
     //mudamos para um usuário não privilegiado
     posix_setuid(1000);
     posix_setgid(1000);

     //colocamos a thread para fazer algo,
     //ate que uma condição seja satisfeita e ela termine
	$i=0;
	while(true){	

           if (file_exists('/tmp/stop')){
		echo "Terminado thread";
		exit(0);
	   }

	   echo "Iteração : ". ++$i . "\n";
	   sleep(2);

	}

}

 

Mais informações aqui.

Abraços e até.

August 29th, 2009 by alexm
Posted in php | No Comments »

Criptografia RSA em PHP em poucas linhas – the simple way

Abaixo descrevo os passos para implantar um sistema de chaves baseada em RSA,para que sua aplicação posso trocar dados de forma transparente.

Utilizei o procedimento para assinar um cookie,  na máquina do usuário e depois validá-lo, em um sistema de auto-login.

Você vai precisar do arquivo RSA.php, disponível em http://scripts.ringsworld.com/development-tools/rsa1.3/:

Após isso, vamos  passar por tres etapas, a geração das chaves, a assinatura dos dados, e por úlitmo a decodificação dos dados assinados.

Para gerar um par de chaves, e encriptar e decriptar os dados, usaremos o bloco de código abaixo comentado como exemplo.

<?php
require_once ‘RSA.php’;

//Iremos ter em $keys, um par de chaves, a pública e a privada,a
//a qual você deverá guardar para poder decriptar os dados mais tarde.
$keys = generate_keys ();

//com a chave sgerada iremos assinar uma string com a
//chave pública para futura comparação
$string_secreta = "Minha informação sigilosa";
$encoded = rsa_encrypt ($string_secreta,  $keys[1],  $keys[0]); 

//OK, nossa ‘informação sigilosa’ esta agora encriptada,
//e pode ser distribuida,porem apenas quem tiver o valor de $keys
//poderá ver o conteudo, entao é importante manter a chave geradada
//em um local seguro

//Podemos agora decriptar o valor,
//e verificar se tudo ocorreu certinho:
$decoded = rsa_decrypt($encoded,  $keys[2],  $keys[0]);
$result = ($decoded === $message);

//$result será um boolean onde se a mensagem
//decodifica foi igual a mensagem original
// retornará true } else { retornará false; }

 

Abraços

July 22nd, 2009 by alexm
Posted in php | No Comments »

Easter Eggs no PHP

Abaixo seguem alguns eggs para o PHP.

Acesse um url php passando como variavel uma das strings abaixo, e você verá o poder delas.

-> PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000

-> PHPE9568F34-D428-11d2-A769-00AA001ACF42

-> PHPE9568F35-D428-11d2-A769-00AA001ACF42

-> PHPE9568F36-D428-11d2-A769-00AA001ACF42

Aqui vai o exemplo de um url:

http://php.net/?=PHPE9568F36-D428-11d2-A769-00AA001ACF42

Abraços

October 27th, 2008 by alexm
Posted in php | No Comments »

PHP Encontrar/ Extrair Substrings

Uma tarefa bastante comum em PHP a encontrar e substituir partes de string por outras.

No PHP temos vários funções para manipulação de strings, entre as mais usadas e simples temos as strpos(), strstr(), substr() e substr_replace().

strpos() : Encontra a primeira ocorrência de uma string e retorna sua posição.

Exemplo: $pos = strpos(‘abcde’, ‘de’); //irá retornar 3

strstr() : Encontra a primeira ocorrência de uma string e retorna tudo apartir dela.

Exemplo: $string = strstr(‘email@dominio.com.br, ‘@’); //irá retornar @dominio.com.br

substr() : Retorna uma parte expecifica da string

Exemplo: $string = substr(‘abcdef, 1, 3); //ira retornar ‘bcd’

Para mais detalhes veja aqui.

Abraços

October 25th, 2008 by alexm
Posted in php | No Comments »

Resolvendo problemas de charset enconding com LDAP e PHP

Estamos vivos.

Depois de uma breve pausa para a política e outras coisinhas estamos de volta.

Para não perder a viagem aqui vai uma dica para quem tá com problemas de encoding entre ldap e PHP.

Se você tá passando por problemas ao gravar caracteres acentuados em uma base ldap, e ao mostrar eles, você vê um ‘?’ ou outros caracteres estranhos no local do original, basta usar a função utf8_encode antes de gravar os valores no banco, (ldap_add), e quando for recuperar (ldap_search) os valores do banco, utilizar utf8_decode para converte-los novamente e exibir normalmente.

Logo novidades por aqui. Aguardem!

Abraços

October 8th, 2008 by alexm
Posted in php | No Comments »

Setando configurações LDAP no windows (ldap.conf)

Se você precisar setar as configurações do ldap.conf em um Windows, para por exemplo, acessar via php, um base ldap remota sobre ssl, você deve criar os seguintes pastas/arquivos:

C:\openldap\sysconf\ldap.conf

Com o seguinte conteudo:

base dc=meudominio,dc=com,dc=br
uri ldaps://meu.servidor.ldap.com.br/
ldap_version 3
TLS_REQCERT never

É isso, simples assim, mas penei para resolver este problema.

Abraços

September 6th, 2008 by alexm

Certificação Zend/PHP – Parte Final

Bom, resumindo: Não passei.

Não sei oque aconteceu.

Após 5 simulados, em 4 deles tirando nota ‘Perfect’ na hora do vamos ver, não deu.

Não sei se, a prova estava fácil e eu estava nervoso, ou a prova estava dificil e eu calmo, só sei que não deu.

Devo marcar uma nova prova para Novembro.

Abraços

August 30th, 2008 by alexm

Certificação Zend/PHP – Parte 1 – Inscrição

Foi hoje o dia em que tomei a coragem e fiz a inscrição para tirar a Certificação ZCE.

Prova marcada para dia 29 de Agosto em Blumenau.

Agora é suar pra ter o nome lá na Yellow-Page.

Abraços

August 4th, 2008 by alexm
Posted in php | 1 Comment »