Arquivo para a ‘ PHP ’ Categoria

Url amigável

Bom, sempre procurei na net uma solução para url amigável, e nunca encontrei uma forma que me atendesse, então resolvi estudar como os Frameworks fazem. Bom, tive vários problemas para adptar uma melhor forma, pois, em meus projetos costumo usar uma estrutura bem simples e de fácil manutenção.

Exemplo da estrutura que costumo usar:

Projeto
- app
  - controller
  - model
  - view
- public
  - images
  - css
  - js
- config
- index.php

Bom trabalho com MVC, portanto, minha URL é assim:
- http://meusite.com/controller/action/param/value/params/value
- http://meusite.com/controller/param/value/param2/value
- http://meusite.com/controle/?param=value

Vou mostar a simplicidade que alcancei:
- Precisamos que o módulo mod_rewrite esteja habilitado no servidor;
- Que seja possível o uso do arquivo .htaccess (que será criado na raiz da aplicação)
- Criar um arquivo .php que vai ser o gerenciador da sua Url.

Vamos primeiro pelo htaccess.

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$                   index.php?$1     [QSA]

Agora o aquivo que vai gerenciar a url passada pelo usuário ou pelo proprio sistema:

class ControleURI
{
    public static $control;
    public static $action;
    public static $file;
    public static $params = array();

    public static function getURI()
    {
    	$caminhos = array();

    	if($_SERVER['QUERY_STRING'] != "") {
    	   $caminhos = explode("/",$_SERVER['QUERY_STRING']);
    	}

    	$action = false;
        foreach($caminhos as $key => $caminho)
        {
        	if($key == 0)
        	{
        		// Verifico se existe um controle
        		if (class_exists("Controle" . ucfirst($caminho))) {
        			self::$params['control'] = $caminho;
					self::$control = $caminho;

        		} else {
        			self::$params['control'] = "Index";
					self::$control = 'Index';
        		}
        	}
        	if($key == 1)
        	{
        		// Verifico se existe o metodo
        		if (method_exists("Controle" . ucfirst(self::$control), $caminho))
        		{
                    self::$params['action'] = $caminho;
                    self::$action = $caminho;
                    $action = true;
                } else {
                	self::$params['action'] = "index";
                    self::$action = "index";
                }
        	}

        	if(!$action)
        	{
        		if($key % 2 != 0)
        		{
        			if(isset($caminhos[$key+1]))
        				self::$params[$caminhos[$key]] = $caminhos[$key+1];
        		}
        	}
        	else if($key > 1 && !empty($caminhos[$key+1]))
        	{
        		if($key % 2 == 0)
        		{
        			if(isset($caminhos[$key+1]))
        				self::$params[$caminhos[$key]] = $caminhos[$key+1];
        		}
        	}
        }

        if (isset(self::$params["control"])) {
            self::$control = self::$params["control"];
        } else if (isset($_REQUEST["control"])) {
            self::$control = $_REQUEST["control"];
        } else {
            self::$control = "Index";
        }

        if (isset(self::$params["action"])) {
            self::$action = self::$params["action"];
        } else if (isset($_REQUEST["action"])) {
            self::$action = $_REQUEST["action"];
        } else {
            self::$action = "index";
        }

        // Verifico se foi passado algum arquivo
        if(isset($_FILES)) {
            self::$file = $_FILES;
        }

        // verificamos se existe os params, se sim faz um merge com os dados passados via post.
   		$parametros = array_pop($caminhos);
    	foreach(explode("&", $parametros) as $parametro) {
            $parametro = explode("=", $parametro);
            if(isset($parametro[1])) {
                self::$params[$parametro[0]] = $parametro[1];
            }
        }

        foreach($_REQUEST as $key => $value)
        {
        	if(!empty($value))
        	{
        		$param[$key] = $value;
        	}
        }
        self::$params = array_merge(self::$params, $param);
    }

    public static function getUrlBase()
    {
        return preg_replace('#/[^/]+\.php5?$#', '', $_SERVER['SCRIPT_NAME']);
    }
}

Agora falta pouco, só precisamos chamar o método no arquivo de configuração ou no index (eu chamo no index por utilizar essa estrutura para criar sites e/ou blogs).

ini_set("display_errors", "on");
date_default_timezone_set('America/Sao_Paulo');

ControleURI::getURI();
// aqui abaixo faço outros includes /requires

