Posts Tagged ‘PHP’

Manipulação de diretórios simples e fácil de usar com a classe X_Dir

Sunday, June 14th, 2009

Buenas pessoal, como muitos programadores eu cansei de ficar me esquentando cada vez que precisava manipular algum diretório, então após algumas lidas, alguns testes, montei uma classe que trabalha bem, claro que ela trabalha bem em sistema Unix Like, não perdi meu tempo e nem tenho como portar no windows, então abaixo segue a classe:

<?php
/**
 * Classe para manipulação de diretórios
 * Exclusivo para uso em sistemas Unix Like
 * Sem vontade para portar para plataforma MS
 * @author André Gustavo Espeiorin
 * @version 1.0
 * @package X
 */
class X_Dir
{
	/**
	 * Metodo Responsavel pela criação de diretórios
	 * @param $location - onde a pasta deve ser criada
	 * @param $name - nome da mesma, evite o uso de caracteres especiais e espaços em branco
	 * @param $chmod - permissão para o acesso a nova pasta
	 * @param $recursive - criar recursivamente?
	 * @return <string> caminho da pasta criada
	 */
	public static function create($location, $name, $chmod=0777, $recursive=true)
	{
		$path = $location . $name;
		/**
		 * Supressão de erro não aconselhada, porém caso a pasta exista
		 * o PHP lançará um aviso, coisa que nao queremos caso haja
		 * redirecionamento após a criação da mesma
		 */
		if( @mkdir( $path, $chmod, $recursive ) ){
			chmod( $path, $chmod );
			return $path . '/';
		} else{
			if( is_writable($path) && is_readable($path) ){
				return $path;
			}else{
				echo 'erro';
			}
		}
	}

	/**
	 * Método criado para apagar um arquivo unicamente, e não um diretório
	 * Pode apagar arquivos e links simbólicos
	 * @param $fileName - Nome do arquivo
	 * @return <boolean>
	 */
	public static function removeFile($fileName)
	{
		if ( is_file($fileName) || is_link($fileName) ) {
        	return unlink($fileName);
    	}else{
    		return false;
    	}
	}

	/**
	 * Método responável por remover um diretório, é capaz de remover
	 * um diretório completo, incluindo subdiretórios e arquivos por meio
	 * da recursividade.
	 * @param $dirname - nome do diretório como seu caminho completo no Sistema de Arquvios
	 * @return <boolean>
	 */
	public static function remove($dirname)
	{
		// Checa se existe o diretório
    	if ( !file_exists($dirname) ) {
        	return false;
    	}

    	/**
    	 * Caso encontrar um arquivo em meio a recursividade, ele o removerá
    	 * tratando ele como um arquivo e não diretório
    	 */
    	if (is_file($dirname) || is_link($dirname)) {
        	return self::removeFile($dirname);
    	}

    	/**
    	 * Abre o diretório chamado como um objeto dir
    	 * Faz a iteração no mesmo, lendo seu interior
    	 * e chamando recursivamente o mesmo até eliminar
    	 * todo o conteúdo do diretório
    	 * @var <object> diretório
    	 */
    	$dir = dir($dirname);
   		while (false !== $entry = $dir->read()) {
        	// Pula os ponteiros
        	if ($entry == '.' || $entry == '..') {
          	  continue;
        	}
        	// Chama novamente a função
    	    self::remove( $dirname . DIRECTORY_SEPARATOR . $entry );
    	}
    	// Fechamos nosso objeto dir
   		$dir->close();
   		// Finalmente remove nosso diretório
    	return rmdir($dirname);
	}

	/**
	 * Este método é utilizado na necessidade de renomear um diretório
	 * Utiliza recursividade para sub-diretórios e funcionou muito
	 * bem em todos os testes
	 * @param $path - Caminho até a localização do diretório a ser renomeado
	 * @param $oldDir - Nome do diretório a ser renomeado
	 * @param $newDir - Novo Nome para o diretório
	 * @return <boolean>
	 */
	public static function rename($path, $oldDir, $newDir)
	{
		// Checa se o diretório existe
    	if (!file_exists($path . $oldDir)) {
        	return false;
    	}   	

    	// Cria o novo diretório
    	$new = self::create($path, $newDir);

    	/**
    	 * Abre o velho diretório e itera ele, transferindo todos os arquivos para o novo
    	 * Os subdiretórios são transferidos do mesmo modo, por meio de recursividade
    	 * @var <object> dir
    	 */
    	$dir = dir($path . $oldDir);
   		while (false !== $entry = $dir->read()) {
        	// Pula os Ponteiros
        	if ($entry == '.' || $entry == '..') {
          	  continue;
        	}
        	// Se o conteudo for um diretório, recursividade!
        	if( is_dir($new . $entry) ){
        		self::rename($path . $oldDir, $entry, $path . $new . $entry );
        	}
        	// Aqui é feita a transferencia de arquivos
        	rename( $path . $oldDir . '/' . $entry, $new . $entry );
    	}
    	// Fecha o objeto
   		$dir->close();
   		// Remove o diretório antigo
   		self::remove( $path . $oldDir );
   		return true;
	}
}

