Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

uiLhian

[erro] url amigavel

Recommended Posts

bom estou tendo problemas com a paginação,
pois se eu entro na pagina por exemplo:
http://localhost/portifolio - funciona normal
mas quando vou "paginar" a paginação não funciona.
fica assim:
.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([a-zA-Z0-9_-]+)$ index.php?url=$1&p=$2
</IfModule>

 

index.php

<?php
$url = (isset($_GET['url'])) ? $_GET['url'] : "home";

$file = "$url.php";

if(file_exists($file)){
include($file);
}
else{
require_once("E404.php");
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

RewriteRule ^([a-zA-Z0-9_-]+)$ index.php?url=$1&p=$2

De onde está vindo o $2? Você só tem uma regra ai... e ela só vai pegar o que vem antes do ? Use o QSA, isso vai adicionar a querystring que você está passando direto na URL


RewriteRule ^([a-zA-Z0-9_-]+)$ index.php?url=$1 [QSA]

Compartilhar este post


Link para o post
Compartilhar em outros sites

É só alterar a expressão regular para contemplar a parte da paginação...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo pra que complicar tanto a paginação? seguinte...

arquivo .htaccess

Options +FollowSymLinks
AddDefaultCharset UTF-8

<IfModule mod_rewrite.c>
    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l
    RewriteRule ^(.*)$ index.php?url=$1 [L,QSA]

</IfModule>

veja que a nossa variável que irá receber os valores enviados por get é a "url"

beleza. Agora é preciso criar uma classe pra tratar essa paginação, exemplo:

 

<?php 
	class url{

		public static function verificar_url($url){
			if (substr_count($url, DIRECTORY_SEPARATOR) > 0):
				$explode_url = explode(DIRECTORY_SEPARATOR, $url);
				foreach ($explode_url as $u) :
					if(is_file('inc/'.$u.'.php')):
					require_once 'inc/'.$u.'.php';
					endif;
				endforeach;
			else:
				if (is_file('inc/'.$url.'.php')):
					require_once 'inc/'.$url.'.php';
				else:
					require_once "inc/erro404.php";
				endif;

			endif;



		}

	}

 ?>

suponhamos que todas as páginas que você queira chamar esteja em uma pasta chamada "inc", se não basta tirar o "inc/" ou substituir pelo o nome do diretório que estão as páginas!

 

Você precisará agora configurar o APACHE, terá que liberar nele o module_rewrite

feito isso, ainda no apache, você terá que procurar por esta linha:

<Directory />
    AllowOverride All
    Require all denied
</Directory>

se estiver "AllowOverride None" mude para "All", basta reiniciar o apache.

 

Agora você precisa chamar a sua classe no corpo da sua página:

1º - Suponhamos que você tenha fatiado o seu layout em:

header.php

content.php

footer.php

e na página index.php você está dando um require/include nestas páginas, então ficaria assim:

<php include_once('class/url.php');  //suponhamos que a classe que trata as urls esteja em um diretório chamado "class".
$amigavel = new url(); ?>
<?php require('header.php'); ?>
<?php isset($_GET['url']) ? $amigavel->verificar_url($_GET['url']) : require_once 'content.php'; ?>
<?php require('rodape.php'); ?>

2º - Não tenha fatiado nada... é só chamar a classe no corpo do seu site, por exemplo:

<body>
<?php include_once('class/url.php');
$amigavel = new url();
 isset($_GET['url']) ? $amigavel->verificar_url($_GET['url']) : require_once 'index.php';
 ?>

Pronto! espero ter ajudado, me perdoe por não lhe dá mais detalhes sobre a funcionalidade de cada script!

mas é bastante intuitivo, basta olhar para o código que será fácil de entender!

 

Att.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bruno Rafael segui o que você falou mas ele continua http://localhost/portifolio?p=2 ao invez de http://localhost/portifolio/2

segue o que fiz abaixo:

 

.htaccess

Options +FollowSymLinks
AddDefaultCharset UTF-8

<IfModule mod_rewrite.c>
    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l
    RewriteRule ^(.*)$ index.php?url=$1 [L,QSA]

</IfModule>

 

index.php

<?php class url
{
public static function verificar_url($url)
{
if (substr_count($url, DIRECTORY_SEPARATOR) > 0):
$explode_url = explode(DIRECTORY_SEPARATOR, $url);
foreach ($explode_url as $u) :
if(is_file($u.'.php')):
require_once $u.'.php';
endif;
endforeach;
else:
if (is_file($url.'.php')):
require_once $url.'.php';
else:
require_once "E404.php";
endif;
endif;
}
}

$amigavel = new url();
isset($_GET['url']) ? $amigavel->verificar_url($_GET['url']) : require_once 'home.php';
 ?>

a query da paginação: (portifolio.php)

 

 

<?php
$pagination = new PDO_Pagination( $connection );
$pagination->setSQL("SELECT obraID,obraBAIRRO FROM serviços ORDER BY obraID DESC");
$pagination->setPaginator( 'p' );

$results = $connection->query( $pagination->getSQL() );

IF ($pagination->getTotalOfResults() > 0)
{
foreach ($results->fetchAll(PDO::FETCH_OBJ) as $o)
{
$queryFOTOS = $connection->query(sprintf("SELECT fotoNOME
  FROM fotos 
  WHERE fotoOBRAID = '%s' 
  ORDER BY fotoCAPA ASC", $o->obraID
 ));
IF ($queryFOTOS->rowCount() !== 0)
{
$f = $queryFOTOS->fetch(PDO::FETCH_OBJ);
?>

a function que uso pra paginar

public function printNavigationBar()  
    { 
        $current_page = $this->getCurrentPage();
        $total_of_pages = $this->getTotalOfPages();
        $paginator = $this->getPaginator();
        $query_string = $this->rebuildQueryString( $paginator );
        $range = $this->getRange();
        
        if($this->getTotalOfResults() > 0) {         
            print "<ul class=\"pagination pagination-sm titill pull-right\">"; 
            if ( $current_page > 1 ) { 
                print "<li><a href=\"?" . $paginator . "=1"  
                        . $query_string 
                        . "\" class=\"azu\">primeira</a></li> "; 
                $previous = $current_page - 1; 
            } 
             
            for ( 
                $x = ( $current_page - $range ); 
                $x < ( ( $current_page + $range ) + 1 ); 
                $x++ 
            ) { 
                if ( ( $x > 0 ) && ( $x <= $total_of_pages ) ) {
                    if ( $x == $current_page ) { 
                        print "<li class=\"active\"><span>$x <span class=\"sr-only\">(ativo)</span></span></li>"; 
                    } else { 
                        print "<li><a href=\"?" . $paginator . "=" . $x 
                              . $query_string . "\">$x</a></li> "; 
                    } 
                } 
            } 
             
            if ( $current_page != $total_of_pages ) { 
                $next = $current_page + 1; 
                print "<li><a href=\"?" . $paginator . "=" 
                        . $total_of_pages . $query_string 
                        . "\" class=\"red\">última</a></li>"; 
            } 
            print '</ul>';             
        }     
    }

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

aqui você fala ?


 

<?php
class url
{
public static function verificar_url($url)
{
if (substr_count($url, DIRECTORY_SEPARATOR) > 0):
$explode_url = explode(DIRECTORY_SEPARATOR, $url);
foreach ($explode_url as $u) :
if(is_file($u.'.php')):
require_once $u.'.php';
endif;
endforeach;
else:
if (is_file($url.'.php')):
require_once $url.'.php';
else:
require_once "E404.php";
endif;
endif;
}
}

$amigavel = new url();
isset($_GET['url']) ? $amigavel->verificar_url($_GET['url']) : require_once 'home.php';
 ?>

 

else:
if (is_file($url.'.php')):
require_once $url.'.php';

?

desculpa mas é que não manjo mesmo :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

relaxa, é assim mesmo... este script ai vai verificar se o diretorio e o arquivo existem caso contrário ele irá direcionar a uma pagina de erro, e também se o houver mais de 1 diretorio em questão, ele irá tratá-los.

 

suponha que você tenha um arquivo chamado portifolio.php dentro do seguinte diretorio:

 

/inc/diversos/portifolio.php

 

então a sua URL ficaria assim:

 

http://seusite.com/inc/diversos/portifolio

 

no caso citado por você, você quer que apareça assim: http://seusite.com/portifolio/2

 

então você teria que ter o arquivo 2.php dentro da sua pasta portifolio.

 

entendeu? quando vc acionasse o link <a href="http://seusite.com/potifolio/2"> então ele irá verificar se este arquivo existe. se não existe ele vai te voltar a pagina de erro.php que você criou!

 

PS: Eu te sugiro testar primeiramente a URL AMIGAVEL, se estiver funcionando é só você adequar ao seu script de paginação! ^_^

Compartilhar este post


Link para o post
Compartilhar em outros sites

então funcionando está pois eu fiz os teste aqui /home, /portifolio, /teste me retorno a pagina de erro e tal...

tipo o portifolio seria um arquivo portifolio.php que ta na raiz junto com os outros arquivos e esse "?p=2" que me refiro seria a "pagina 2", "pagina 3", "pagina 4" e assim por diante... e gostaria que aparecesse portifolio/2, portifolio/3 etc...

 

ae no caso a alteração teria que ser feita aqui ?

 

public function printNavigationBar()  
    { 
        $current_page = $this->getCurrentPage();
        $total_of_pages = $this->getTotalOfPages();
        $paginator = $this->getPaginator();
        $query_string = $this->rebuildQueryString( $paginator );
        $range = $this->getRange();
        
        if($this->getTotalOfResults() > 0) {         
            print "<ul class=\"pagination pagination-sm titill pull-right\">"; 
            if ( $current_page > 1 ) { 
                print "<li><a href=\"?" . $paginator . "=1"  
                        . $query_string 
                        . "\" class=\"azu\">primeira</a></li> "; 
                $previous = $current_page - 1; 
            } 
             
            for ( 
                $x = ( $current_page - $range ); 
                $x < ( ( $current_page + $range ) + 1 ); 
                $x++ 
            ) { 
                if ( ( $x > 0 ) && ( $x <= $total_of_pages ) ) {
                    if ( $x == $current_page ) { 
                        print "<li class=\"active\"><span>$x <span class=\"sr-only\">(ativo)</span></span></li>"; 
                    } else { 
                        print "<li><a href=\"?" . $paginator . "=" . $x 
                              . $query_string . "\">$x</a></li> "; 
                    } 
                } 
            } 
             
            if ( $current_page != $total_of_pages ) { 
                $next = $current_page + 1; 
                print "<li><a href=\"?" . $paginator . "=" 
                        . $total_of_pages . $query_string 
                        . "\" class=\"red\">última</a></li>"; 
            } 
            print '</ul>';             
        }     
    }

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom, você teria que ter estes arquivos: 2.php, 3.php, 4.php pra que seja direcionado corretamente na URL, no caso o link não há a necessidade de você por "?p=2" apenas direciona pro caminho mesmo, exemplo: "portifolio/2" e pronto ele já vai ler o arquivo.

 

se tratando de paginção e se você não quiser mexer no seu script de paginação e nem ter que adicionar os arquivos dentro da pasta como citei, você terá apenas que ajeitar a sua expressão regular no .htaccess, procura na internet sobre "expressões regulares .htaccess", pra você entender melhor e fazer uma que se adeque ao seu script de paginação, pois o que lhe enviei, é de arquivos e não de paginação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

então pesquisando na net consegui chegar no seguinte resultado:

Options +FollowSymLinks
AddDefaultCharset UTF-8

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule ^([a-zA-Z0-9_-]+)$ index.php?url=$1
RewriteRule ^([a-zA-Z0-9_-]+)/$ index.php?url=$1

RewriteRule ^([a-zA-Z0-9_-]+)/([0-9]+)$ index.php?url=$1&p=$2
RewriteRule ^([a-zA-Z0-9_-]+)/([0-9]+)/$ index.php?url=$1&p=$2
</IfModule>

aparentemente esta funcionando

coloco na barra de endereço http://localhost/portifolio/5 ele pula pra pagina cinco normal...

agora precisava de um empurrãozinho para adaptar a function da paginação.

pra quando eu clicar na "pagina" desejada abrir http://localhost/portifolio/paginaNUMERO

 

public function printNavigationBar()  
    { 
        $current_page = $this->getCurrentPage();
        $total_of_pages = $this->getTotalOfPages();
        $paginator = $this->getPaginator();
        $query_string = $this->rebuildQueryString( $paginator );
        $range = $this->getRange();
        
        if($this->getTotalOfResults() > 0) {         
            print "<ul class=\"pagination pagination-sm titill pull-right\">"; 
            if ( $current_page > 1 ) { 
                print "<li><a href=\"?" . $paginator . "=1"  
                        . $query_string 
                        . "\" class=\"azu\">primeira</a></li> "; 
                $previous = $current_page - 1; 
            } 
             
            for ( 
                $x = ( $current_page - $range ); 
                $x < ( ( $current_page + $range ) + 1 ); 
                $x++ 
            ) { 
                if ( ( $x > 0 ) && ( $x <= $total_of_pages ) ) {
                    if ( $x == $current_page ) { 
                        print "<li class=\"active\"><span>$x <span class=\"sr-only\">(ativo)</span></span></li>"; 
                    } else { 
                        print "<li><a href=\"?" . $paginator . "=" . $x 
                              . $query_string . "\">$x</a></li> "; 
                    } 
                } 
            } 
             
            if ( $current_page != $total_of_pages ) { 
                $next = $current_page + 1; 
                print "<li><a href=\"?" . $paginator . "=" 
                        . $total_of_pages . $query_string 
                        . "\" class=\"red\">última</a></li>"; 
            } 
            print '</ul>';             
        }     
    }

desde ja muito obrigado...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, vamos lá... primeiro deixe o seu .htaccess assim:

Options +FollowSymLinks
AddDefaultCharset UTF-8

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule ^([a-zA-Z0-9_-]+)$ index.php?url=$1 [L,QSA]

</IfModule>

verifique se está funcionando, se estiver iremos mudar o seu script de paginação.

Compartilhar este post


Link para o post
Compartilhar em outros sites
adiciona está linha embaixo da expressão:
RewriteRule ^([a-zA-Z0-9_-]+)$ index.php?url=$1 [L,QSA]

 

ficando assim:

 

RewriteRule ^([a-zA-Z0-9_-]+)$ index.php?url=$1 [L,QSA]
RewriteRule ^([a-zA-Z0-9_-]+)/$ index.php?url=$1 [L,QSA]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já fez os testes, está tudo funcionando normal né?! bom pra eu te ajudar na função, você terá que me mostrar toda ela... pois não estou vendo os valores setados pelas variaveis lá.... a principio você só terá que mudar na URL (<a href="">) da função, para não ficar

 

?$paginator=1 

 

por exemplo. Então, preciso ver todo o codigo!

Compartilhar este post


Link para o post
Compartilhar em outros sites

class.pagination.php

class PDO_Pagination {


    private $_connection;
    private $_paginator = 'page';
    private $_sql;
    private $_limit_per_page = 6;
    private $_range = 3;


    public function __construct( $connection ) 
    {
        $this->setConnection( $connection );
        $this->getPager();
    }
    
    public function getTotalOfResults() 
    {
        $result = $this->_connection->query(
            str_replace( '*', 'COUNT(*)', $this->_sql )
        );


        return (int) $result->fetchColumn();
    }


    private function setConnection( $connection ) 
    {
        if ( $connection instanceof PDO ) {
            $this->_connection = $connection;
        } else {
            throw new Exception('THIS DEPENDENCY NEEDS A PDO OBJECT');
        }
    }


    public function printNavigationBar()  
    { 
        $current_page = $this->getCurrentPage();
        $total_of_pages = $this->getTotalOfPages();
        $paginator = $this->getPaginator();
        $query_string = $this->rebuildQueryString( $paginator );
        $range = $this->getRange();
        
        if($this->getTotalOfResults() > 0) {         
            print "<ul class=\"pagination pagination-sm titill pull-right\">"; 
            if ( $current_page > 1 ) { 
                print "<li><a href=\"?" . $paginator . "=1"  
                        . $query_string 
                        . "\" class=\"azu\">primeira</a></li> "; 
                $previous = $current_page - 1; 
            } 
             
            for ( 
                $x = ( $current_page - $range ); 
                $x < ( ( $current_page + $range ) + 1 ); 
                $x++ 
            ) { 
                if ( ( $x > 0 ) && ( $x <= $total_of_pages ) ) {
                    if ( $x == $current_page ) { 
                        print "<li class=\"active\"><span>$x <span class=\"sr-only\">(ativo)</span></span></li>"; 
                    } else { 
                        print "<li><a href=\"?" . $paginator . "=" . $x 
                              . $query_string . "\">$x</a></li> "; 
                    } 
                } 
            } 
             
            if ( $current_page != $total_of_pages ) { 
                $next = $current_page + 1; 
                print "<li><a href=\"?" . $paginator . "=" 
                        . $total_of_pages . $query_string 
                        . "\" class=\"red\">última</a></li>"; 
            } 
            print '</ul>';             
        }     
    }     
    
    public function getTotalOfPages() 
    {        
        return ceil( $this->getTotalOfResults() / $this->getLimitPerPage() );
    } 


    public function getCurrentPage() 
    { 
        $total_of_pages = $this->getTotalOfPages();
        $pager = $this->getPager();
        
        if ( isset( $pager ) && is_numeric( $pager ) ) {          
            $currentPage = $pager; 
        } else { 
            $currentPage = 1; 
        } 


        if ( $currentPage > $total_of_pages ) { 
            $currentPage = $total_of_pages; 
        } 


        if ($currentPage < 1) { 
            $currentPage = 1; 
        } 


        return (int) $currentPage; 
    } 


    private function getOffset() 
    {       
         return  ( $this->getCurrentPage() - 1 ) * $this->getLimitPerPage();  
    } 
    
    public function setSQL( $string ) 
    {
        if ( strlen( $string ) < 0 ) {
            throw new Exception( "THE QUERY NEEDS A SQL STRING" );
        } 
        
        $this->_sql = $string;
    }


    public function getSQL() 
    {
        $limit_per_page = $this->getLimitPerPage();
        $offset = $this->getOffset();
        
        return $this->_sql .  " LIMIT {$limit_per_page} OFFSET {$offset} "; 
    }


    public function setPaginator( $paginator ) 
    {
        if( !is_string( $paginator ) ) {
            throw new Exception("PAGINATOR MUST BE OF TYPE STRING");
        } 
        
        $this->_paginator = $paginator;
    }


    private function getPaginator()
    {
        return $this->_paginator;
    }


    public function getPager() 
    {
         return ( isset ( $_REQUEST["{$this->_paginator}"] ) )  
                ? (int) $_REQUEST["{$this->_paginator}"]  
                : 0 
        ;  
    }


    public function setLimitPerPage( $limit ) 
    {
        if( !is_int( $limit ) ) {
            throw new Execption( "THE LIMIT MUST BE AN INTEGER" );
        }
        
        $this->_limit_per_page = $limit;
    }


    public function getLimitPerPage() 
    {
        return $this->_limit_per_page;
    }


    public function setRange( $range ) 
    {
        if( !is_int( $range ) ) {
            throw new Execption( "THE RANGE MUST BE AN INTEGER" );
        }
        
        $this->_range = $range;
    }


    public function getRange() 
    {
        return $this->_range;
    }


    public function rebuildQueryString ( $query_string ) 
    { 
        $old_query_string = $_SERVER['QUERY_STRING'];
        
        if ( strlen( $old_query_string ) > 0 ) { 
            
            $parts = explode("&", $old_query_string ); 
            $new_array = array();
            
            foreach ($parts as $val) { 
                if ( stristr( $val, $query_string ) == false)  { 
                    array_push( $new_array , $val ); 
                } 
            } 
            
            if ( count( $new_array ) != 0 ) { 
                $new_query_string = "&".implode( "&", $new_array ); 
            } else { 
                return false; 
            }
            
            return $new_query_string;
            
        } else { 
            return false; 
        } 
    }     
}

trecho do código que usado a class (portifolio.php)

 

{
$pagination = new PDO_Pagination( $connection );
$pagination->setSQL("SELECT obraID,obraBAIRRO FROM obras ORDER BY obraID DESC");
$pagination->setPaginator( 'p' );

$results = $connection->query( $pagination->getSQL() );


IF ($pagination->getTotalOfResults() > 0)
{
foreach ($results->fetchAll(PDO::FETCH_OBJ) as $o)
{
$queryFOTOS = $connection->query(sprintf("SELECT fotoNOME
  FROM fotos 
  WHERE fotoOBRAID = '%s' 
  ORDER BY fotoCAPA ASC", $o->obraID
 ));
IF ($queryFOTOS->rowCount() !== 0)
{
$f = $queryFOTOS->fetch(PDO::FETCH_OBJ);
?>

 

 

 

  Em 29/10/2013 at 18:16, Bruno RafaeI disse:

Já fez os testes, está tudo funcionando normal né?! bom pra eu te ajudar na função, você terá que me mostrar toda ela... pois não estou vendo os valores setados pelas variaveis lá.... a principio você só terá que mudar na URL (<a href="">) da função, para não ficar

 

?$paginator=1 

 

por exemplo. Então, preciso ver todo o codigo!

 

 

então mesmo depois de ter adicionado a "segunda" linha conforme você mencionou,

coloco na barra de endereço http://localhost/site/portifolio/2 e não funciona.

se foi isso que você quis dizer...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos modificar e tentar adequar... mude para isto:

 if($this->getTotalOfResults() > 0) {         
            print "<ul class=\"pagination pagination-sm titill pull-right\">"; 
            if ( $current_page > 1 ) { 
                print "<li><a href=\"http://localhost/site/portifolio/1\" class=\"azu\">primeira</a></li> "; 
                $previous = $current_page - 1; 
            } 
             
            for ( 
                $x = ( $current_page - $range ); 
                $x < ( ( $current_page + $range ) + 1 ); 
                $x++ 
            ) { 
                if ( ( $x > 0 ) && ( $x <= $total_of_pages ) ) {
                    if ( $x == $current_page ) { 
                        print "<li class=\"active\"><span>$x <span class=\"sr-only\">(ativo)</span></span></li>"; 
                    } else { 
                        print "<li><a href=\"http://localhost/site/portifolio/".$x."\">$x</a></li> "; 
                    } 
                } 
            } 
             
            if ( $current_page != $total_of_pages ) { 
                $next = $current_page + 1; 
                print "<li><a href=\"http://localhost/site/portifolio/".$total_of_pages."\" class=\"red\">última</a></li>"; 
            } 
            print '</ul>';             
        }     
    }     

faça o teste!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.