.phtmlファイルを無駄のないきれいな状態に保つ方法


14

そのファイル拡張子が示唆するように、.phtmlファイルはPHPコードをHTMLと混合することを可能にします。ただし、あなたワイルドになるライセンスとして見られるべきではないという事実。

多くの.phtmlファイルが多くのPHPでいっぱいになっているのはなぜですか?そして、.phtmlファイル内のPHPの量を減らすための良いアプローチは何ですか?

回答:


10

実際、PHPの数が少ない.phtmlほど良いのです。理由は次のとおりです。

  1. PHPとHTMLの組み合わせは、特にそれらのうちの1つのみ(たとえば、フロントエンドデザイナー)に慣れている人にとっては、それぞれを個別に解読するよりもはるかに困難です
  2. ブラウザーに表示されるものから離れて、ブロック内のサーバーコードとの対話を配置することは論理的に意味があります。これは古い「懸念の分離」マントラです。

Magentoコアファイル /app/design/frontend/base/default/template/catalog/product/price.phtml は、適切な例です。このHTML「プレゼンテーション」コードは価格を表示します。長さ471行です!主にPHPロジックが原因です。

あなたのようにするために.phtmlスリムとクリーナー:

  1. の不要なシーケンスを回避し<?php … ?>、それらを単一のチャンクにまとめます<?php … ?>

  2. .phtmlではなく、できるだけ多くのPHPをブロックにプッシュします

  3. 上記を支援するために、ブロックで.phtml assign(‘myvar’, [expression])なし$this->...で参照できる$ variablesを作成 するために利用するので、本当に簡潔にすることができます<?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コード補完とナビゲーション機能を失いたくないので、「割り当てられた」変数よりもテンプレートのメソッド呼び出しを実際に好みます。テンプレートの「割り当て」はより簡潔に見えますが、私の好みにはあまりにも多くの魔法であり、魔法のゲッターやセッターよりもさらに悪くなります。


コメント@fschmenglerに感謝します。はい、それはちょっとした魔法ですが、最初はすべての規約に当てはまります。.phtmlファイル内で$ thisを使用することは、初めて見たときは確かに魔法のように見えました。今、私はそれを理解し、それは大丈夫です。パターンと慣習を学ぶことです。コード補完は重要です。しかし、アーキテクチャプログラミングの決定に対して十分に洗練されていないツールに由来するプラグマティズムを置くことは公正な呼びかけですか?
フリス

できるだけ少ない魔法を使用すること、アーキテクチャ上の決定です。悪い兆候であるコードベースを操作するために追加のツールが必要な場合...公平を期して、Magentoはこの決定を行いませんでしたが、最善を尽くすよう努力することができます。
ファビアンシュメングラー

クールな書き込みフリス。割り当て部分を除くすべての点に同意します。その理由は、それを経験している別の開発者にとって、それらの魔法の変数を見つけることが難しくなりすぎるからです。私たちはそれを避けるべきだと思います。
Kトミー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.