Ir para conteúdo
  • 0
TUAN

URL AMIGAVÉL

Pergunta

OLA PESSOAL ALGUEM AI PODERIA ME DAR UMA EXPLICAÇÃO BEM SIMPLES E FACIL DE MIM
COMPREENDER DE COMO FAZER A URL AMIGAVEL PARA ESTE MEU SISTEMA

 A URL DELE ESTA :
 
minhaloja.com/produtos/catalogo.php?id=200

quero que ele fica assim

minhaloja.com/produtos/HD-SAMSUNG-500-GB
       

            OU

UM DESTE DOIS
minhaloja.com/produtos/HD-SAMSUNG-500-GB.html


minhaloja.com/produtos/200/HD-SAMSUNG-500-GB



eu ja olhei varios tuturial 

mais aind fiquei meio perdido
ou seja perdido

de como montar eles em cada parte, deste do CLICAR NA IMAGEM E DIRECIONAR ELE PARA A PAGINA Q ESTA O catalogo.php para gera a  URL AMIVAGEL

PEGUEI ESTA BASE AQUI DA INTERNET
  MAIS NAO CONEGUE MONTAR ELE CERTO SEMPRE DA ERRO ELE NAO PUXA NADA DO DB...

// ----------- URL AMIVAGEL DA INTERNET ---- ESTE E O LINK DA PAGINA https://www.webdevbr.com.br/urls-amigaveis-com-php-htaccess-apache-e-nginx //////////////

//configuro os formatos de URL que eu quero
$route->add('/{prefix}/{modulo}{acao}/{id}');
$route->add('/{modulo}/{id}/{titulo}');
$route->add('/{titulo}');

//pego as informações da URL
$params = $route->params($url);

if (isset($params['prefix']) and $params['prefix'] == 'admin') {
    //logica para carregar a administração do site
    //posso usar includes ou autoload, ou o que quiser
    include 'carrega_admin.php';
    die();
}

$modulos_disponiveis = [
    'categorias',
    'paginas',
    'usuarios'
];

if (isset($params['modulo']) and in_array($params['modulo'], $modulos)) {
    //logica para carregar um modulo do site
    //(listagem de categorias por exemplo)
    include 'carrega_modulo.php';
    die();
}

if (isset($params['titulo'])) {
    //logica para carregar paginas do site
    //(página de contato por exemplo)
    include 'carrega_pagina.php';
    die();
}

echo 'Página não encontrada';


Este seria um arquivo "bootstrap" do site, ou seja, iria carregar a aplicação, cada item entre chaves ({}) nas rotas se torna um nó no array $params, assim na linha abaixo:


$route->add('/{prefix}/{modulo}{acao}/{id}');
Teriamos um array neste formato:

$params['prefix'];
$params['modulo'];
$params['acao'];
$params['id'];
Muito mais simples de trabalhar não?

O $SERVER['PATHINFO']
Pra encontrar a URL vamos usar $_SERVER['PATH_INFO'] em vez de GET, no exemplo acima teriamos:

$url = '/';
if (isset($_SERVER['PATH_INFO']))
    $url = $_SERVER['PATH_INFO'];

//configuro os formatos de URL que eu quero
$route->add('/{prefix}/{modulo}{acao}/{id}');
$route->add('/{modulo}/{id}/{titulo}');
$route->add('/{titulo}');


//pego as informações da URL
$params = $route->params($url);

//restante do código
A variável $_SERVER['PATH_INFO'] retorna todo valor digitado usando '/' após um arquivo PHP, por exemplo:

www.seusite.com.br/index.php/categorias/1
Neste caso teriamos /categorias/1 como valor de $_SERVER['PATH_INFO'], acontece que se nada for passado a variável não existe, por isso passei um valor padrão $url = '/'; e verifiquei a existência com isset() logo na sequência.

Mas e essa classe $route, como ela funciona?

Trabalhando com as rotas
Eu criei um arquivo em src/Router/Router.php com o seguinte conteúdo:



<?php

namespace WebDevBr\Router;

class Router
{
    private $routes = [];

