Thật vậy, càng ít PHP trong bạn .phtml
càng tốt, bởi vì:
- sự pha trộn giữa PHP và HTML khó giải mã hơn nhiều so với từng cái riêng lẻ, đặc biệt là đối với những người thoải mái chỉ có một trong số họ (ví dụ: nhà thiết kế mặt trước)
- nó có ý nghĩa logic khi đặt sự tương tác với mã máy chủ trong Khối, tránh xa những gì sẽ được trình bày trong trình duyệt - đây là "sự phân tách mối quan tâm cũ".
Các tập tin cốt lõi Magento /app/design/frontend/base/default/template/catalog/product/price.phtml
là một trường hợp đau đớn tại điểm. Mã trình bày HTML HTML này hiển thị giá. Nó dài 471 dòng! Chủ yếu là do logic PHP.
Để làm cho bạn .phtml
gọn gàng và sạch sẽ hơn:
tránh các chuỗi không cần thiết <?php … ?>
, bó chúng lại với nhau thành từng khối<?php … ?>
đẩy càng nhiều PHP càng tốt vào Khối, thay vì .phtml
để trợ giúp ở trên, trong Khối, hãy sử dụng assign(‘myvar’,
[expression])
để tạo các biến $ có thể được tham chiếu mà không có
$this->...
trong .phtml, do đó bạn có thể thực sự súc tích<?php echo $myvar; ?>
mong muốn Magento sẽ nhận nuôi Twig trong tương lai để có một diện mạo thậm chí gọn gàng hơn
Hãy áp dụng cách trên trên một đoạn trích từ mã gốc của ví dụ đã nêu ở trên: /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) ?>
Bước đầu tiên: loại bỏ sự lặp lại của <?php … ?>
việc đi đến một cái gì đó như thế này:
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)
?>
Ở trên đặt tất cả PHP vào một đốm mã.
2 + 3. Phát triển thành một cái gì đó tốt hơn, di chuyển mã này vào khối của nó:
protected function _prepareLayout() {
$this->assign(‘minPrice’, $this->calculateMinPrice(…));
}
protected function calculateMinPrice(…) {
if ($this->getDisplayMinimalPrice() && $_minimalPriceValue && $_minimalPriceValue < $_product->getFinalPrice()) {
// etc...
}
}
Lưu ý việc sử dụng _prepareLayout()
và các assign()
chức năng cho việc này.
Bây giờ, phần phức tạp của .phtml có thể được giảm xuống chỉ còn dòng đơn giản này:
<?php echo $minPrice; ?>
Tôi nghĩ tất cả chúng ta có thể sống với điều đó!