Com isso conseguimos fazer com que a url fique de forma amigável e de simples manipulação.
Essa foi a forma que encontrei para atender minha necessidade. Se tiverem algo que possa melhorar ou até mesmo implementar novos tratamentos, fiquem à vontade.
Aguardo sugestões, críticas etc.
#FicaDica

Symfony + Doctrine + Postgres + Sequence com erro

Olá,

Hoje passei por um problema muito estranho com a Doctrine e o Postgres, quando eu estava configurando um projeto que vai usar como banco de dados o Postgres, até ai tudo ok, configuração de conexão, gerador de código etc.
Quando fui testar os Forms gerado pela doctrine percebi que quando eu estava inserindo un novo registro, a Doctrine gerava Doctrine_Sequence_Exception: on demand sequence “table_name_seq” could not be created.

Bom depois de quebrar a cabeça por muito tempo, levando em consideração (criação de novo banco, nova sequence etc) achei um post na net falando sobre tal bug na Doctrine com campos Serial do Postgres e uma possível solução. Testei e deu certo, então resolvi postar aqui para mais alguém que está com o mesmo erro.

O arquivo a ser alterado: /lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Sequence/Pgsql.php

Na linha onde tem:

$sequenceName = $this->conn->quoteIdentifier($this->conn->formatter->getSequenceName($seqName), true);
$query = "SELECT NEXTVAL('" . $sequenceName . "')";

Substitua por:

//$sequenceName = $this->conn->quoteIdentifier($this->conn->formatter->getSequenceName($seqName), true);
$query = "SELECT NEXTVAL('" . $seqName . "')";

Fazendo isso vai funcionar perfeitamente, pelo menos aqui funcionou.

Bom espero que isso ajude mais alguém.

Fazendo upload de arquivos GRANDES

Bom estive com um problema em um sistema que estava desenvolvendo que era enviar arquivos
maiores que 8Mb para o servidor.

Pensei em alteras as configurações do servidor para que o script funciona-se corretamente, mas
o pessoal do suporte me informou que não seria possível pois o servidor não era dedicado e bla bla bla.

Então resolvi fazer o seguinte:

<?php
    ini_set("set_time_limit",  '0');
    ini_set('post_max_size', '150M');
    ini_set('upload_max_filesize', '100M');
?>

Pensei que tinha resolvido o problema com essas configurações mas nada tinha acontecido.
então pesquisando um pouco na net, achei a solução para meu problema.

Passo 1:
Criar um arquivo .htaccess e colocar na raiz do sistema ou na pasta onde está o script de upload.

Passo 2:
Copie esse codigo e cole no arquivo.

php_value memory_limit 300M
php_value post_max_size 150M
php_value upload_max_filesize 100M
php_value max_execution_time 1800
php_value session.gc_maxlifetime 3600

Agora vou explicar cada linha para vocês entenderem melhor.

O parametro: memory_limit, define a qauntidade máxima de memória em bytes que um script pode alocar, seu padrão é “128M”, estamos alterando para “300M”, mas se precisar pode liberar mais memória para o script.

O parametro: post_max_size, define o tamanho máximo dos dados a ser enviados via POST, por padrão o tamanho máximo é de “8M”.

O parametro: upload_max_filesize, define o tamanho máximo do arquivo que você poderá fazer upload, seu tamanho padrão é de “2M”.

O parametro: max_execution_time, define em segundos o tempo máximo de execução de um script, o tempo padrão é de 30 segundos, estou especificando 30 minutos, é meio exagerado mas estou levando em conta as conexões discadas que ainda existem.

O parametro: session.gc_maxlifetime, especifica também em segundos o tempo de vida da sessão, após isso ela é limpada. O padrão é de 24 minutos ou 1440 segundos, estou alterando aqui para 1 hora para não ter problemas quando for executar o script de upload.

Prontinho, agora você poderá enviar arquivos para seu servidor sem problemas, sem precisar pedir para o pessoal do suporte para alterar as configurações do servidor.
Espero ter ajudado, até a próxima.

Remover acentos e caracteres especiais de string

Olá, hoje irei compartilhar uma função que é bastante usada quando faço upload de arquivos, onde eu tenho que tratar os nomes dos arquivos enviados para o servidor.
Então vamos la para a função.

