O eco do código Javascript é baseado em uma lógica do lado do servidor considerada prejudicial?

Como isso:

 setSomeStuffUp();  doSomeOtherStuff();  breakSomeStuffDown();  

Chegou em algo como este no trabalho, feito com plantação (Smarty), então parece um pouco mais limpo – mas não por muito! Também faz eco de algumas variables ​​de modelo usadas para coisas como seletores jQuery e outros pequenos bits de aparência desagradável.

Qual é a maneira correta de fazer isso? Carregue os dados que precisam ser usados ​​para lógica no JS como JSON via AJAX? Atributos de dados HTML?

Algo sobre isso apenas cheira ruim, ruim, ruim.

Obrigado a todos.

É uma má prática usar o idioma X para gerar código na linguagem Y.

Tente “desacoplar” as duas línguas, por exemplo, assim:

  

Desta forma, o PHP apenas se preocupa em preencher a estrutura de dados e o JavaScript apenas se preocupa em consumir a estrutura de dados.

Echoing as variables ​​de configuração e algum código de boot do javascript do servidor não soam muito ruins em geral, mas se essas peças js-injection-from-server estiverem por todo o lugar, então você está certo, é feio, pelo menos porque esse código é difícil de gerenciar.

Basta tentar centralizar qualquer tipo de boot e fazer o resto em lógica de JavaScript do lado do lado estático definido.

UPD. @Oscar Jara está falando sobre o mesmo e forneceu uma boa ilustração. Mas, muitas vezes, mesmo esses casos podem ser evitados se a lógica do lado do servidor fornecer dados para processamento de JavaScript via HTML (afinal, é isso que o HTML é).

Aqui está um exemplo trivial que muitas vezes você pode encontrar. Digamos que você deseja exibir uma galeria que será aprimorada em um carrossel via JavaScript.

HTML gerado por servidor:

 
  • Pessoalmente, uso PHP em JS em muitos casos. Às vezes, é preencher uma variável com dados JSON, um id de página ou algo dessa natureza. No que me diz respeito, o PHP foi projetado para escrever o código que aparece na página, e a JS foi projetada para interagir com o usuário uma vez que o conteúdo esteja lá.

    Eu entendo o que você está dizendo, na medida em que provavelmente há maneiras mais limpas de fazer isso. Você mencionou o AJAX, que provavelmente seria mais limpo e definitivamente ajudaria o stream do documento em saída. A única questão é que você deve fazer um segundo pedido para o servidor para uma variável muito simples e variável. Alguns milissegundos não são enormes, mas no site de produção, você provavelmente não quer fazer esse pedido adicional e encolher os resources do servidor.

    Em resposta ao que seria a maneira mais limpa de fazê-lo, se fosse um grande negócio … Eu criaria um arquivo JS separado com esse código e depois usaria o servidor para include esse arquivo individual, se necessário. Mais uma vez, não faço isso, mas acho que seria o mais limpo do modelo.

Se você quiser realmente sair, você pode ter a página HTML solicitando um arquivo .js, juntamente com seu ID de session ou algum outro indicador de quem eles são, operar a chamada .js como uma chamada PHP, criar dinamicamente a JS com base no que a sua session exige e, em seguida, a devolvê-lo ao navegador como um tipo de arquivo .js.

Mas isso é muito trabalho.

Se você quiser algo que cheira menos, faça o despejo do PHP uma cadeia JSON no final do arquivo:

 var cfg_string = "{\"username\":\"Norguard\", \"new_messages\":[......]}"; // client $cfg_obj = array(); // whole lot o'PHP $json_encoded_cfg = json_encode($cfg_obj); echo "var cfg_string = {$json_encoded_cfg};" //server-side 

E, em seguida, analise, no cliente para maior segurança …

… ou simplesmente crie um mapa no modelo:

 $cfg_string = "var dataMap = {"; foreach ($cfg_obj as $key => $val) { // print key:val all pretty-like, // handle commas (ie: no trailing comma at the end), indent with tabs or spaces // if you want, count the number of items so that the object closes ({}) // without any newline operator, if there are no config settings } echo $cfg_string; 

Ambos são limpos e discretos e mantêm tudo separado. Os dados de configuração / texto podem ir exatamente acima, seja qual for o seu código de boot / carregamento, e serão transmitidos como um parâmetro para essa lógica init.

Se tudo o que estiver fazendo é passar dados do idioma do lado do servidor para o código JavaScript, então está bem. Muitos pacotes de CMS lá fora fazem isso.

Eu realmente não vejo a necessidade de gerar código condicional de forma condicional no lado do servidor. Talvez haja um caso de uso, mas o JavaScript é uma linguagem em si, então por que não basta colocar a lógica no código JavaScript?