Aqui vai um pequenino exemplo de como isso pode facilitar sua vida:

# vamos criar um diretório
echo X_Dir::create('/var/www/arigos/', 'aaa');
# agora outro dele
echo X_Dir::create('/var/www/arigos/aaa/', 'qwe1');
# antes do próximo passo, crie vários arquivos dentro das pastas... algo como:
$ touch aaa/teste.wtf
$ touch aaa/teste.sql
$ touch aaa/teste.php
$ touch aaa/qwe1/teste.php
$ touch aaa/qwe1/teste.asd
$ touch aaa/qwe1/teste.123
# agora renomeamos a pasta pai
echo X_Dir::rename('/var/www/arigos/', 'aaa', 'bbb');
# removemos um unico arquivo
echo X_Dir::removeFile('/var/www/arigos/bbb/qwe1/teste.123');
# e apagamos por completo tudo!
echo X_Dir::remove('/var/www/arigos/bbb/');

Muito simples, os “echos” que estão aí são somente para ver o que ta retornando, pois agora sua obrigação é testar se ta criando, renomenando e apagando…

Classe para buscar dados de GeoLocalização

Wednesday, May 27th, 2009

Buenas pessoal, depois de um tempo meio sem tempo pra postar, mudança nas prioridades e tudo mais, o Doctrine acabou ficando para um pouco depois, mas para cortar o silêncio que aqui se instaurou, vou aproveitar e postar uma classe na qual montei agora, muito simples, usa a API de um webservice gratuito de busca de dados de Geolocalização, bem simples mas pra mim ficou eficiente e rápido, espero que gostem.

<?php
/**
 * Classe para busca de dados de geolocalização
 * utiliza um webservice gratuito do iplocationtools.com
 * utilizando o formato json como padrão, por ser mais leve e ágil para tratar
 * @author André Gustavo Espeiorin <andregustavodocaqui@gmail.com>
 * @version 1.0
 * @package X
 *
 */
class X_Location
{
	/**
	 * Formato Padrão
	 * @var <string>
	 * @access private
	 */
	private $_format = 'json';

	/**
	 * Endereço inicial para a pesquisa
	 * @var <string>
	 * @access private
	 */
	private $_queryUrl = 'http://iplocationtools.com/ip_query.php?ip=';

	/**
	 * Objecto de consulta do CURLs
	 * @var <object>
         * @access private
	 */
	private $_ch;

	/**
	 * Dados tratados
	 * @var <array>
	 * @access private
	 */
	private $_data;

	/**
	 * Construtor da Classe, recebe o parrametro <string> format
	 * Caso o paramêtro não seja passado, usa o padrão do sistema
	 * @return <void>
	 */
	public function __construct()
	{
		$this->_ch = curl_init();
	}

	/**
	 * Método que faz a consulta e tratamento dos dados, recebe o ip
	 * a ser consultado como parâmetro
	 * @param $ip
	 * @return <boolean>
	 */
	public function getData($ip)
	{
		if( isset($ip) && !empty($ip) ){
			curl_setopt($this->_ch, CURLOPT_URL, $this->_queryUrl . $ip . '&output=' . $this->_format);
			curl_setopt($this->_ch, CURLOPT_RETURNTRANSFER, 1);
			curl_setopt($this->_ch, CURLOPT_TIMEOUT, 15);

			$request = curl_exec($this->_ch);
			if( isset($request) && !empty($request) ){
				$this->_data = json_decode($request, true);
				return true;
			} else{
				return false;
			}
		} else{
			return false;
		}
	}