    /**
     * Adiciona uma nova rota
     *
     * @param String $route
     */
    public function add($route)
    {
        preg_match_all('{\{[a-z][a-zA-Z0-9_]*}', $route, $variable);
        preg_match_all('{[^\{][a-z][a-zA-Z0-9_]*}', $route, $static);

        $variable[0] = $this->trimArray('{', $variable[0]);
        $static[0] = $this->trimArray('/', $static[0]);

        $this->routes[$route]['variable'] = $variable[0];
        $this->routes[$route]['static']['order'] = $static[0];
        $this->routes[$route]['static']['values'] = array_diff($static[0], $variable[0]);
    }

    /**
     * Retorna os parâmetros configurados da rota
     * Ou null caso não seja encontrada uma rota válida
     *
     * @param  String $url [description]
     */
    public function params($url)
    {
        $result = [];
        $clean = ltrim ($url, '/');
        $params = explode('/', $clean);

        foreach ($this->routes  as $route) {
            $params = array_diff($params, $route['static']['values']);
            if (count($params) == count($route['variable'])) {
                return array_combine($route['variable'], $params);
            }
        }
    }

    /**
     * Remove um ou mais caracteres de strings em um array
     * em um ambiente ideal isso seria um trait ou arquivo
     * de funções
     */
    protected function trimArray($str, $data)
    {
        $array_fill = array_fill(0, count($data), $str);

        return array_map(
            function($v, $str) {return ltrim($v, $str);},
            $data,
            $array_fill
        );
    }
}

Tentei manter o código o mais limpo possível, Nosso exemplo completo com o carregamento do nosso novo objeto.

//Carrego minha classe Router
include __DIR__.'src/Router/Router.php';
$route = new WebDevBr\Router\Router;

$url = '/';
if (isset($_SERVER['PATH_INFO']))
    $url = $_SERVER['PATH_INFO'];

//configuro os formatos de URL que eu quero
$route->add('/{prefix}/{modulo}{acao}/{id}');
$route->add('/{modulo}/{id}/{titulo}');
$route->add('/{titulo}');


//pego as informações da URL
$params = $route->params($url);

//restante do código
Prontinho, nosso exemplo agora deve funcionar.

Removendo a index.php da URL
Com Apache e Htaccess:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>
Com Nginx:

location / {
    try_files $uri $uri/ /index.php?$args;
}

O PHP Built-in Server não precisa de nenhuma configuração especial, ele já trabalha corretamente se omitirmos a index.php da rota.
  
  


// --------- ESTE É SYS.PHP --------- /////////
      <!--- ENVIANDO OS DADOS DA TABELA PARA O CATALOGO.PHP --->
<?php
    require_once 'database/DB.php';
    require_once 'database/class.php';

    $con = new conexao(); 
    $con->connect(); 
    $getId = $_GET['id']; 
    if($getId){ //se existir recupera os dados e tras os campos preenchidos
        $consulta = mysql_query("SELECT * FROM produtos WHERE  id = + $getId");
        $dados = mysql_fetch_array($consulta);

//Busca na tabela o numero de vezes que a página ja foi visitada
$busca = "Select * FROM produtos WHERE id = {$getId}";
$exe = mysql_query($busca);

$resultado = (mysql_fetch_array($exe));

//Pega o numero de visistas que consta na tabela, adiciona mais um e atualiza
$visitantes = $resultado['visitas'] + 1;
$altera = "UPDATE produtos SET visitas = '{$visitantes}' WHERE id = '{$getId}'";
$exe1 = mysql_query($altera);

//Faz uma nova busca e retorna o numero de visitas depois da atualização
$exe = mysql_query($busca);
$total = (mysql_fetch_array($exe));
$visitas = $total['visitas'];

    }
    
       if(isset ($_POST['editar'])){ // Edita 
        $nome = $_POST['nome']; // NAME
        $telefone = $_POST['telefone']; // NAME
		$facebook = $_POST['facebook']; // NAME
		$cargo = $_POST['cargo']; // NAME
		$valor = $_POST['valor']; 
		$data1 = $_POST['data1']; 
		$categoria = $_POST['categoria'];
		$post = $_POST['post'];
		$cliente = $_POST['cliente']; // NAME
		$imagem = $_POST['imagem'];
        $visitas = $_POST['visitas'];
		$mapa = $_POST['mapa'];  
		$descricao = $_POST['descricao']; 
        $crud = new crud('produtos'); // instancia classe com as operaçoes crud, passando o nome da tabela como parametro
		$crud->atualizar("nome='$nome',telefone='$telefone',facebook='$facebook',cargo='$cargo',valor='$valor',visitas='$visitas',data1='$data1',categoria='$categoria',post='$post',cliente='$cliente',imagem='$imagem',mapa='$mapa',descricao='$descricao'", "id='$getId'");


    }


