Ir para conteúdo

POWERED BY:

Arquivado

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

Rarylson Freitas

[Resolvido] Include + paths

Recommended Posts

Bom, primeiramente, como sempre, vou escrever bastante neste tópico. Desculpem o fato de não ser sucinto, mas é que prefiro descrever detalhadamente o problema e as dúvidas visando não gerar dúvidas e não fazer os membros do fórum perderem tempo postando soluções que já tentei ou dizendo coisas que já sei. Além disso, creio que assim estou facilitando a vida de usuários menos experientes permitindo um aprendizado mais fácil enquanto estiverem lendo esse post.

Pois bem, estou codificando um site bastante simples, cuja árvore (estrutura de diretórios) está descrita (somente o que interessa) a seguir:

 

 

/

- index.php- topo.php...- html

* institucional.php...

- img

* logo.png...

Bom, o problema geral é o seguinte: Pretendo colocar, no topo do site (codificado em topo.php) a imagem logo.png (na verdade existem vários problemas relacionados à paths, mas resolvendo esse, e entendendo os conceitos, resolvo os demais).

Na página index.php, bem como na institucional.php e em outras páginas, faço a inclusão da página topo.php através de uma caminho relativo:

<!-- topo -->
<?php include_once 'topo.php';?>
<!-- fim do topo -->
Já na página topo.php, faço a inclusão da imagem logo.png. Imagine que seja feita essa inclusão da seguinte forma, através de um caminho relativo à página topo.php:

<img src="img/logo.png" />
Essa solução funciona para a página index.php, mas não para a institucional.php.

Para a página index.php, teríamos o seguinte efeito:

<!-- topo -->
<img src="img/logo.png" />
<!-- fim do topo -->
que insere a imagem que está no endereço (a partir do caminho raíz do site) /img/logo.png.

Já para a página institucional, que está em /html/, teríamos o mesmo código resultante após a inclusão, que é:

<!-- topo -->
<img src="img/logo.png" />
<!-- fim do topo -->
Mas esse código, uma vez que essa página está em /html/institucional.php, vai buscar a imagem no caminho /html/img/logo.png. Porém, não existe imagem lá.

Uma forma que eu pensei para resolver esse problema foi utilizar a tag <base>:

<!-- no head -->
...
<base href="localhost/nomedomeusite" />
...
<!-- fim do head -->
...
...
<!-- topo -->
<img src="/img/logo.png" /> <!-- a barra "/" antes de img (/img) é novidade, visto que o caminho será absoluto e em relação ao diretório raíz do site -->
<!-- fim do topo -->
Bom, essa solução exigiria uma base para cada página php, ou um include de um arquivo que contivesse a base. A primeira alternativa me obrigaria a trocar todas as bases se mudasse o domínio do site, e a segunda me obrigaria a fazer um include a mais em todas as páginas.

Daí, veio em mente outra solução, que é colocar o path para o diretório raíz numa variável php, conforme mostrado abaixo:

index.php

<div id="topo">
	<?php include_once 'topo.php';?>
</div> <!-- fim da div#topo -->
topo.php

<?php 
	// path do site (diretório base)
	$path = "http://localhost/nomedomeusite";
?>
...
<img src="<?php echo $path."/"?>img/logo.png" />
Essa solução funciona, a priori, perfeita, tirando o fato de que ela depende da localização absoluta do diretório base. Assim, para eu fazer o upload do site, antes eu tenho que alterar a variável path para o domínio do site.

 

Agora vem o maior problema que essa solução tem me trazido...

 

Estou usando Linux (que, convenhamos, para a tarefa de desenvolvimento tem se mostrado muito melhor que o Windows) e uso uma máquina virtual virtualbox onde dentro dela tenho instalado um Windows XP (para realizar testes com a plataforma e, em especial, com os Internet Explorer 6, 7 e 8). O apache responde, para o Linux, no loopback, isto é 127.0.0.1. A máquina virtual XP "enxerga" o ambiente externo (incluindo o apache) como estando no endereço 10.0.2.2. Obviamente, o localhost do Windows XP não enxerga o ambiente externo (afinal, loopback é loopback, kkk).

