Como manter os arquivos .phtml magros e limpos?

14

Como sua extensão sugere, um .phtmlarquivo permite que o código PHP seja misturado ao HTML. No entanto, o fato de que você pode não deve ser visto como uma licença para ir selvagem.

Por que ainda vemos tantos arquivos .phtml repletos de muito PHP? E qual é uma boa abordagem para reduzir a quantidade de PHP em um .phtmlarquivo?

fris
fonte

Respostas:

10

De fato, quanto menos PHP você .phtmltiver, melhor, porque:

  1. a mistura de PHP e HTML é muito mais difícil de decifrar do que cada um deles individualmente, especialmente para quem se sente à vontade com apenas um deles (por exemplo, designers de front-end)
  2. faz sentido lógico colocar a interação com o código do servidor no bloco, longe do que será apresentado no navegador - esse é o antigo mantra da "separação de preocupações".

O arquivo principal do Magento /app/design/frontend/base/default/template/catalog/product/price.phtml é um caso doloroso. Este código HTML de "apresentação" exibe um preço. Tem 471 linhas! Principalmente por causa da lógica do PHP.

Para tornar seu .phtmlesbelto e limpo:

  1. Para evitar seqüências desnecessárias <?php … ?>, junte-as em pedaços com um único<?php … ?>

  2. insira o máximo de PHP possível no bloco, em vez de no arquivo .phtml

  3. Para ajudar com o exposto acima, no bloco use assign(‘myvar’, [expression])para criar $ variáveis ​​que podem ser consultadas sem $this->...no .phtml, para que você possa ser realmente conciso<?php echo $myvar; ?>

  4. deseja que o Magento adote o Twig no futuro para um visual ainda mais limpo

Vamos aplicar o acima em um trecho do código original do exemplo dado acima: /app/design/frontend/base/default/template/catalog/product/price.phtml

<?php if ($this->getDisplayMinimalPrice() && $_minimalPriceValue && $_minimalPriceValue < $_product->getFinalPrice()): ?>

    <?php $_minimalPriceDisplayValue = $_minimalPrice; ?>
    <?php if ($_weeeTaxAmount && $_weeeHelper->typeOfDisplay($_product, array(0, 1, 4))): ?>
        <?php $_minimalPriceDisplayValue = $_minimalPrice+$_weeeTaxAmount; ?>
    <?php endif; ?>
    ….
             <?php echo $_coreHelper->currencyByStore($_minimalPriceDisplayValue, $_storeId, true, false) ?>
  1. Primeiro passo: remova a repetição de <?php … ?>para chegar a algo assim:

    if ($this->getDisplayMinimalPrice() && $_minimalPriceValue && $_minimalPriceValue < $_product->getFinalPrice()) { $_minimalPriceDisplayValue = $_minimalPrice; if ($_weeeTaxAmount && $_weeeHelper->typeOfDisplay($_product, array(0, 1, 4))) { $_minimalPriceDisplayValue = $_minimalPrice+$_weeeTaxAmount; } … echo $_coreHelper->currencyByStore($_minimalPriceDisplayValue, $_storeId, true, false) ?>

O texto acima coloca todo o PHP em um único blob de código.

2 + 3. Evoluindo para algo melhor ainda, mova esse código para seu bloco:

protected function _prepareLayout() {
    $this->assign(‘minPrice’, $this->calculateMinPrice(…));
}

protected function calculateMinPrice(…) {
    if ($this->getDisplayMinimalPrice() && $_minimalPriceValue && $_minimalPriceValue < $_product->getFinalPrice()) {
       // etc...
    }
}

Observe o uso do _prepareLayout()e as assign()funções para isso.

Agora essa seção complicada do arquivo .phtml pode ser reduzida a apenas esta linha simples:

<?php echo $minPrice; ?>

Eu acho que todos nós podemos viver com isso!

fris
fonte
5

Bom artigo, @fris, concordo em quase todos os pontos.

O principal argumento é mover toda a lógica para a classe de bloco e tornar o modelo o mais "estúpido" possível.

Na verdade, prefiro chamadas de método no modelo a variáveis ​​que foram "atribuídas" porque não quero perder os recursos de conclusão e navegação do código IDE. "atribuir" parece mais conciso no modelo, mas é muito mágico para o meu gosto, tornando-o ainda pior do que os getters e setters mágicos.

Fabian Schmengler
fonte
Aprecie seu comentário @fschmengler. Sim, é um pouco de mágica, mas é o caso de todas as convenções, a princípio. Usar $ this dentro de um arquivo .phtml certamente parecia mágico para mim na primeira vez que o vi. Agora eu entendo e está tudo bem. É uma questão de aprender os padrões e convenções. A conclusão do código é importante. No entanto, é uma decisão justa colocar o pragmatismo decorrente de ferramentas que não são sofisticadas o suficiente sobre uma decisão de programação de arquitetura?
fris
Usar o mínimo de mágica possível é uma decisão arquitetônica. Se você precisar de ferramentas adicionais para trabalhar com uma base de código que seja um mau sinal ... Para ser justo, o Magento não tomou essa decisão, mas podemos nos esforçar para fazer o melhor possível.
Fabian Schmengler
fris de redação legal. Eu concordo com todos os pontos, exceto atribuir parte. o motivo é que ficou muito difícil encontrar essas variáveis ​​mágicas para outro desenvolvedor que está passando por isso. Eu acho que devemos evitar isso.
Rajeev K Tomy