Rzeczywiście, im mniej PHP w .phtml
tym lepiej, ponieważ:
- 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)
- 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 .phtml
szczuplejszy i czystszy:
unikaj niepotrzebnych sekwencji <?php … ?>
, łącz je w pojedyncze kawałki<?php … ?>
wpychaj jak najwięcej PHP do bloku, a nie .phtml
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; ?>
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) ?>
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ć!