Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

sc0rpion

Arquitectura site para facilitar SEF url

Mensagens Recomendadas

sc0rpion

Ok, o assunto da mensagem talvez não seja o mais explícito, mas também não sabia como havia de escrever algo que o fosse.

Estou a converter um sistema que tenho para uma arquitectura que me permita ter urls "mais humanos". Mas estou com dúvidas de qual a melhorar solução para resolver o problema, se alterar a arquitectura da BD ou modificar o código.

Basicamente tenho várias ideias de como o posso conseguir mas o sistema é demasiado complexo e não queria começar a mexer demasiado sem ter a certeza da melhor solução. Queria uma 2ª ou 3ª ou 4ª :) opinião de alguém que eventualmente já tenha feito algo parecido.

Depois dos parágrafos abaixo coloquei exemplos "simples" e a estrutura das tabelas para tentar facilitar a explicação.

Actualmente tenho uma tabela com o menu (em árvore sem limite de níveis) e outra com o conteúdo de cada página (ver exemplos abaixo depois do texto).

Cada elemento do menu aponta para uma página diferente. Tanto pode ser uma página da tabela pages através do id passado no url como pode ser para outra página tipo noticias ou uma agenda de eventos, ou outra coisa qualquer que não interessa referir para não tornar a explicação mais complexa.

Na tabela do menu os elementos com o parentid=0 são as secções principais da página. Consoante a secção em que estou e a página escolhida apresento o menu todo dessa secção mas apenas expando os filhos da página escolhida. Para além disso tenho o breadcrumb com o caminho desde a entrada até à página escolhida. Tanto o menu como o breadcrumb são construídos com base no url.

Também posso ter páginas criadas que não estão no menu e neste caso a página não apresenta menu. Actualmente verifico se existe no menu ou não, mas isto facilmente se resolve incluindo um atributo showmenu na tabela.

Exemplo simples de dados da tabela menu:

item 1

- subitem 1

- subitem 2

- subitem 3

- subitem a

- subitem b

