Pergunta

Estou criando um site no qual diferentes páginas pode ser muito diferente dependendo de certas condições (ou seja logado ou não, formulário preenchido ou não, etc). Isto torna necessária a saída de blocos diferentes de html em momentos diferentes.

Fazer isso, no entanto, faz o meu código php olhar horrível ... realmente mexe com a formatação e "forma" do código. Como devo contornar esta situação? Incluindo personalizados funções "html dump" na parte inferior da meus scripts? A mesma coisa, mas com inclui? Heredocs (não parece muito bom)?

Obrigado!

Foi útil?

Solução

Do not panic, cada rosto programador Web fresco este problema.

Você tem que separar sua lógica de programa do seu display. Primeiro, tente fazer sua própria solução usando dois arquivos para cada página Web:

  • um com apenas o código PHP (sem HTML) que preenche variáveis ??
  • outro com HTML e muito poucos PHP: este é o seu design de página

Em seguida, incluem onde / quando você precisar dele. Por exemplo:

myPageLogic.php

<?php

// pure PHP code, no HTML

$name = htmlspecialchars($_GET['name']);
$age = date('Y') - htmlspecialchars($_GET['age']);

?>

myPageView.php

// very few php code
// just enought to print variables
// and some if / else, or foreach to manage the data stream

<h1>Hello, <?php $name ?> !</h1>

<p>So your are <?php $age?>, hu ?</p>

(Você pode querer usar o sintaxe PHP alternativa para este. Mas não tente duro para torná-lo perfeito pela primeira vez, realmente.)

myPage.php

<?php

require('myPageLogic.php');
require('myPageView.php');
?>

não se preocupar com problemas de desempenho por agora . Esta não é sua prioridade como um novato. Esta solução é imperfeito, mas vai ajudá-lo a resolver o problema com o seu nível de programação e vai te ensinar o básico.

Em seguida, uma vez que seu está confortável com este conceito, comprar um livro sobre o padrão MVC (ou olhar para as entradas de estouro de pilha sobre isso). Que o que você quer fazer o A PRÓXIMA VEZ . Então você vai experimentar alguns sistemas de modelagem e frameworks, mas DEPOIS . Por enquanto, apenas o código e aprender desde o início. Você pode perfeitamente código de um projeto como esse, como um novato, está tudo bem.

Outras dicas

Use uma abordagem MVC.

http://www.phpmvc.net/

Isto não é algo que você vai pegar em um par de horas. Você realmente precisa praticá-la. A coisa principal é o controlador terá acesso ao seu modelo (a camada db), fazer coisas aos seus dados e enviá-lo à vista para renderização. Esta é simplista, mas você só precisa ler e praticá-lo para compreendê-lo.

Isso é algo que eu usei para me ajudar a aprender. http://www.onlamp.com/pub/a /php/2005/09/15/mvc_intro.html

Tente separar o seu conteúdo e layout do seu código, tanto quanto possível. Toda vez que você escrever qualquer código HTML em um arquivo .php, parar e pensar "Será que este realmente pertence aqui?"

Uma solução é usar modelos. Olhada na Smarty templating sistema para uma opção muito fácil de usar.

Fazer isso, no entanto, faz o meu código php olhar horrível ... realmente mexe com a formatação e "forma" do código. Como devo contornar esta situação?

Trate o seu PHP e HTML como uma hierarquia única, com uma única estrutura de recuo, consistente. Assim, um delimitador-estrutura PHP como um 'se' ou 'para' introduz um novo nível de recuo, e seu conteúdo é sempre um conjunto equilibrado de início e de fim-tags. Essencialmente, você está fazendo a sua PHP 'bem formado' no sentido XML do termo, ou não você está realmente usando XHTML.

Exemplo:

<div class="prettybox">
    Hello <?php echo(htmlspecialchars($name)) ?>!
    Your food:
    <?php foreach($foods as $food) { ?>
        <a href="/food.php?food=<?php echo(urlencode($food)) ?>">
            <?php echo(htmlspecialchars($food)) ?>
        </a>
    <?php } ?>
    <?php if (count($foods)==0) { ?>
        (no food today)
    <?php } ?>
</div>

Seja cauteloso com o dogma religioso em torno de separar a lógica e marcação elevar sua cabeça nas respostas aqui novamente. Embora certamente você quer manter seu negócio lógica fora de seu código de saída da página, isso não significa necessariamente que uma carga de sobrecarga de usar arquivos separados, classes, modelos e estruturas é realmente necessário para o que você está fazendo. Para uma aplicação simples, é provável que seja suficiente apenas para colocar as coisas de ação / lógica no topo do arquivo e a saída da página a seguir.

(por exemplo, de um dos comentários acima, fazendo htmlspecialchars () é a funcionalidade de página de saída você definitivamente não quer colocar no bit de acção do seu PHP, misturados em todo o lógica de negócios. texto Mantenha sempre tão simples, cordas unescaped até o ponto em que deixa a sua lógica de aplicação. Se digitação 'echo (htmlspecialchars (...))' o tempo todo é muito prolixo, você sempre pode fazer uma função com uma breve nome como 'h' que faz o mesmo.)