	/**
	 * Método utilizado para pegar os dados de _data, caso o keyName seja ignorado, retorna o array inteiro
	 * Aqui eu listo as chaves que podem ser buscadas:
	 * -Ip
	 * -Status
	 * -CountryCode
	 * -CountryName
	 * -RegionCode
	 * -RegionName
	 * -City
	 * -ZipPostalCode
	 * -Latitude
	 * -Longitude
	 * @param $paramName
	 * @return <array> | <string>
	 */
	public function get($keyName='')
	{
		if( isset($keyName) && !empty($keyName) ){
			return $this->_data[$keyName];
		}else{
			return $this->_data;
		}
	}

}

Show, se a classe parece simples, imagine seu uso, abaixo pequeno exemplo:

$gl = new X_Location();
$gl->getData('seuIp');
echo $gl->get('City');
// ou
var_dump($gl->get());

Bom, espero que seja útil a todos, agradeço sua visita!

Doctrine ORM, Parte II

Wednesday, April 29th, 2009

Bom, como prometido, o segundo capitulo da Saga “Doctrine ORM” vou abordar questões simples como o download da ferramenta, “instalação”, e configuração da mesma, deixando a primeira aplicação para o terceiro post, devido sua extensão.

Para baixa o Doctrine ORM é muito simples, basta acessar a página de download oficial, e selecionar a versão desejada, eu aconselho a baixar a última versão stable (atualmente 1.1.0). Após o download, descompacte o arquivo, para o uso em produção você vai precisar somente da pasta lib e de seu conteúdo é claro, tomando como exemplo o ubuntu, vamos criar uma aplicação chamada doctrineTest em /var/www (com as devidas permissões de escrita na pasta):

$ cd /var/www
$ mkdir doctrineTest
# vá até a pasta Dotrine-1.x.x
$ cp -R lib /var/www/doctrineTest
# aproveita e cria o index.php
$ touch index.php
# vamos criar uma classe para autoload
$ cd /var/www/lib
$ mkdir Util
$ touch Autoload.class.php

Justo, agora já temos o inicio de nossa aplicação salva no diretório de site do apache, vamos começar a configuração e a entender tudo isso. Abra seu editor preferido (eclipse no meu caso), abra o arquivo lib/util/autoload.class.php, vamos fazer um pequeno truque para nos livrarmos dos includes.

class Util_Autoload
{
    public function autoload($class)
    {
        $path = str_replace('_', '/', $class) . '.php';
        require_once($path);
        return true;
    }
}

Feito isso, vamos ao nosso index.php, primeiro vamos configurar nosso autoload :)

/* Adicionando a pasta libs ao include_path do php */
$include_path  = get_include_path();
$include_path .= PATH_SEPARATOR . dirname(__FILE__) . '/lib';
set_include_path($include_path);
unset($include_path);

/* registrando nossa classe autoload */
require_once(dirname(__FILE__) . '/lib/Util/Autoload.class.php');
spl_autoload_register(array('Util_Autoload', 'autoload'));

Legal, a essa altura qualquer classe que quisermos carregar dentro de libs estará disponível, agora vamos abrir nossa primeira conexão com o banco de dados (no exemplo MySQL):

$dsn = 'mysql://username:password@127.0.0.1/doctrineTest';
$manager = Doctrine_Manager::getInstance();
$conn = $manager->connection($dsn, 'master');

Bom, agora já conseguimos conectar a aplicação com o banco de dados, para finalizarmos este capitulo vamos fazer um pequeno teste de conexão, certifique-se que o usuário no qual você está conectando tenha permissões de CREATE no banco de dados. Vamos criar uma tabela e depois inserir dados nela:

$conn->export->createTable('teste', array('nome' => array('type' => 'string')));
$conn->execute('INSERT INTO teste (nome) VALUES (?)', array('blogdoxorna'));

Legal, tabela criada, uma linha inserida, agora vamos ler pra ver se é verdade que tá gravando (claro, comentando a linha do create pra não dar pau!) ;)

$st = $conn->prepare('SELECT * FROM teste');
$st->execute();
$resultset = $st->fetchAll();
var_dump($resultset);

O que deve aparecer aí no browser é mais ou menos isso:

array
  0 =>
    array
      'nome' => string 'blogdoxorna' (length=11)
      0 => string 'blogdoxorna' (length=11)

Bom, encerro aqui o meu post, e lembrando que se eu sair vivo do #NOB #TwitteirosDeJoinville no Biergarten, eu posto a terceira parte ainda hoje 29/04 a noite ;)

Clicky Web Analytics