Criei um alias para o 10.0.2.2, no XP, como sendo apache, assim o meu site é enxergado no endereço apache/nomedosite.

Resultado, se eu quiser testar o site no XP, tenho de mudar o valor do path de localhost/nomedosite para apache/nomedosite, o que é um incomodo.

Até poderia criar um alias comum para as duas plataformas (diferente de localhost), mais aí fica muito gambiarra!!! E o mais importante, continuo tendo que alterar a variável $path ao fazer upload do site.

 

Então, finalmente, vai a pergunta: Qual a forma correta (ou formas mais coerentes) de se resolver esse problema, isto é, como é que se deve trabalhar com caminhos dentro de um include?

Compartilhar este post


Link para o post
Compartilhar em outros sites

não li tudo... é muito extenso

 

mas pelo que entendi, você está com duas dificuldades

 

 

1. utilização de paths absolutos e relativos server-side

Em server-side, por questões de compatibilidade, utilize sempre caminhos absolutos.

Sempre defina um diretório base, o qual será pré-concatenado quando precisar referir-se a um path específico.

Monte a estrutura no modo "MVC".

 

2. utilização de paths absolutos e relativos client-side

 

/index.html
/images/topo.png
/sample/topo.html

para exibir a imagem topo.png na página index.html:

 

caminho absoluto

<img src="http://foo.bar/images/topo.png">

caminho relativo

<img src="images/topo.png">

caminho relativo com referência ao diretório base.

há uma barra, no começo, que indica que o path deve começar no primiero nível de diretórios, ou seja, seria o mesmo que utilizar o caminho absoluto

<img src="/images/topo.png">

 

 

 

 

 

para exibir a imagem topo.png na página /samples/topo.html

 

caminho absoluto

<img src="http://foo.bar/images/topo.png">

caminho relativo

<img src="images/topo.png">
provocará erro, pois a página está dentro de um subdiretório.

o navegador tentará buscar a imagem em http://foo.bar/samples/images/topo.png

 

 

caminho relativo com referência ao diretório base.

há uma barra, no começo, que indica que o path deve começar no primeiro nível de diretórios, ou seja, seria o mesmo que utilizar o caminho absoluto

<img src="/images/topo.png">

 

a página topo.html, está dentro de uma pasta 1 nível abaixo da pasta raíz.

outra forma também seria o uso de recuo de diretório

<img src="../images/topo.png">

 

num outro exemplo, se a página estiver 2 níveis abaixo, o recuo deverá possuir também 2 niveis

<img src="../../images/topo.png">

Compartilhar este post


Link para o post
Compartilhar em outros sites

hinom, você entendeu sim o assunto, mas não as dúvidas (acho que justamente por não ter lido o que estava escrito, o que não quero que considere uma crítica, já que sei que apenas queria ajudar dentro do seu tempo disponível - é só olhar a hora do post para perceber que o meu tempo disponível não é lá grande coisa, rsrsrs). O que você falou eu já sabia.

Pois bem, vou simplificar a dúvida:

como fazer referência, na página /topo.php, ao arquivo /img/logo.png, sendo que está página será incluída (include_once) em diversas outras páginas, que estão nos mais diversos diretórios.

Já sabia desde o começo que não dá para fazer referência relativa (não que eu saiba) ao arquivo /img/logo.png pois as diversas outras páginas não irão encontrá-lo (já que elas estão nos mais diversos diretórios).

Se usar caminho absoluto, a partir de um diretório base, gostaria de saber como não "amarrar" a solução para um endereço específico.

Por exemplo, se usa-se:

<img src="/images/topo.png">