A partir do som do seu problema, parece que você pode não ter muito a separação entre a lógica ea apresentação em seu código. Quando instalar uma aplicação esta é uma consideração muito importante, por razões exatamente demonstradas pela situação a sua enfrentando atualmente.

Se você não tiver já eu dar uma olhada em alguns PHP motores, como Smarty templates .

Em casos como que eu escrever tudo de forma incremental em uma variável ou às vezes uma matriz e, em seguida, ecoam a variável / matriz. Ele tem a vantagem adicional de que a página sempre rende de uma só vez, em vez de progressivamente.

O que eu acabo fazendo nesta situação é a construção de 'modelo' arquivos de dados HTML que eu Incluir e, em seguida, analisar através de expressões regulares. Ele mantém o código limpo, e torna mais fácil para peças de mão off para um designer, ou outra pessoa HTML.

Confira os ideais por trás práticas de programação MVC em Wikipedia

Você precisa de um quadro. Isto não só irá tornar seu código muito (por causa do padrão MVC já mencionados, MVC) - que vai lhe poupar tempo por causa dos componentes que já estão escritas para ele.

Eu recomendo Qcodo, é incrível; há outros - CakePHP, Symfony

.

Se é um grande projeto de um quadro poderia estar em ordem. Se não, criar alguns arquivos de modelo e no topo da página decidir qual arquivo de modelo para incluir.

Por exemplo

if ($_SESSION['logged_in'])
     include(TPL_DIR . 'main_logged_in.tpl'); 
else
     include(tPL_DIR . 'main.tpl');

apenas um exemplo simples

como mencionado acima .. você está reparando o sintoma, não o problema ..

O que você precisa é a separação da lógica e apresentação. Que pode ser feito com algum tipo de framework MVC. Mesmo se você não quer ir todo o caminho com um framework MVC .. Um motor de templates é uma obrigação pelo menos se a sua lógica é complicada o suficiente para que você tiver problemas com o que você está explicando

Eu sugiro fortemente savant vez de sabe tudo,

  • Você não tem que aprender uma nova "linguagem" de templates, a fim de criar modelos, modelos de savant são escritas em PHP
  • Se você não quiser usar php você pode definir o seu próprio "idioma" template com um compilador
  • é facilmente extensível por seus próprios objetos php

separar a lógica da apresentação não significa que tudo o que a lógica de negócios tem que estar em php e sua lógica de apresentação em outra coisa, a separação é uma coisa conceitual, você hae para separar a lógica que prepara os dados formam o que mostra que . Obviamente a lógica do negócio não tem de conter elementos de apresentação.

Em vez de implementar sistemas de templates em cima de um sistema de templates (PHP em si), criando sobrecarga por padrão, você pode ir para uma solução mais robusta como XSL Transformations , que também em conformidade com a MVC Princples (desde que você separar seus dados-recuperação, mais, eu, pessoalmente, dividir a lógica de exibir o XML com diferentes arquivos)

.

Imagine ter as seguintes informações em uma matriz, o que você deseja exibir em uma tabela.

Array
{
  [car] => green
  [bike] => red
}

Você facilmente criar um script que gera essas informações em XML:

echo "<VEHICLES>\n";
foreach(array_keys($aVehicles) as $sVehicle)
  echo "\t<VEHICLE>".$sVehicle."</NAME><COLOR>".$aVehicles[$sVehicle]."</COLOR></VEHICLE>\n";
echo "</VEHICLES>\n";

resultando no seguinte XML:

<VEHICLES>
  <VEHICLE>
    <NAME>car</NAME>
    <COLOR>green</COLOR>
  </VEHICLE>
  <VEHICLE>
    <NAME>bike</NAME>
    <COLOR>red</COLOR>
  </VEHICLE>
</VEHICLES>

Agora tudo isso é excelente, mas isso não será exibido em um formato agradável. Este é o lugar onde XSLT vem com um código simples, você pode transformar isso em uma tabela:.

<xsl:template match="VEHICLES">
  <TABLE>
    <xsl:apply-templates select="VEHICLE">
  </TABLE>
</xsl:template>

<xsl:template match="VEHICLE">
  <TR>
    <TD><xsl:value-of select="NAME"></TD>
    <TD><xsl:value-of select="COLOR"></TD>
  </TR>
</xsl:template>

Et voila, você tem:

<TABLE>
  <TR>
    <TD>car</TD>
    <TD>green</TD>
  </TR>
  <TR>
    <TD>bike</TD>
    <TD>red</TD>
  </TR>
</TABLE>

Agora, para este exemplo simples, este é um pouco de exagero; mas para estruturas complexas em grandes projectos, esta é uma maneira absoluta para manter a sua lógica de script longe de sua marcação.

Marque esta questão sobre a separação PHP e HTML, existem várias maneiras de fazer isso, incluindo sistemas de modelagem auto escrita, sistemas tais como Smarty, PHP templates como um sistema de templates, por si própria, etc etc etc ...

Eu acho que você tem duas opções aqui, quer usar um Framework MVC ou usar a maneira preguiçosa de templates que iria colocar uma sobrecarga significativa em seu código. Obviamente, eu estou com o primeiro, eu acho que aprender MVC é um dos melhores truques de desenvolvimento web no livro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top