Comment garder les fichiers .phtml propres et propres?


14

Comme son extension de fichier le suggère, un .phtmlfichier permet de mélanger du code PHP avec du HTML. Cependant, le fait que vous puissiez ne doit pas être considéré comme une licence pour se déchaîner.

Pourquoi voyons-nous encore autant de fichiers .phtml criblés de beaucoup de PHP? Et quelle est la bonne approche pour réduire la quantité de PHP dans un .phtmlfichier?

Réponses:


10

En effet, moins PHP est dans votre .phtmlmieux, car:

  1. le mélange du PHP et du HTML est beaucoup plus difficile à déchiffrer que chacun d'eux individuellement, en particulier pour ceux qui sont à l'aise avec un seul d'entre eux (par exemple les concepteurs frontaux)
  2. il est logique de placer l'interaction avec le code du serveur dans le bloc, loin de ce qui doit être présenté dans le navigateur - c'est l'ancien mantra de la «séparation des préoccupations».

Le fichier core de Magento en /app/design/frontend/base/default/template/catalog/product/price.phtml est un exemple douloureux. Ce code HTML de «présentation» affiche un prix. Il fait 471 lignes! Principalement à cause de la logique PHP.

Pour rendre votre .phtmlmaigre et plus propre:

  1. éviter les séquences inutiles de <?php … ?>, les regrouper en morceaux avec un seul<?php … ?>

  2. pousser autant de PHP que possible dans le Block, plutôt que dans le .phtml

  3. pour aider avec ce qui précède, dans le bloc, utilisez assign(‘myvar’, [expression])pour créer des variables $ auxquelles vous pouvez vous référer sans $this->...dans le .phtml, afin que vous puissiez avoir vraiment concis<?php echo $myvar; ?>

  4. souhaite que Magento adopte Twig à l'avenir pour un look encore plus propre

Appliquons ce qui précède sur un extrait du code d'origine de l'exemple donné ci-dessus: /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. Première étape: supprimez la répétition de <?php … ?>pour arriver à quelque chose comme ceci:

    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) ?>

Ce qui précède met tout PHP dans un seul blob de code.

2 + 3. Évoluant vers quelque chose de mieux encore, déplacez ce code dans son bloc:

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

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

Notez l'utilisation du _prepareLayout()et les assign()fonctions pour cela.

Maintenant, cette section alambiquée du .phtml peut être réduite à cette simple ligne:

<?php echo $minPrice; ?>

Je pense que nous pouvons tous vivre avec ça!


5

Beau résumé, @fris, je suis d'accord sur presque tous les points.

Le principal point à retenir est de déplacer toute la logique dans la classe de bloc et de rendre le modèle aussi "stupide" que possible.

En fait, je préfère les appels de méthode dans le modèle aux variables qui ont été "attribuées" parce que je ne veux pas perdre les fonctionnalités de navigation et d'achèvement de code IDE. "assigner" a l'air plus concis dans le modèle mais c'est beaucoup trop magique à mon goût, ce qui le rend encore pire que les getters et setters magiques.


Appréciez votre commentaire @fschmengler. Oui c'est un peu magique, mais c'est le cas avec toutes les conventions, au début. Utiliser $ this dans un fichier .phtml m'a certainement semblé magique la première fois que je l'ai vu. Maintenant je le comprends et ça va. Il s'agit d'apprendre les schémas et les conventions. L'achèvement du code est important. Mais est-il juste de placer le pragmatisme issu d'outils qui ne sont pas assez sophistiqués sur une décision de programmation architecturale?
Fris

Utiliser le moins de magie possible est une décision architecturale. Si vous avez besoin d'outils supplémentaires pour travailler avec une base de code, c'est mauvais signe ... Pour être honnête, Magento n'a pas pris cette décision, mais nous pouvons nous efforcer d'en tirer le meilleur parti.
Fabian Schmengler

cool fris de rédaction. Je suis d'accord avec chaque point sauf attribuer une partie. la raison en est qu'il devient trop difficile de trouver ces variables magiques pour un autre développeur qui passe par là. je pense que nous devrions éviter cela.
Rajeev K Tomy
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.