Як зберегти .phtml файли чистими та чистими?


14

Як показує розширення .phtmlфайлу, файл дозволяє змішувати PHP-код з HTML. Тим НЕ менше, той факт , що ви можете не слід розглядати як дозвіл йти дикої природи.

Чому ми все ще бачимо стільки .phtml-файлів, на яких є багато PHP? І який хороший підхід до зменшення кількості PHP у .phtmlфайлі?

Відповіді:


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, скільки зможете в Блок, а не .phtml

  3. щоб допомогти у вищезазначеному, у Блоку скористайтеся assign(‘myvar’, [expression])для створення $ змінних, на які можна посилатися без $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 та функції навігації. "Призначити" виглядають більш стисло в шаблоні, але це занадто багато магії на мій смак, що робить його ще гірше, ніж чарівні геттери та сетери.


Вдячний за ваш коментар @fschmengler. Так, це трохи магії, але спочатку так буває з усіма умовами. Використання $ this всередині .phtml-файлу, безумовно, виглядало як чарівне для мене в перший раз, коли я його побачив. Зараз я це розумію і це добре. Це питання вивчення шаблонів та умов. Важливим є заповнення коду. Однак, чи справедливий заклик розміщувати прагматизм, що випливає з інструментів, недостатньо складних щодо рішення архітектурного програмування?
пн

Використовувати якомога менше магії - це архітектурне рішення. Якщо вам потрібні додаткові інструменти для роботи з кодовою базою, це поганий знак ... Для справедливості Magento не прийняв цього рішення, але ми можемо прагнути зробити все найкраще.
Фабіан Шменглер

класна фрі запис. Я погоджуюся з кожним моментом, крім присвоєння частини. Причина в тому, що стає важко знайти ці магічні змінні для іншого розробника, який переживає це. Я думаю, що нам слід цього уникати.
Радєєв К Томі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.