Alteração do viewtopic.php para normalizar urls movidas 301

Suporte à dúvidas gerais relacionadas ao phpBB.
professor mauricio
Novato
Novato
Mensagens: 130
Registrado em: 02 Abr 2011, 11:58
MSG 100+

Alteração do viewtopic.php para normalizar urls movidas 301

  • Favoritar esta postagem
  • Mensagem por professor mauricio »

    URL do Fórum: http://forumdepizzarias.com.br

    Quando alguém digita um número de tópico qualquer para visualizar, caso o tópico tenha sido movido ou apagado, aparece um trigger error dizendo que o tópico foi movido ou apagado.

    Gostaria de aprender a fazer um LOOP no lugar do trigger error que funcione assim:

    fulano digita o ID 30

    o php não acha o 30 na tabela então ele procura 30 + 1
    caso ele não ache ele procura 30+1+1

    e assim sucessivamente, em loop, até achar algum número.

    teria de ter uma margem de segurança para não ficar em loop infinito dizendo "se o ID for maior que o maior ID existente", aí vem o trigger error ou vem um loop ID - 1 (id menos 1)

    Não sei se seria complicado de fazer, mas temos uns 'buracos' em números de fóruns e em números de topicos e vez por outra alguém cai num desses trigger error.

    Vou dar outro exemplo:

    fulano achou um link para viewtopic.php?t=X no google

    Só que o tópico X foi fundido com o tópico Y.

    Seria menos mal se o cara caísse em viewtopic.php?t=X+1 ou X+2 ou X+... ou, se fosse possível, cair em viewtopic.php?t=Y

    Outra alterativa seria trocar o 'trigger error' atual para qualquer tópico existente, como um guia de uso do site, uma seção de batepapo ou uma página como 'posting.php' para a pessoa enviar novamente a pergunta que resultou em "DEAD END"

    abc e, de antemão, obrigado
    Editado pela última vez por professor mauricio em 27 Ago 2011, 11:16, em um total de 1 vez.
    Comeu uma pizza que pode melhorar?
    Indique o Fórum de Pizzarias para a pizzaria do seu bairro!
    Somos um grupo de empreendedores focados em capacitação e desenvolvimento de expertise em pizzas.
    professor mauricio
    Novato
    Novato
    Mensagens: 130
    Registrado em: 02 Abr 2011, 11:58
    MSG 100+

    Re: Alteração em função do viewtopic.php

  • Favoritar esta postagem
  • Mensagem por professor mauricio »

    Depois de alguns testes esse redir não funciona caso o fulano tente acessar usando APENAS o número do post...

    mas já dei um jeito e depois eu passo
    Depois de muuuuuuuita pesquisa cheguei a uma solução "elegante" tirada do link abaixo: (que tem outras dicas legais)
    http://greensboring.com/viewtopic.php?f=23&t=4720

    abra /viewtopic.php e localize logo no comecinho

    Código: Selecionar todos

        include($phpbb_root_path . 'includes/bbcode.' . $phpEx);
    
    Logo abaixo adicione em uma linha vazia o seguinte código:

    Código: Selecionar todos

        $topic_id   = request_var('t', 0);
        $sql = 'SELECT forum_id
                 FROM ' . TOPICS_TABLE . "
                 WHERE topic_id = $topic_id";
              $result = $db->sql_query($sql);
              $forum_id = (int) $db->sql_fetchfield('forum_id');
              $db->sql_freeresult($result);
    
              if (!$forum_id)
              {
              header("Status: 301 Moved Permanently", true, 301);
                    header("Location: $phpbb_root_path");
                    exit();
              }
              if ($_REQUEST['f'] != $forum_id)
                  {
              header("Status: 301 Moved Permanently", true, 301);
                  header("Location: {$phpbb_root_path}viewtopic.php?f={$forum_id}&t={$topic_id}");
                    exit();
                    }
    
    Sempre que alguém oferecer somente o número do tópico, vai dar um 301 para o "nome completo" com ?f=XX&t=XXX.

    E sempre que a pessoa oferecer um link de tópico que já foi movido, vai dar um 301 para o novo.

    Caso, por fim, a pessoa dê um link deletado, vai dar um 301 para a home (essa parte eu não sei se gostei...)

    Vou tentar melhorar esse código depois, para o caso de um f=XX que não exista quando a pessoa tenta acessar um fórum que já foi deletado.

    Mas assim já ajuda bastante! (estava pensando também em fazer uma página explicando que o tópico foi deletado e dar o 301 para ela em lugar da index)

    abc
    Comeu uma pizza que pode melhorar?
    Indique o Fórum de Pizzarias para a pizzaria do seu bairro!
    Somos um grupo de empreendedores focados em capacitação e desenvolvimento de expertise em pizzas.
    professor mauricio
    Novato
    Novato
    Mensagens: 130
    Registrado em: 02 Abr 2011, 11:58
    MSG 100+

    Re: Alteração do viewtopic.php para normalizar urls movidas

  • Favoritar esta postagem
  • Mensagem por professor mauricio »

    Gostaria de ajuda para finalizar este desenvolvimento e, quem sabe, mandar para o phpbb.com também como um "MOD para aplicar 301 e posts e tópicos movidos (apagados?)"

    Abra viewtopic.php.

    localize:

    Código: Selecionar todos

    // Do we have a topic or post id?
    if (!$topic_id && !$post_id)
    {
    	trigger_error('NO_TOPIC');
    }
    Substitua por:

    Código: Selecionar todos

    //padronizacao para normalizar urls movidas
    // primeira coisa importante eh pegarmos o post
    if ($post_id)
    {
    		$sql = 'SELECT post_id, topic_id, forum_id
    			FROM ' . POSTS_TABLE . "
    			WHERE post_id = $post_id";
    		$result = $db->sql_query($sql);
    		$row = $db->sql_fetchrow($result);
    		$db->sql_freeresult($result);
    // opa, se nao existe o post eh melhor apagar o post da url
    	if (!$row)
                  {
              header("Status: 301 Moved Permanently", true, 301);
                  header("Location: {$phpbb_root_path}viewtopic.php?f={$forum_id}&t={$topic_id}");
                    exit();
                    }
    // agora a gente pega o topico e ve se bate com o post para corrigir url de post movido
    	if ($_REQUEST['t'] != $row['topic_id'])
                  {
    		$f = $row['forum_id'];
    		$t = $row['topic_id'];
    		$p = $row['post_id'];
              header("Status: 301 Moved Permanently", true, 301);
                  header("Location: {$phpbb_root_path}viewtopic.php?f={$f}&t={$t}&p={$p}#p{$p}");
                    exit();
                    }
    // agora a gente confere se o topico nao foi movio tambem e corrige a url se for o caso
    	if ($_REQUEST['f'] != $row['forum_id'])
                  {
    		$f = $row['forum_id'];
    		$t = $row['topic_id'];
    		$p = $row['post_id'];
              header("Status: 301 Moved Permanently", true, 301);
                  header("Location: {$phpbb_root_path}viewtopic.php?f={$f}&t={$t}&p={$p}#p{$p}");
                    exit();
                    }
    }
    // caso a gente nao tenha o post ou ele tenha sido apagado por estar errado na condicao anterior
    if ($topic_id && !$post_id)
    {
    		$sql = 'SELECT topic_id, forum_id
    			FROM ' . TOPICS_TABLE . "
    			WHERE topic_id = $topic_id";
    		$result = $db->sql_query($sql);
    		$row = $db->sql_fetchrow($result);
    		$db->sql_freeresult($result);
    // opa, parece que a gente nao tem o topico tambem, somente temos o forum?
    	if (!$row)
                  {
              header("Status: 301 Moved Permanently", true, 301);
                  header("Location: {$phpbb_root_path}viewforum.php?f={$forum_id}");
                    exit();
                    }
    //tendo o topico mas o forum estando errado a gente precisa corrigir, afinal, e se foi movido?	
    	if ($_REQUEST['f'] != $row['forum_id'])
                  {
    		$f = $row['forum_id'];
    		$t = $row['topic_id'];
    	          header("Status: 301 Moved Permanently", true, 301);
    	              header("Location: {$phpbb_root_path}viewtopic.php?f={$f}&t={$t}");
    	                exit();
                    }
    }
    // vamos pensar assim: o cara tentou acessar um forum pelo viewtopic, entao a gente manda ele para o view forum neh.
    if ($forum_id && !$topic_id && !$post_id)
                  {
              header("Status: 301 Moved Permanently", true, 301);
                  header("Location: {$phpbb_root_path}viewforum.php?f={$forum_id}");
                    exit();
                    }
    // se o cara nao nos deu nada, nao ha o que fazer. se na condicao anterior o forum nao existia ele vai cair em um 'no forum' na viewforum
    if (!$topic_id && !$post_id)
    {
    	meta_refresh(3, $phpbb_root_path);
    	trigger_error('NO_TOPIC');
    }
    // alteracoes para 'padronizar' urls movidas
    Abra geladeira.php

    Localize:

    Código: Selecionar todos

    cerveja
    Beba!
    Comeu uma pizza que pode melhorar?
    Indique o Fórum de Pizzarias para a pizzaria do seu bairro!
    Somos um grupo de empreendedores focados em capacitação e desenvolvimento de expertise em pizzas.
    professor mauricio
    Novato
    Novato
    Mensagens: 130
    Registrado em: 02 Abr 2011, 11:58
    MSG 100+

    Re: Alteração do viewtopic.php para normalizar urls movidas

  • Favoritar esta postagem
  • Mensagem por professor mauricio »

    Agora, tem um detalhe que não consegui resolver AINDA.

    O php troca o forum_id de post global para 0. Isso faz com que a url de um post global fique:
    f=0&t=XX ou f=0&t=XX&p=XX#XXX ou

    implicações lógicas destas modificações enviadas:
    se tiver qualquer coisa movida, errada ou não enviada na url vai funcionar assim:
    post_id existe e corrige topic_id e forum_id se necessário. Caso a url esteja com as 3 strings corretas, nada acontece.
    se ele é errada, ele se apaga e deixa o restante.

    se o restante não existe aparece mensagem de trigger error.

    então, não temos (mais) post_id. Se o restante tiver topic_id corrige o forum_id. Se tiver certo, não faz nada.
    se o topic_id estiver errado, ele se apagar e deixa o forum_id

    se o forum_id é válido aparece a visualização de fórum
    se o forum_id é inválido, aparece o erro "fórum inválido"
    se o forum_id não foi dado do tipo viewtopic.php?f=0 ou apenas viewtopic.php aparecer o trigger error 'no topic'

    off topic:
    VVVVVVVVIIIIIIIIIIIIIIIIIIIINNNNNNNNNNNNNNYYYYYYYYYYYYYY!!!!!!!!!!!!!!!!
    CCCCCCCCCHHHHHHHHHHHHHIIIIIIIIIIIIIIICCCCCCCCCCCCCOOOOOOOOOOOOOOO!!!!!!!!!!!!
    HHHHHHHOOOOOOOOSSSSSSSSSSTTTTTTTTTT!!!!!!!!!!!!
    Comeu uma pizza que pode melhorar?
    Indique o Fórum de Pizzarias para a pizzaria do seu bairro!
    Somos um grupo de empreendedores focados em capacitação e desenvolvimento de expertise em pizzas.
    Avatar do usuário
    _Vinny_
    Administrador
    Administrador
    Mensagens: 6023
    Registrado em: 03 Set 2009, 21:59
    Contato:
    LendaMSG 1500+Avatar

    Re: Alteração do viewtopic.php para normalizar urls movidas

  • Favoritar esta postagem
  • Mensagem por _Vinny_ »

    professor mauricio escreveu:Gostaria de aprender a fazer um LOOP no lugar do trigger error que funcione assim:
    Engraçado, pois estudei isso ano passado, mas esqueci como se faz. :roll:

    Já tentou mudar o código para:

    Código: Selecionar todos

    viewtopic.php?t={TOPIC_ID}
    ??
    Tradução Português Brasileiro: https://www.phpbb.com/customise/db/translation/brazilian_portuguese/

    Precisa de serviços phpBB? Me mande um mensagem privada ou visite https://vinny.quest
    professor mauricio
    Novato
    Novato
    Mensagens: 130
    Registrado em: 02 Abr 2011, 11:58
    MSG 100+

    Re: Alteração do viewtopic.php para normalizar urls movidas

  • Favoritar esta postagem
  • Mensagem por professor mauricio »

    Com os códigos que botei ali em cima, os erros 404 caem 90%, pois sempre terá um 301 esperando... (eliminando parcialmente a necessidade de looping)

    se o post é inválido, vale o tópico

    se o tópico é inválido, vale o fórum

    se o fórum é inválido que vem o 404.

    se qualquer um for válido, ou seja, somente 1 deles sendo válidos já seria suficiente para não haver erro 404, pois o post corrige os outros dois
    ou o topico corrige o forum
    ou o forum envia para o viewforum.


    Agora estou indeciso quanto ao seguinte:
    é mais "certo" deixar rolar um 404 ou dar um 301 para a index? (pois o 404, a rigor, significa página não encontrada e não significa página excluída)

    Claro que, mesmo assim, pode aparecer algum 404 por erro de servidor....
    Comeu uma pizza que pode melhorar?
    Indique o Fórum de Pizzarias para a pizzaria do seu bairro!
    Somos um grupo de empreendedores focados em capacitação e desenvolvimento de expertise em pizzas.
    Trancado