?>

// ------ ESTE É O DO  CATALOGO.PHP ----- QUE ESTA A ASSIM minhaloja.com/produtos/catalogo.php?id=200
E QUERO QUE QUANDO CLICAR NA IMAGEM OU ALGUM BOTAO PARA DIRECIONAR PARA ESTE CATALOGO.PHP e ela ficar assim

minhaloja.com/produtos/HD-SAMSUNG-500-GB ------- ///////

<!-- CHAMANDO OS DADOS DA TABELA PARA O CATALOGO -->
<?php require_once 'assest/public/sys.php'; ?>

<!DOCTYPE html>
<html lang=pt-br class=no-js>
<head>
<meta http-equiv=content-type content="text/html; charset=UTF-8">
<meta name=theme-color content="#bf0e0e"/>
<meta charset=utf-8>
<meta name=language content=pt-br>
<meta name=viewport content="width=device-width, initial-scale=1, maximum-scale=1">
<title><?php echo $dados["nome"]; ?></title>
<meta name=description content="<?php echo $dados["nome"]; ?>"/>	
<meta name=keywords content="<?php echo $dados["cargo"]; ?>"/>
<meta property=og:site_name content="notícias"/>
<meta property=og:type content=article />
<meta content="<?php echo DadosSession('base_url'); ?>produtos/catalogo.php?id=<?php echo $dados["id"]; ?>" property=og:url>
<meta content="<?php echo DadosSession('base_url'); ?>img/cat/<?php echo $dados["imagem"]; ?>" property=og:image>
<meta content="<?php echo $dados["nome"]; ?>" property=og:title>
<meta content="<?php echo $dados["descricao"]; ?>" property=og:description>
<script type='text/javascript'>window.mod_pagespeed_start = Number(new Date());</script><link href="<?php echo DadosSession('base_url'); ?>img/cat/<?php echo $dados["imagem"]; ?>" rel=image_src />
<meta property=og:image:type content="image/jpeg">
<meta property=og:image:width content=400>
<meta property=og:image:height content=400>
  <link rel=stylesheet href="https://fonts.googleapis.com/icon?family=Material+Icons"/>
  <link rel=stylesheet href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
  <link href="css/bootstrap.min.css" rel=stylesheet>
  <link href="css/owl.carousel.css" rel=stylesheet>
  <link href="css/owl.theme.default.min.css" rel=stylesheet>
  <link href="css/animate.min.css" rel=stylesheet>
  <link href="css/animsition.css" rel=stylesheet>
  <link rel=stylesheet type="text/css" href="css/gridGallery.css">
  <link rel=stylesheet type="text/css" href="css/uploadify.css">
  <link href="css/plugins.min.css" rel=stylesheet>
  <link href="css/material-kit.css" rel=stylesheet />
  <link href="css/component.css" rel=stylesheet media=screen>
  <link href="css/style.css" rel=stylesheet>