conforme sugeriu o hinom, nem vai funcionar no meu apache (o diretório base é http://localhost/site/), nem muito menos no site que estou hospedando para que o cliente veja e acompanhe o projeto (http://www.umsiteaeh.com.br/sandbox/nomedomeusite/prototipo/).

Se eu usar uma variável $path no php para armazenar o diretório base como sendo http://localhost/site, a solução vai estar amarrada especificamente para o apache (loopback) (não é isso que eu quero, apesar de ser assim que tenho resolvido o problema até agora).

Por fim, a dúvida pode ser resumida em:

Qual a forma correta (ou formas mais coerentes) de se resolver esse problema, isto é, como é que se deve trabalhar com caminhos dentro de um include?

Compartilhar este post


Link para o post
Compartilhar em outros sites

o código <img src="/images/topo.png"> está dentro de um arquivo php que é incluído em todos os outros certo ?

 

é recomendável que re-estruture o aplicativo.

 

por isso, estude sobre o uso do MVC.

 

 

essa á a opção 1.

 

 

para opção 2, segundo o que relatou e no que pude entender,

 

 

supondo a estrutura

 

/index.php
/noticias/noticia.php
/images/topo.php
/images/topo.png

 

sugiro algo assim:

 

/images/topo.php

<img src="<?php echo $base_dir;?>/images/topo.png">

 

quando estiver na página index.php, atribua uma valor à variável base_dir

 

a página index.php, está no nível raíz, portanto, o valor seria vazio.

$base_dir = '';

 

a página noticia.php, está 1 nível abaixo da raíz, portanto, o valor seria o nível onde está.

$base_dir = '/noticia';

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok fera, fiz mais ou menos isso.

Para testes locais, defini: $base_dir = "/nomedosite/", já que a pasta raíz do meu site é: "diretório raiz do apache"/nomedosite/.

Assim, se fizesse um:

<img src="/images/topo.png">
o apache tentaria carregar a imagem em:

dir_base_do_apache/images/topo.png
e daria erro.

Assim, estou fazendo um

<?php $base_dir = 'nomedosite'; ?>
<img src="<?php echo $base_dir;?>/images/topo.png">
.

Por fim, qdo vou colocar o site em um servidor que configura o diretório raiz já como aquele em que coloco meus arquivos, apenas mudo o valor de $base_dir:

$base_dir = '';
Descobri que é possível eu alterar o diretório base para todo o site que está em "diretório raiz do apache"/nomedosite/ (na verdade, é isso que é feito no servidor onde hospedo os arquivos, tenho um diretório raiz configurado para mim). Só ainda não sei fazer isso.

Li sobre o modelo MVC, para separar o código PHP do layout. Vi também que ele é muito usado junto com o Zend Framework. Entretanto, ainda é um assunto um pouco complexo para mim, que ainda estou engatinhando por esse mundo do desenvolvimento de software.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A "opção 2", apresentada no post #4, é apenas uma solução alternativa baseada no seu caso específico. Não quer dizer que é um padrão a ser seguido.

Apresentei a dica para o seu caso somente, para que não seja necessário modificar todo o sistema por causa disso.

 

O correto é que você organize melhor a estrutura de dados. O recomendado é seguir padrões MVC.

 

Quando você conseguir entender o MVC, terá uma visão mais ampla.

Portanto, em projetos novos, procure usar MVC. Em projetos em andamento, dependendo do tamanho do projeto, muitas vezes não compensa o trabalho de modificar. Bastaria apenas criar adaptações.

Compartilhar este post


Link para o post
Compartilhar em outros sites

$path = 'img/logo.png';

while(!file_exists($path)) { $path = '../'.$path; }

 

o que essa pequena gambiarra faz, é verificar se existe um arquivo img/logo.png, e suba um nível até que encontre.

muito cuidado! deve haver pelo menos um diretório IMG na raiz do domínio, senão a solução entrará em loop infinito

 

funciona

/
|-index.php
|-styles.css
|-php/
|---topo.php
|-img/
|---logo.png

não funciona!

/
|-index.php
|-styles.css
|-php/
|---topo.php
|-imgagens/
|---img/
|------logo.png

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.