如何保持.phtml文件的简洁和整洁?


14

正如其文件扩展名所示,该.phtml文件允许PHP代码与HTML混合。然而,事实上,你可以不应该被看作是一个执照去野外。

为什么我们仍然看到如此多的.phtml文件到处都是PHP?什么是减少.phtml文件中PHP数量的好方法?

Answers:


10

实际上,PHP .phtml越少越好,因为:

  1. 与单独使用PHP和HTML的组合相比,很难理解它们的组合,特别是对于那些只喜欢其中一种的人(例如前端设计师)
  2. 将与服务器代码的交互置于块中而不是在浏览器中呈现是合乎逻辑的,这是古老的“关注分离”的口头禅。

Magento核心文件 /app/design/frontend/base/default/template/catalog/product/price.phtml 就是一个令人痛苦的例子。此HTML“演示”代码显示价格。长471线!主要是因为PHP逻辑。

为了使您的.phtml身体更清洁更清洁:

  1. 避免不必要的序列<?php … ?>,将它们打包成一个大块<?php … ?>

  2. 将尽可能多的PHP推送到Block中,而不是.phtml

  3. 为了帮助上述工作,在Block中利用它assign(‘myvar’, [expression])来创建$ variables,而$this->....phtml中无需 引用它,因此您可以非常简洁<?php echo $myvar; ?>

  4. 希望Magento 将来采用Twig以获得更干净的外观

让我们将以上内容应用到上面给出的示例的原始代码中: /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. 第一步:删除重复的内容,<?php … ?>以达到以下目的:

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

上面的代码将所有PHP放在一个代码块中。

2 +3。要发展成为更好的东西,请将以下代码移入其代码块:

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

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

请注意_prepareLayout()assign()功能的使用。

现在,.phtml的复杂部分可以简化为以下简单行:

<?php echo $minPrice; ?>

我想我们都可以忍受!


5

好文章,@ fris,我几乎在所有方面都同意。

主要的收获是将所有逻辑移到块类中,并使模板尽可能“愚蠢”。

实际上,我更喜欢模板中的方法调用而不是已“赋值”的变量,因为我不想失去IDE代码的完成和导航功能。“ assign”在模板中看起来更加简洁,但对我来说却太神奇了,这使得它比魔术获取者和安装者更糟糕。


感谢您的评论@fschmengler。是的,这有点神奇,但是起初所有约定都是这样。在我第一次看到它的时候,在.phtml文件中使用$ this看起来确实很神奇。现在我明白了,很好。这是学习模式和约定的问题。代码完成很重要。但是,是否应将实用工具归因于在架构编程决策中不够复杂的工具,这是否是公平的呼吁?
2015年

使用尽可能少的魔术一项体系结构的决定。如果您需要其他工具来处理不好的代码库...公平地说,Magento并未做出此决定,但我们会努力做到最好。
Fabian Schmengler,2015年

酷写朋友。除了分配部分,我同意所有观点。原因是对于另一个正在经历它的开发人员来说,找到那些魔术变量变得太困难了。我认为我们应该避免这种情况。
拉杰夫·托米
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.