- galeria de imagens X (http://localhost/galeria/X --> aponta para --> gallery.php?id=X)

- subitem 4

- subitem a

item 2

item 3

- agenda (http://localhost/agenda/ --> aponta para --> agenda.php)

item 4

- subitem 1

- subitem 2

item 5

- eventos (http://localhost/noticias/ --> aponta para --> noticias.php)

Por exemplo, para o subitem a quero aceder a partir de http://localhost/item1/subitem-3/subitem-a

Tabela menu (é o menu em árvore. sem limite de níveis)

id			int(3)
parentid		int(3)
sortorder 		int(3) - ordem do item dentro da seccao em que está inserido.
name 		varchar(255) - titulo da pagina
alias			varchar(255) - titulo-da-pagina
link			varchar(255) - aponta para index.php?id=xxx (o xxx é igual a um id da tabela pages) ou agenda.php/noticias.php/galeria.php ou mm um ficheiro
visible		tinyint(1) - true/false
targetURL		varchar(20) - _self / _blank

Tabela pages (basicamente aqui guarda o conteúdo de cada secção)

id				int(11)
title				varchar(255) - titulo da pagina
alias				varchar(255) - titulo-da-pagina
content			text - conteudo html
insertdate		datetime
insertuser		varchar(25)
updatedate		datetime
updateuser		varchar(25)
visitedcount		int(6)

As regras que tenho definidas até ao momento no .htaccess. Tenho que definir outra(s) regra(s) para o index.php tratar os urls do menu (que eu não conheço pois depende do que tiver no menu).

RewriteRule ^noticias/?$ news.php [NC,L]
RewriteRule ^noticias/([A-Za-z0-9-]+)/?$ news.php?id=$1 [NC,L]
RewriteRule ^noticias/pagina/([0-9]+)/?$ news.php?pageID=$1 [NC,L]
RewriteRule ^galeria/([A-Za-z0-9-]+)/?$ gallery.php?id=$1 [NC,L]
RewriteRule ^agenda/?$ events.php [NC,L]
RewriteRule ^agenda/([A-Za-z0-9-]+)/?$ events.php?event=$1 [NC,L]

Já estive a ver como vários CMS fazem isto, por exemplo o CMSMadeSimple e o SNews.

Tanto no caso do CMSMS como do SNews eles fazem o Rewrite de tudo para o index.php?id= e depois ele trata o url para devolver a página.

O CMSMS permite aceder ao http://localhost/item1/subitem-3/subitem-a através de http://localhost/subitem-a. O que para mim não serve já que eu tenho subitems iguais em secções e items diferentes (exemplo do subitem a no item 1/subitem 3 e item 1/subitem 4). O SNews já não permite isto, só aceita mesmo o caminho correcto.

Em termos de BD, o CMSMS usa uma única tabela (content) em que tem o id,parentid,content,alias,etc. e portanto os menus apenas têm links para este tipo de conteúdo, não fazem links para o módulo das notícias por exemplo. Já o Snews usa 2 tabelas, uma de categorias e outra com os artigos, mas este é feito só para gerir artigos.

Agora o meu problema... qual a forma mais correcta de alterar isto para permitir utilizar urls do tipo http://localhost/item1/subitem-3/subitem-a ?

"Junto" as minhas tabelas de forma à tabela pages incluir o parentid e o sortorder? Então e depois como é que faço para criar links para os meus módulos? Eventualmente teria que criar um campo com o tipo de conteúdo (content, event, news, etc.), n?

Ou altero o .htaccess de forma a que todos os urls sejam enviados para o index.php? E depois é o index.php que identifica o conteúdo? Existe forma de fazer isto sem me obrigar a juntar o código de todos os meus ficheiros (news.php, gallery.php, events.php, etc.) num único? É que se tiver que o fazer é muito mau... considerando a quantidade de "módulos" que tenho...

Desculpem o facto do tópico ter ficado gigante. Mesmo assim provavelmente não fui suficientemente explícito. Tinha muito mais que escrever mas não quero abusar  :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
yoda

O mais fácil é o mais simples :

RewriteEngine On

RewriteBase /

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

RewriteRule .* index.php/$0 [PT]

Este funciona para tudo o que queres, só tens de trabalhar com a ordem dos menus / páginas / seja o que for

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
sc0rpion

Um problema...

Para evitar que quando estou dentro das secções os .css, os .js e as imagens não carreguem por o browser considerar a path base como http://localhost/item-1/subitem-1/subitem-a/ defini no header do template principal que a path base era: <base href="http://localhost/">.

Até aqui tudo bem, mas o problema é que quando tenho links para anchors eles não funcionam porque o browser considera que a path desses anchors é http://localhost/#anchor em vez da secção em que estou.

Existe alguma forma fácil de resolver este problema? A opção de adicionar caminhos completos aos anchors não serve. A solução de remover o url base do head e colocar a path completa também não, porque teria de fazer isso para todas as imagens que tenho em todas as secções.

Já tentei remover o url base do head e tentar usar o mod_rewrite mas sem sucesso :D

Os caminhos interpretados pelo browser, dentro das secções, nos quais tenho problemas são:

http://localhost/js/...

http://localhost/css/...

http://localhost/images/...

Actualmente tenho o mod_rewrite assim:

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php/$0 [L]

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
sc0rpion

Se eu usar no head os js/css com caminho completo obviamente que o browser consegue encontrá-los no sítio correcto e fica quase tudo bem. No caso das imagens e dos links o problema continua.

Se estiver numa secção como por exemplo http://localhost/news/a-joana-foi-as-couves as imagens não aparecem e os links são construídos a partir deste caminho (Ex.: http://localhost/news/a-joana-foi-as-couves/imagens/joana.jpg quando deveria ser http://localhost/imagens/joana.jpg e no caso dos links fica a apontar para http://localhost/news/a-joana-foi-as-couves/events quando deveria ser http://localhost/events).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jcfr

Se eu usar no head os js/css com caminho completo obviamente que o browser consegue encontrá-los no sítio correcto e fica quase tudo bem. No caso das imagens e dos links o problema continua.

Se estiver numa secção como por exemplo http://localhost/news/a-joana-foi-as-couves as imagens não aparecem e os links são construídos a partir deste caminho (Ex.: http://localhost/news/a-joana-foi-as-couves/imagens/joana.jpg quando deveria ser http://localhost/imagens/joana.jpg e no caso dos links fica a apontar para http://localhost/news/a-joana-foi-as-couves/events quando deveria ser http://localhost/events).

suponho que estás a utilizar links do genero:

<a href="imagens/joana.jpg"></a>

quando te aparece:

http://localhost/news/a-joana-foi-as-couves/imagens/joana.jpg

em vez de

http://localhost/imagens/joana.jpg

tenta utilizar caminhos absolutos...

do genero em vez de

<a href="imagens/joana.jpg"></a>

coloca

<a href="/imagens/joana.jpg"></a>

o link passará a ser

http://localhost/imagens/joana.jpg

porque como estás a utilizar um caminho absoluto o caminho que lhe enviast conta a partir da raiz da página e não da pasta onde estás...

no caso de estares a ir buscar o caminho a uma base de dados deves estar a utilizar algo do genero:

<a href="<?php echo $caminho;?>"></a>

sendo que $caminho = "imagens/joana.jpg";

nesse caso substitui por:

<a href="/<?php echo $caminho;?>"></a>

á partida deve funcionar...

pelo menos comigo funcionou...

assim não tens de declarar caminhos completos e eles são assumidos na mesma e no caso de passares a página para um servidor que nao seja o teu localhost vai funcionar na mma...

espero ter ajudado e que sirva pa alguma coisa...

não sou especialista nisto mas se resultou comigo deve resultar contigo.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
sc0rpion

Sim, isso eu já sabia que podia fazer.

O meu problema é que a resposta do yoda não me convém lá muito :( Daí que tenha acabado por perguntar duas vezes mais ou menos a mesma coisa.

Obriga-me a ter que:

  • alterar o tinymce para escrever caminhos absolutos
  • alterar os meus templates para usarem caminhos absolutos
  • alterar os meus links para usarem caminhos absolutos

O principal inconveniente disto é que passar da fase de desenvolvimento para live dá trabalho extra que não devia ser necessário.

No caso do tinymce facilmente faço um replace directo na bd e o problema tá resolvido e para os links igual.

Já para os templates é que tenho que fazer um replace com o Notepad++.

Não sei... provavelmente vou optar pela solução de incluir a tal barra no caminho. Assim torna-se mais rápido depois, porque só preciso fazer o replace do host na BD.

Se acharem que há algum problema com esta solução avisem. Eu sei que podia usar o php para construir o caminho mas neste caso acho que não se justifica.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jcfr

o teu problema é que so te lembrast disto quando o projecto já ia bem avançado obrigandot a alterar muita coisa...

eu tb so comecei a usar safe urls a pouco e nos projectos anteriores vou deixar como está pois mais tarde terei de de reformular tudo criar novos ambientes etc e melhorar com o que se vai aprendendo... so nessa altura irei utiliza-los...

boa sorte e continuem com o bom trabalho, este é o melhor forum portugues do genero....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
sc0rpion

Sim, em relação ao tinymce não é problema, eu sei configurar isso. Quando escrevi que tenho que fazer replace, refiro-me a todo o conteúdo que já tenho na BD porque não vou editar as coisas todas uma a uma :(

Em relação aos templates eu tenho uma variável com o url parcial portanto facilmente mudo.

E o jcfr tem razão quando diz que o problema é só estar a fazer o rewrite agora numa fase avançada. Quando peguei nisto já era com intuito de o fazer mas como precisava das coisas prontas para carregar conteúdo tive que fazer da forma mais rápida.

Obrigado pela ajuda  :(

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.