Wie halte ich .phtml-Dateien schlank und sauber?

14

Wie die Dateierweiterung andeutet, kann mit einer .phtmlDatei PHP-Code mit HTML gemischt werden. Die Tatsache, dass Sie es können, sollte jedoch nicht als Lizenz gesehen werden, wild zu werden.

Warum sehen wir immer noch so viele .phtml-Dateien, die mit viel PHP durchsetzt sind? Und was ist ein guter Ansatz, um die Menge an PHP in einer .phtmlDatei zu reduzieren ?

fris
quelle

Antworten:

10

In der Tat ist es umso .phtmlbesser, je weniger PHP Sie verwenden , da:

  1. Die Mischung aus PHP und HTML ist viel schwieriger zu entschlüsseln als jedes einzelne, insbesondere für diejenigen, die nur mit einem von ihnen vertraut sind (z. B. Front-End-Designer).
  2. Es ist logisch sinnvoll, die Interaktion mit dem Server-Code im Block zu platzieren, weg von dem, was im Browser dargestellt werden soll - dies ist das alte Mantra der "Trennung von Bedenken".

Die Magento-Kerndatei /app/design/frontend/base/default/template/catalog/product/price.phtml ist ein schmerzhaftes Beispiel. Dieser HTML-Präsentationscode zeigt einen Preis an. Es ist 471 Zeilen lang! Hauptsächlich wegen der PHP-Logik.

Um .phtmlschlanker und sauberer zu werden:

  1. Vermeiden Sie unnötige Abfolgen von <?php … ?>, bündeln Sie sie zu Stücken mit einem einzigen<?php … ?>

  2. Schieben Sie so viel PHP wie möglich in den Block und nicht in die .phtml-Datei

  3. Um assign(‘myvar’, [expression])dies zu $this->...erleichtern, müssen Sie im Block $ -Variablen erstellen, auf die in der .phtml-Datei nicht verwiesen werden kann, damit Sie wirklich präzise vorgehen können<?php echo $myvar; ?>

  4. Ich wünsche Magento, dass Twig in Zukunft für ein noch saubereres Aussehen übernommen wird

Wenden wir das Obige auf einen Ausschnitt aus dem Originalcode des obigen Beispiels an: /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. Erster Schritt: Entferne die Wiederholung von <?php … ?>, um zu so etwas zu gelangen:

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

Das Obige setzt alle PHP in einem einzigen Code-Blob.

2 + 3. Entwickle dich zu etwas noch Besserem und verschiebe diesen Code in seinen Block:

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

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

Beachten Sie dazu die Verwendung der _prepareLayout()und der assign()Funktionen.

Nun kann dieser verschachtelte Abschnitt der .phtml-Datei auf diese einfache Zeile reduziert werden:

<?php echo $minPrice; ?>

Ich denke, damit können wir alle leben!

fris
quelle
5

Gute Zusammenfassung, @fris, ich stimme in fast allen Punkten zu.

Der Hauptgrund ist, die gesamte Logik in die Blockklasse zu verschieben und die Vorlage so "dumm" wie möglich zu machen.

Eigentlich bevorzuge ich Methodenaufrufe in der Vorlage gegenüber Variablen, die "zugewiesen" wurden, weil ich die IDE-Code-Vervollständigung und die Navigationsfunktionen nicht verlieren möchte. "zuweisen" sieht in der Vorlage prägnanter aus, ist aber für meinen Geschmack viel zu magisch, was sie noch schlimmer macht als die magischen Getter und Setter.

Fabian Schmengler
quelle
Schätzen Sie Ihren Kommentar @fschmengler. Ja, es ist ein bisschen magisch, aber das ist zunächst bei allen Konventionen der Fall. Die Verwendung von $ this in einer .phtml-Datei sah für mich auf jeden Fall magisch aus, als ich sie zum ersten Mal sah. Jetzt verstehe ich es und es ist in Ordnung. Es ist eine Frage des Lernens der Muster und Konventionen. Code-Vervollständigung ist wichtig. Ist es jedoch eine faire Aufforderung, Pragmatismus zu platzieren, der sich aus Werkzeugen ergibt, die bei einer architektonischen Programmierentscheidung nicht ausgereift genug sind?
Freitag,
So wenig Magie wie möglich einzusetzen, ist eine architektonische Entscheidung. Wenn Sie zusätzliche Tools benötigen, um mit einer Codebasis zu arbeiten, die ein schlechtes Zeichen ist ... Um fair zu sein, hat Magento diese Entscheidung nicht getroffen, aber wir können uns bemühen, das Beste daraus zu machen.
Fabian Schmengler
coole beschreibung fris. Ich bin mit jedem Punkt einverstanden, außer einen Teil zuzuweisen. Der Grund dafür ist, dass es für einen anderen Entwickler, der dies durchläuft, zu schwierig wird, diese magischen Variablen zu finden. Ich denke, wir sollten das vermeiden.
Rajeev K Tomy