<?php
/**
	 * Função para retirar acentos, caracteres especiais de uma string
	 * @param $string
	 * @return $string
	 */
	function removerCaracter($string){
	    $string = ereg_replace("[áàâãª]","a",$string);
	    $string = ereg_replace("[ÁÀÂÃ]","A",$string);
	    $string = ereg_replace("[éèê]","e",$string);
	    $string = ereg_replace("[ÉÈÊ]","E",$string);
	    $string = ereg_replace("[íì]","i",$string);
	    $string = ereg_replace("[ÍÌ]","I",$string);
	    $string = ereg_replace("[óòôõº]","o",$string);
	    $string = ereg_replace("[ÓÒÔÕ]","O",$string);
	    $string = ereg_replace("[úùû]","u",$string);
	    $string = ereg_replace("[ÚÙÛ]","U",$string);
	    $string = ereg_replace("ç","c",$string);
	    $string = ereg_replace("Ç","C",$string);
	    $string = ereg_replace("[][><}{)(:;,!?*%~^`&#@]","",$string);
	    $string = ereg_replace(" ","_",$string);

	    return $string;
	}
?>

Agora vou mostrar como utilizar a mesma.

<?php
      $string = "Vamor remover os acentos á Á é É e ç";
      echo removerCaracter($string);

      // saida
     Vamos_remover_os_acentos_a_A_e_E_e_c
?>

Percebam que os acentos foram removidos e os espaços foram substituidos por underline.

Bom espero que tenham gostado. Qualquer dúvida, sugestão, reclamação ou qualquer outro assunto estarei a disposição.

Abraços a todos.

Convertendo data com php

Hoje irei postar uma função que uso diariamente. Lembro quando não tinha pensado em nada ainda, como que era dificíl pegar uma data pradrão americano e converter para padrão português. Fazia esse processo para visualizar e para gravar no banco. Mas deixei um pouco a preguiça de lado e fiz uma função bem simples que faz essa conversão de datas.

Segue o codigo:

<?php
    /**
    * Função para converter data
    *
    * @param $data
    * @return $data
    */
    function converterData($data)
    {
        if(substr($data,2,1) == "/")
        {
            $dd = substr($data, 0,2);
            $mm = substr($data, 3,2);
            $aa = substr($data, 6,4);
            $time = substr($data, 11,8);
            if($time != "")
                $data = $aa."-".$mm."-".$dd." ".$time;
            else
                $data = $aa."-".$mm."-".$dd;
        }
        else
        {
            $dd = substr($data, 8,2);
            $mm = substr($data, 5,2);
            $aa = substr($data, 0,4);
            $time = substr($data, 11,8);
            if($time != "")
                $data = $dd."/".$mm."/".$aa." ".$time;
            else
                $data = $dd."/".$mm."/".$aa;
        }
        if($data=='//')
        {
            $data = '';
        }
        return $data;
    }

Simples não?
Vou mostrar como aplicar no seu codigo:

<?php
    $data = "2009-07-08";
    echo converterData($data);
    // saida
    08/07/2009

    $data = "08/07/2009";
    echo converterData($data);
    // saida
    2009-07-08
?>

Caso encontre algum erro ou tenha alguma sugestão de como poder melhorar, poste ai para conversar-mos um pouco. Abraços e até a proxima.

Resumindo textos

Bom, hoje vou postar uma função que me ajudou bastante em um projeto que fazia parte. A função serve para resumir texto de acordo com a quantidade de caracteres que você desejar.

<?php
/**
* Função para resumir textos
*
* @param $str
* @param $n
* @param $delim
* @return $str
*/
function resumo($str, $n, $delim='...')
{
    $len = strlen($str);
    if ($len > $n)
    {
        preg_match('/(.{' . $n . '}.*?)\b/', $str, $matches);
        $str = rtrim($matches[1]) . $delim;
        return $str;
    }
    else
    {
        return $str;
    }
}
?>

Como aplicar a função no seu código:

<?php
    $string = "Marcelo Bento da Rocha.";
    echo resumo($string, 7);

    // resultado
    Marcelo...
?>

Bom espero que essa função ajude alguém. Qualquer dúvida, sugestão e crítica favor postar.
Abraços e até a próxima.

Primerio Post

Bom, para meu primeiro post vou falar um pouco o que vocês vão encontrar aqui.
Pretendo divulgar minhas idéias (principalmente sobre PHP), minhas discobertas, dúvidas etc.
Como de costume vou ensinar como imprimir um Hello World em php.  :)

<?php
    echo "Hello World";
?>