• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Nazgulled

[Resolvido] Melhor forma para importar JavaScript usando PHP

28 mensagens neste tópico

Bem, coloquei este tópico aqui porque não sei se fica melhor na secção de JS ou PHP. Não faço ideia qual será a melhor solução para o meu problema (dai o tópico), portanto, não sei em que secção irá encaixar isto.

A ideia é ter um ficheiro PHP eu segundo alguns parâmetros irá fazer output de código JS. Por exemplo, digamos que tenho 5 ficheiros JS, ou seja, o código esta de certa forma separado por módulos para ter tipos de código diferente em cada ficheiro. Mas para determinada página só preciso que 3 deles sejam carregados, ou noutro apenas 1 ou 2, depende da página. Esse ficheiro PHP, segundo parâmetros, irá abrir e sacar o conteúdo dos determinados ficheiros JS, irá juntar o código e fazer output desse mesmo código. Depois, na <head> do document só tenho de adicionar uma tag <script> e apontar para esse ficheiro PHP.

O meu problema é na questão dos parâmetros. Não experimentei, mas penso que se fizer <script src="ficheiro.php?id=34"></script>, provavelmente dentro do PHP consigo ler o $_GET['id'] não? Anyway, eu penso que isto é possível, mas não me agrada esta solução, ou seja, passar os parâmetros pelo $_GET.

Será possível fazer de outra forma?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O meu problema é na questão dos parâmetros. Não experimentei, mas penso que se fizer <script src="ficheiro.php?id=34"></script>, provavelmente dentro do PHP consigo ler o $_GET['id'] não? Anyway, eu penso que isto é possível, mas não me agrada esta solução, ou seja, passar os parâmetros pelo $_GET.

Será possível fazer de outra forma?

Não sei qual é o problema de passar os parametros por $_GET, é uma maneira simples e eficaz....

Anyway, podes usar o $_SERVER["PATH_INFO"], ex: "ficheiro.php/34", no apache 2 acho que tens de activar uma configuração "AcceptPathInfo = On" no "httpd.conf".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Colocar um endereço com parâmetros no browser, ya, não há problema, mas ter algo como:

<script src="ficheiro.php?a=34&b=43&c=12"></script>

Não é uma solução que me agrade e estava à procura de outra...

Usar o $_SERVER["PATH_INFO"] vai dar ao mesmo, ao fim ao cabo tenho de adicionar os parâmetros ao source do <script> de qualquer maneira...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Usa urlrewrite para o cliente e processas como disseste ali em cima... É o que tenho visto fazer. :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em vez de usares:

<script src="file.js?x=y&y=z&z=a"></script>

Usavas, por exemplo:

<script src="file.js/y/z/a"></script>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ah, isso... mas isso vai dar ao mesmo praticamente e eu não queria ir por ai. Mas lá está, por isso é que vim aqui perguntar porque não estou a ver outra forma de o fazer, mas pode ser que alguém saiba...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes é mandar logo para o cliente o <script> com os srcs que precisas consoante o request que te fizeram, sem teres de processar 2 vezes.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

serveTostas.php

echo "<head>";
switch($_GET['nomeDaTosta']){
    case "oix":
        $x = array("tostadeira", "prato", "guardanapos");
        break;
    case "oixx":
        $x = array("tostadeira", "guardanapos");
        break;
    case "oix":
        $x = array("gordura", "wc");
        break;
    default: $x = array();
}
foreach($x as $k) echo "<script src='$k'></script>";

PS: O serveTostas.php é o file que serve as páginas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ah, mas isso é o que eu quero evitar...

Para além de querer evitar que ficheiros JS sejam carregados sem necessidade, quero evitar ter a <head> carregada de <script>'s, que é a minha ideia principal.

O ideal serial o JS ter algo tipo include(), mas não tem. Já vi várias formas de fazer algo parecido em JS mas nenhuma delas funciona como deve ser. o jQuery tem função para isso que se chama getScript() ou poderia fazer manualmente que seria criar um elemento <script> configurar as propriedades e adicionar ao DOM dentro da <head> mas isso cria problemas, não funciona da mesma forma que adicionar os scripts todos com <script>, porque ele usa AJAX de forma assíncrona. Por exemplo, as funções não podem ser invocadas logo, tenho de aguardar um pouco e isso não me agrada, dai querer carregar directamente na <head> e usar PHP para carregar apenas o que preciso.

Poderia usar AJAX de forma síncrona, e até já o fiz e funcionou, mas isso tem outro problema. Se por algum motivo o browser demorar muito tempo a carregar determinado ficheiro .js, o browser vai estagnar como se tivesse crashado até carregar o ficheiro por completo e isso é outra solução que não me agrada.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes fazer:

<script src="file.js/y/z/a"></script>

EM que y, z, a são os vários componentes que queres receber, fazendo a junção disso com PHP.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Que parte é que não percebeste que para mim, isto:

<script src="file.js?x=y&y=z&z=a"></script>

É igual a isto:

<script src="file.js/y/z/a"></script>

A sintaxe é diferente, mas no fundo é a mesma coisa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que não percebeste...

O objectivo é dizer a um script php para mandar output do componente y, z e a. Ou seja, vai tudo como se fosse um único ficheiro.

Se isto não serve, não sei então...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Percebi porque eu apenas estou a procura de uma maneira de apenas chamar o ficheiro php assim:

<script src="file.php"></script>

