En effet, moins PHP est dans votre .phtml
mieux, car:
- 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)
- 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 .phtml
maigre et plus propre:
éviter les séquences inutiles de <?php … ?>
, les regrouper en morceaux avec un seul<?php … ?>
pousser autant de PHP que possible dans le Block, plutôt que dans le .phtml
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; ?>
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) ?>
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!