Jak dbać o czystość plików .phtml?


14

Jak sugeruje rozszerzenie pliku, .phtmlplik umożliwia mieszanie kodu PHP z HTML. Jednakże fakt, że może nie powinien być postrzegany jako licencja do szaleją.

Dlaczego wciąż widzimy tak wiele plików .phtml wypełnionych dużą ilością PHP? A jakie jest dobre podejście do zmniejszenia ilości PHP w .phtmlpliku?

Odpowiedzi:


10

Rzeczywiście, im mniej PHP w .phtmltym lepiej, ponieważ:

  1. połączenie PHP i HTML jest znacznie trudniejsze do rozszyfrowania niż każdy z nich osobno, szczególnie dla tych, którzy znają tylko jeden z nich (np. projektanci front-end)
  2. logiczne jest umieszczanie interakcji z kodem serwera w Bloku, z dala od tego, co ma być prezentowane w przeglądarce - jest to stara mantra „rozdzielania obaw”.

Plik podstawowy Magento /app/design/frontend/base/default/template/catalog/product/price.phtml jest bolesnym przykładem. Ten kod „prezentacji” HTML wyświetla cenę. Ma 471 linii! Głównie z powodu logiki PHP.

Aby twój .phtmlszczuplejszy i czystszy:

  1. unikaj niepotrzebnych sekwencji <?php … ?>, łącz je w pojedyncze kawałki<?php … ?>

  2. wpychaj jak najwięcej PHP do bloku, a nie .phtml

  3. aby pomóc z powyższym, w bloku użyj assign(‘myvar’, [expression])do utworzenia zmiennych $, do których można odwoływać się bez $this->...w pliku .phtml, dzięki czemu możesz mieć naprawdę zwięzły<?php echo $myvar; ?>

  4. chciałbym, aby Magento przyjęło Twig w przyszłości, aby uzyskać jeszcze czystszy wygląd

Zastosujmy powyższy fragment kodu z oryginalnego kodu z powyższego przykładu: /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. Pierwszy krok: usuń powtórzenie, <?php … ?>aby dojść do czegoś takiego:

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

Powyżej umieszcza wszystkie PHP w jednej kropli kodu.

2 + 3. Ewoluując w coś lepszego, przenieś ten kod do jego bloku:

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

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

Zwróć uwagę na użycie do _prepareLayout()tego assign()funkcji i.

Teraz tę zawiłą sekcję pliku .phtml można sprowadzić do tej prostej linii:

<?php echo $minPrice; ?>

Myślę, że wszyscy możemy z tym żyć!


5

Niezły opis, @fris, zgadzam się w prawie wszystkich punktach.

Główną zaletą jest przeniesienie całej logiki do klasy bloków i uczynienie szablonu możliwie „głupim”.

Właściwie wolę wywołania metod w szablonie niż zmienne, które zostały „przypisane”, ponieważ nie chcę stracić funkcji uzupełniania kodu IDE i funkcji nawigacyjnych. „przypisywanie” wygląda bardziej zwięźle w szablonie, ale jest o wiele za dużo magii na mój gust, co czyni go jeszcze gorszym niż pobieracze i ustawiacze magii.


Doceń swój komentarz @fschmengler. Tak, to trochę magii, ale na początku tak jest w przypadku wszystkich konwencji. Używanie $ wewnątrz pliku .phtml z pewnością wyglądało dla mnie magicznie, kiedy pierwszy raz go zobaczyłem. Teraz to rozumiem i jest w porządku. Chodzi o poznanie wzorców i konwencji. Uzupełnianie kodu jest ważne. Czy jednak jest to słuszne wezwanie do umieszczenia pragmatyzmu wynikającego z narzędzi, które nie są wystarczająco wyrafinowane w stosunku do decyzji dotyczącej programowania architektonicznego?
fris

Używanie jak najmniejszej magii jest decyzją architektoniczną. Jeśli potrzebujesz dodatkowych narzędzi do pracy z bazą kodu, która jest złym znakiem ... Szczerze mówiąc, Magento nie podjął tej decyzji, ale możemy starać się jak najlepiej wykorzystać.
Fabian Schmengler,

fajne pisanie fris. Zgadzam się z każdym punktem oprócz przypisania części. powodem jest to, że zbyt trudno jest znaleźć te magiczne zmienne dla innego programisty, który przez to przechodzi. myślę, że powinniśmy tego unikać.
Rajeev K Tomy
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.