E de alguma forma, fazer output apenas do que preciso, mas se calhar estou a pedir de mais.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Agora que falaste nisso, podes ter uma maneira... Mas não é infalível.

Faz output consoante o referer... Mas não te podes esquecer que nem sempre esse campo é enviado, por isso prepara-te para teres que fazer muitas vezes output de tudo...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em que circunstâncias é que esse campo não é enviado?

O browser estar configurado para não o enviar... Há quem desactive isso para evitar as protecções contra bandwidth-theft.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É simples, da mesma forma que vou adicionar uma janela de erro que não vai deixar o script executar se o JavaScript estiver desactivado, faço o mesmo para o http referer :D

Em tempos tive um bug com o Firefox por causa disso (porque eu não desactivei nada) onde não me estava a ser possível fazer downloads de um site porque não tinha isso activo e eles simplesmente não deixavam porque queriam se certificar que eu estava no site deles e que não cliquei no link para download fora do domínio deles e eu faço o mesmo, não deixo...

The address of the page (if any) which referred the user agent to the current page. This is set by the user agent. Not all user agents will set this, and some provide the ability to modify HTTP_REFERER as a feature. In short, it cannot really be trusted.

Mas depois de ler isto na página do PHP, acho que é melhor não lol...

EDIT:

Hum, acho que já sei como fazer, eu tinha pensado em algo, mas não gostava da solução, no entanto, deste-me uma ideia para melhorar essa solução.

A minha ideia era quando chamo a página principal, o index.php que vai "escolher" o que mostrar ao utilizador, grava um cookie com o REQUEST_URI, depois, no ficheiro php que está no <script> é só ler esse REQUEST_URI. Eu tinha pensado na parte dos cookies, mas não sabia como iria fazer e não queria tar sempre a escever/ler montes de cookies, assim é apenas um e parece-me uma boa opção.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não tenho a certeza mas acho que vai dar ao mesmo, mas o que acabei por fazer foi usar sessões porque já as estava a usar e então, tirei partido disso para guardar o de $_SERVER['QUERY_STRING'] e depois basta aceder.

Só para terminar este tópico...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Este tópico insere-se em PHP porque a dúvida é como servir um determinado conteúdo através de PHP, seja ele HTML, JavaScript, texto, ou o que for.

MOVIDO

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nazgulled andas na onda de comprimir/reduzir/simplificar tudo. Ok aceita-se mas acho que tás a cometer um grande pecado aí.

Primeiro, por ter a extensão php muitos dos browsers nem sequer vão fazer cache do javascript (que o php faz output). Portanto vais estar sempre a enviar..

Depois não percebo porqu enão queres usar argumentos.. é que não faz sentido..

Que mal tem: <script src="js/y-z-x.js"> ??

Depois confiares na Session com REQUEST URI, e obrigares a que o site receba refereer vai fazer com que os bookmarks dos utilizadoers não funcionem para o teu site.

Explica-me a paranóia de não pores argumentos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nazgulled andas na onda de comprimir/reduzir/simplificar tudo. Ok aceita-se mas acho que tás a cometer um grande pecado aí.

Primeiro, por ter a extensão php muitos dos browsers nem sequer vão fazer cache do javascript (que o php faz output). Portanto vais estar sempre a enviar..

Depende dos headers que enviares, se enviares type: text/javascript ele faz cache do ficheiro...
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nazgulled andas na onda de comprimir/reduzir/simplificar tudo. Ok aceita-se mas acho que tás a cometer um grande pecado aí.

Primeiro, por ter a extensão php muitos dos browsers nem sequer vão fazer cache do javascript (que o php faz output). Portanto vais estar sempre a enviar..

Basta eu programar para que faça cache, já vi algures documentos na net a falar sobre isso.

E aquilo que o fnds3000 disse, eu já ia fazer, enviar os headers respectivos para o tipo de ficheiro. Não fazia ideia que ao fazer isso ele já fazia cache do ficheiro, mas se o fnds3000 diz, é porque deve fazer... :thumbsup:

Depois não percebo porqu enão queres usar argumentos.. é que não faz sentido..

Que mal tem: <script src="js/y-z-x.js"> ??

Isso não são argumentos... argumentos seria:

<script src="js/ficheiro.php?id=5">

Mas isto vai dar ao mesmo que apenas fazer <script src="js/ficheiro.php">, os argumentos seriam apenas para saber quais o ficheiros JS externos carregar em vez de carregar todos que podem não ser necessários para a página em questão. Usar ou não argumentos, o resultado é o mesmo, a única diferença é na sintaxe usado e na forma como tenho programar as coisas, nada mais. E eu prefiro não usar argumentos, por vários motivos que agora não vou explicar. Mas no fundo vai dar ao mesmo, só que um metodo dá mais trabalho que o outro e eu prefiro optar pelo mais fácil que no fundo, da menos trabalho e na minha perspectiva é melhor.

Depois confiares na Session com REQUEST URI, e obrigares a que o site receba refereer vai fazer com que os bookmarks dos utilizadoers não funcionem para o teu site.

Explica-me a paranóia de não pores argumentos.

Não vou obrigar o site nada, nem os bookmars dos utilizadores iriam deixar de funcionar. Até porque eu já disse que não vou confiar no REQUEST_URI mas sim no QUERY_STRING. E ai não vai haver falhas, a página a carregar esta definida na QUERY_STRING... Problem solved.

0

Partilhar esta mensagem


Link 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