Làm thế nào để giữ các tập tin .phtml gọn gàng và sạch sẽ?


14

Vì phần mở rộng tệp của nó cho thấy một .phtmltệp cho phép mã PHP được trộn với HTML. Tuy nhiên, thực tế là bạn có thể không nên được xem như một giấy phép để đi hoang dã.

Tại sao chúng ta vẫn thấy rất nhiều tệp .phtml bị đánh cắp bởi rất nhiều PHP? Và cách tiếp cận tốt để giảm lượng PHP trong một .phtmltệp là gì?

Câu trả lời:


10

Thật vậy, càng ít PHP trong bạn .phtmlcàng tốt, bởi vì:

  1. 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)
  2. 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 .phtmlgọn gàng và sạch sẽ hơn:

  1. 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 … ?>

  2. đẩy càng nhiều PHP càng tốt vào Khối, thay vì .phtml

  3. để 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; ?>

  4. 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) ?>
  1. 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 đó!


5

Nice writeup, @fris, tôi đồng ý ở hầu hết các điểm.

Việc thực hiện chính là chuyển tất cả logic vào lớp khối và làm cho mẫu càng "ngu" càng tốt.

Tôi thực sự thích các cuộc gọi phương thức trong mẫu hơn các biến đã được "gán" vì tôi không muốn mất các tính năng điều hướng và hoàn thành mã IDE. "gán" trông ngắn gọn hơn trong mẫu nhưng lại quá nhiều phép thuật đối với sở thích của tôi, khiến nó thậm chí còn tệ hơn cả các ma thuật và setters ma thuật.


Đánh giá cao bình luận của bạn @fschmengler. Vâng, đó là một phép thuật nhỏ, nhưng đó là trường hợp với tất cả các quy ước, lúc đầu. Sử dụng $ this bên trong tệp .phtml chắc chắn trông giống như phép màu đối với tôi khi tôi nhìn thấy nó lần đầu tiên. Bây giờ tôi hiểu nó và nó ổn. Đó là vấn đề học các mô hình & quy ước. Hoàn thành mã là quan trọng. Tuy nhiên, đó có phải là một lời kêu gọi công bằng để đặt chủ nghĩa thực dụng xuất phát từ các công cụ không đủ tinh vi đối với quyết định lập trình kiến ​​trúc?
fris

Sử dụng càng ít phép thuật càng tốt một quyết định kiến ​​trúc. Nếu bạn cần các công cụ bổ sung để làm việc với cơ sở mã đó là một dấu hiệu xấu ... Công bằng mà nói, Magento đã không đưa ra quyết định này, nhưng chúng tôi có thể cố gắng làm cho nó tốt nhất.
Fabian Schmengler

fris writeup mát mẻ. Tôi đồng ý với mọi điểm trừ chỉ định một phần. Lý do là bởi vì quá khó để tìm ra các biến ma thuật cho một nhà phát triển khác đang trải qua nó. Tôi nghĩ rằng chúng ta nên tránh điều đó.
Rajeev K Tomy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.