<link rel="shortcut icon" href="<?php echo DadosSession('base_url'); ?>/img/img_site/afc4e973ce.jpg">
<script type="text/javascript" src="js/ajax_votacao.js"></script>
<script src="js/modernizr.custom.js"></script>
<script src="js/jquery.min.js"></script>
<script src="js/jquery.flexslider.js"></script>
<script src="js/material.min.js"></script>
<script src="js/material-kit.js"></script>
<script src="js/jquery.maskedinput.js"></script>
<script type="text/javascript" src="js/jquery.uploadify.min.js"></script>
<style>#menu-topo{background-color:#eee}#menu-topo li a{color:#333}.top-wrap,.sb-icon-search,.sb-search.sb-search-open .sb-icon-search,.no-js .sb-search .sb-icon-search{background-color:#bf0e0e}#menu-topo .sociais a{color:#ccc}.cor-bg{background:#c62d2d}.cor{color:#c62d2d}.busca{background:url(<?php echo DadosSession('base_url'); ?>/arquivos/template/794a3559ef930d8b7900a9c4b3c894eb.jpg) #EEE no-repeat center center / cover}.busca-interna{background:url(<?php echo DadosSession('base_url'); ?>/img/img_site/fundo.png) #EEE no-repeat center center / cover}.nav>li>a:focus,.nav>li>a:hover{background-color:#333}#footer{background-color:#222}#footer .btmFooter{background-color:#181818;color:#7f7f7f}#footerapp{background-color:#181818;position:absolute;bottom:0;left:0;right:0;padding:30px}.footer li a{#7f7f7f}</style>
</head> 
<body id=top>

<div class=scroller>
<div class=scroller-inner>
<header>

<div class=col-md-1>             <li>

<div class="col-md-2 pull-right row">
            
      <div id=categ>
               <ul class=menu>
                      <li class=dropdown>

       </div>
        </div>
         </div>
</div> 

   
<!--PC-->
 

<div class="header ocultar">
              <div class=container>
                  <div class=row>
                      
                      
                      <div class="col-sm-4 ocultar">
                          <a href="<?php echo DadosSession('base_url'); ?>">
                                <script data-pagespeed-no-defer>//<![CDATA[
(function(){var g=this;function h(b,d){var a=b.split("."),c=g;a[0]in c||!c.execScript||c.execScript("var "+a[0]);for(var e;a.length&&(e=a.shift());)a.length||void 0===d?c[e]?c=c[e]:c=c[e]={}:c[e]=d};function l(b){var d=b.length;if(0<d){for(var a=Array(d),c=0;c<d;c++)a[c]=b[c];return a}return[]};function m(b){var d=window;if(d.addEventListener)d.addEventListener("load",b,!1);else if(d.attachEvent)d.attachEvent("onload",b);else{var a=d.onload;d.onload=function(){b.call(this);a&&a.call(this)}}};var n;function p(b,d,a,c,e){this.h=b;this.j=d;this.l=a;this.f=e;this.g={height:window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight,width:window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth};this.i=c;this.b={};this.a=[];this.c={}}function q(b,d){var a,c,e=d.getAttribute("data-pagespeed-url-hash");if(a=e&&!(e in b.c))if(0>=d.offsetWidth&&0>=d.offsetHeight)a=!1;else{c=d.getBoundingClientRect();var f=document.body;a=c.top+("pageYOffset"in window?window.pageYOffset:(document.documentElement||f.parentNode||f).scrollTop);c=c.left+("pageXOffset"in window?window.pageXOffset:(document.documentElement||f.parentNode||f).scrollLeft);f=a.toString()+","+c;b.b.hasOwnProperty(f)?a=!1:(b.b[f]=!0,a=a<=b.g.height&&c<=b.g.width)}a&&(b.a.push(e),b.c[e]=!0)}p.prototype.checkImageForCriticality=function(b){b.getBoundingClientRect&&q(this,b)};h("pagespeed.CriticalImages.checkImageForCriticality",function(b){n.checkImageForCriticality(b)});h("pagespeed.CriticalImages.checkCriticalImages",function(){r(n)});function r(b){b.b={};for(var d=["IMG","INPUT"],a=[],c=0;c<d.length;++c)a=a.concat(l(document.getElementsByTagName(d[c])));if(0!=a.length&&a[0].getBoundingClientRect){for(c=0;d=a[c];++c)q(b,d);a="oh="+b.l;b.f&&(a+="&n="+b.f);if(d=0!=b.a.length)for(a+="&ci="+encodeURIComponent(b.a[0]),c=1;c<b.a.length;++c){var e=","+encodeURIComponent(b.a[c]);131072>=a.length+e.length&&(a+=e)}b.i&&(e="&rd="+encodeURIComponent(JSON.stringify(t())),131072>=a.length+e.length&&(a+=e),d=!0);u=a;if(d){c=b.h;b=b.j;var f;if(window.XMLHttpRequest)f=new XMLHttpRequest;else if(window.ActiveXObject)try{f=new ActiveXObject("Msxml2.XMLHTTP")}catch(k){try{f=new ActiveXObject("Microsoft.XMLHTTP")}catch(v){}}f&&(f.open("POST",c+(-1==c.indexOf("?")?"?":"&")+"url="+encodeURIComponent(b)),f.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),f.send(a))}}}function t(){var b={},d=document.getElementsByTagName("IMG");if(0==d.length)return{};var a=d[0];if(!("naturalWidth"in a&&"naturalHeight"in a))return{};for(var c=0;a=d[c];++c){var e=a.getAttribute("data-pagespeed-url-hash");e&&(!(e in b)&&0<a.width&&0<a.height&&0<a.naturalWidth&&0<a.naturalHeight||e in b&&a.width>=b[e].o&&a.height>=b[e].m)&&(b[e]={rw:a.width,rh:a.height,ow:a.naturalWidth,oh:a.naturalHeight})}return b}var u="";h("pagespeed.CriticalImages.getBeaconData",function(){return u});h("pagespeed.CriticalImages.Run",function(b,d,a,c,e,f){var k=new p(b,d,a,e,f);n=k;c&&m(function(){window.setTimeout(function(){r(k)},0)})});})();pagespeed.CriticalImages.Run('/mod_pagespeed_beacon','<?php echo DadosSession('base_url'); ?>produtos/catalogo.php?id=<?php echo $dados["id"];?>','yW9MLzz7Mf',true,false,'CnL4BB8euv4');
//]]></script><img src="<?php echo DadosSession('base_url'); ?>img/<?php echo $dados["imagem"]; ?>" data-pagespeed-url-hash=1547057666 onload="pagespeed.CriticalImages.checkImageForCriticality(this);"/>
                        </a>
                      </div>
                      
                    
                      <div class="col-sm-8 banner" align=right>
             
