.phtml 파일을 얇고 깨끗하게 유지하는 방법?


14

파일 확장자에서 알 .phtml수 있듯이 파일을 사용하면 PHP 코드를 HTML과 혼합 할 수 있습니다. 그러나, 당신 이 야생으로 갈 수있는 라이센스로 간주되어서 안된다는 사실 .

왜 아직도 많은 PHP로 수 많은 .phtml 파일을 볼 수 있습니까? 그리고 .phtml파일 에서 PHP의 양을 줄이는 좋은 방법은 무엇 입니까?

답변:


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. .phtml 대신 블록에 PHP를 최대한 많이 넣으십시오.

  3. 위의 내용을 돕기 위해 블록 에서 .phtml에서 assign(‘myvar’, [expression])참조 할 수없는 $ 변수를 만드는 데 사용 $this->...하므로 실제로 간결 할 수 있습니다<?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. 그렇습니다. 약간의 마술이지만 처음에는 모든 관례에 해당됩니다. .phtml 파일에서 $ this를 사용하면 처음 볼 때 마술처럼 보였습니다. 이제 나는 그것을 이해하고 괜찮습니다. 패턴과 규칙을 배우는 문제입니다. 코드 완성이 중요합니다. 그러나 건축 프로그래밍 결정에 대해 충분히 정교하지 않은 도구에서 실용주의를 배치하는 것이 공정한 요구입니까?
fris

가능한 한 작은 마술로 사용 이다 건축 결정. 나쁜 신호 인 코드 기반으로 작업하기 위해 추가 도구가 필요한 경우 ... 공정하게 말하면 Magento는 이러한 결정을하지 않았지만 최선을 다하기 위해 노력할 수 있습니다.
Fabian Schmengler

멋진 쓰기 fris. 파트 할당을 제외한 모든 포인트에 동의합니다. 그 이유는 다른 개발자에게 마법 변수를 찾기가 너무 어려워지기 때문입니다. 나는 우리가 그것을 피해야한다고 생각합니다.
Rajeev K Tomy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.