<div class=row>
<div class=col-md-12>
<div class=flexslider>
<ul class=slides>
  
  
  
  
  DESTE JÁ FICO GRATO A TODOS....

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

0 respostas a esta questão

Recommended Posts

Até agora não há respostas para essa pergunta

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por stewartcintra@
      Pessoal, estou tentando fazer essas url amigaveis, mas não esta dando certo
      preciso quando as paginas do site (contas.php fiquem /contas) isso consegui fazer
      e o arquivos contas  (contas.php?exibe=Vencidas fique /contas/Vencidas) que nao consigo passa as duas regras juntas
       
      Meu arquivo .htaccess
      RewriteEngine On
      RewriteRule ^([a-z]+)\/?$ /$1.php [NC]
      RewriteRule ^([a-z,0-9,A-Z,_-]+)\/contas?$ contas.php?exibe=$1
       
    • Por leonardo021970
      Tem alguma maneira de capturar todas as urls do site?
      Testei pelo google mas ele retorna apenas alguns resultados pelo jeito que testei
    • Por Vitorkgb
      Boa tarde pessoal, alguém poderia me ajudar?, estou usando JSF, porém estou com uma necessidade, criei um botão na minha página xhtml que executa um método (Dentro de um ManagedBean na vdd), nesse método precisaria executar uma URL e pegar um parâmetro, porém essa URL teria que ser executada dentro do método mesmo, sem abrir qualquer navegador, com o parâmetro pego ai sim vou jogar na próxima tela, alguém saberia como posso fazer isso? executar uma URL e pegar seu parâmetro gerado sem abrir o navegador?
      Desde já obrigado,
      Vitor
    • Por lucianfpaula
      Olá, eu tenho uma duvida, eu queria pegar um parâmetro via url, sei como fazer via post e get, mas o que quero é pegar o parâmetro da seguinte forma: www.meusite.com.br/4578, o parâmetro que preciso seria o depois do br, no caso 4578.
      isso seria URL amigável no php, mas em javascript não sei como fazer.
×

Informação importante

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