2010-04-22 3 views
0

Mage_Catalog_Block_Product_View를 확장하려고합니다. 내 로컬 디렉토리에서 내 버전에 설치했는데 모든 것이 잘 작동하지만 점점 커지지 않았습니다. 내가 원하는 결과. 나는 또 다른 반이 그 반을 확장했다는 것을 알았다. 그것은 나의 수업에서 설정되었던 무엇이라도 고치는 것처럼 보였다. 나는 내 수업이 잘 작동하고 있다는 것을 압니다. 그 클래스의 하위 클래스 인 다른 클래스가 있습니다. parent 클래스를 호출하고있는 메소드와 동일한 메소드로 메소드를 호출합니다. 클래스를 오버라이드 할 때 클래스가 실행되고 클래스가 실행되면 원래 클래스가 실행됩니다. 방법 나는 무시하고 내 아니라고parent :: method를 사용하여 다른 클래스에서 호출 한 클래스를 어떻게 오버라이드합니까?

이 내가이 알고 명심, 다음과 같이 조금 수정하려고

class Mage_Review_Block_Product_View extends Mage_Catalog_Block_Product_View 
protected function _prepareLayout() 
{ 
    $this->getLayout()->createBlock('catalog/breadcrumbs'); 
    $headBlock = $this->getLayout()->getBlock('head'); 
    if ($headBlock) { 
     $title = $this->getProduct()->getMetaTitle(); 
     if ($title) { 
      $headBlock->setTitle($title); 
     } 
     $keyword = $this->getProduct()->getMetaKeyword(); 
     $currentCategory = Mage::registry('current_category'); 
     if ($keyword) { 
      $headBlock->setKeywords($keyword); 
     } elseif($currentCategory) { 
      $headBlock->setKeywords($this->getProduct()->getName()); 
     } 
     $description = $this->getProduct()->getMetaDescription(); 
     if ($description) { 
      $headBlock->setDescription(($description)); 
     } else { 
      $headBlock->setDescription($this->getProduct()->getDescription()); 
     } 
    } 

    return parent::_prepareLayout(); 
} 

는 제목 접두사와 접미사하지만이 기능을이다

제품 페이지에만 필요했고 설명에 텍스트를 추가해야했습니다.

class MyCompany_Catalog_Block_Product_View extends Mage_Catalog_Block_Product_View 
protected function _prepareLayout() 
{ 
    $storeId = Mage::app()->getStore()->getId(); 
    $this->getLayout()->createBlock('catalog/breadcrumbs'); 
    $headBlock = $this->getLayout()->getBlock('head'); 
    if ($headBlock) { 
     $title = $this->getProduct()->getMetaTitle(); 
     if ($title) { 
      if($storeId == 2){ 
       $title = "Pool Supplies Fast - " .$title; 
      $headBlock->setTitle($title); 
     } 
      $headBlock->setTitle($title); 
     }else{ 
      $path = Mage::helper('catalog')->getBreadcrumbPath(); 

      foreach ($path as $name => $breadcrumb) { 
       $title[] = $breadcrumb['label']; 
      } 
      $newTitle = "Pool Supplies Fast - " . join($this->getTitleSeparator(), array_reverse($title)); 
      $headBlock->setTitle($newTitle); 
     } 
     $keyword = $this->getProduct()->getMetaKeyword(); 
     $currentCategory = Mage::registry('current_category'); 
     if ($keyword) { 
      $headBlock->setKeywords($keyword); 
     } elseif($currentCategory) { 
      $headBlock->setKeywords($this->getProduct()->getName()); 
     } 
     $description = $this->getProduct()->getMetaDescription(); 
     if ($description) { 
      if($storeId == 2){ 
       $description = "Pool Supplies Fast - ". $this->getProduct()->getName() . " - " . $description; 
       $headBlock->setDescription(($description)); 
      }else{ 
       $headBlock->setDescription(($description)); 
      } 

     } else { 
      if($storeId == 2){ 
       $description = "Pool Supplies Fast: ". $this->getProduct()->getName() . " - " . $this->getProduct()->getDescription(); 
       $headBlock->setDescription(($description)); 
      }else{ 
       $headBlock->setDescription($this->getProduct()->getDescription()); 
      } 

     } 
    } 

    return Mage_Catalog_Block_Product_Abstract::_prepareLayout(); 
} 

이 잘 executs하지만 나는 다음 클래스 Mage_Review_Block_Product_View_List이 Mage_Review_Block_Product_View를 확장하고 그뿐만 아니라 Mage_Catalog_Block_Product_View을 확장하는 확장 알 수 있습니다. 이 클래스 내부 그들은뿐만 아니라 _prepareLayout를 호출하고 부모와 부모를 호출 :: _ prepareLayout()

class Mage_Review_Block_Product_View_List extends Mage_Review_Block_Product_View 
protected function _prepareLayout() 
{ 
    parent::_prepareLayout(); 

    if ($toolbar = $this->getLayout()->getBlock('product_review_list.toolbar')) { 
     $toolbar->setCollection($this->getReviewsCollection()); 
     $this->setChild('toolbar', $toolbar); 
    } 

    return $this; 
} 

그래서 분명히 이것은 단지 내가 확장하고 같은 클래스를 호출하고 내가 overiding하고 기능을 실행하지만, 그렇지 않습니다 그것은 내 클래스 계층 구조에 없기 때문에 내 클래스에 도착하기 때문에 그것은 부모 클래스의 모든 물건이 내가 설정 한 것을 무시합니다.

이런 유형의 클래스와 메소드를 확장하는 가장 좋은 방법은 확실치 않습니다.이를 수행하는 좋은 방법이 있어야합니다. 이러한 메소드를 오버라이드하려고 할 때 문제가 있음을 계속 발견합니다. 추상 클래스에서 파생 된, 너무 많은 클래스를 무시하고 부모 호출 :: 메서드를 호출하는 것 같습니다.

이러한 기능을 무시하는 가장 좋은 방법은 무엇입니까?

답변

3

게시물이 약간 불분명하다,하지만 난 경우에만 상속의 하단에 클래스를 오버라이드 (override) 할 수 있다는 젠토 제한으로 실행하고 생각 체인.

다음은 Magento의 재정의 시스템 작동 방식입니다. 예를 들어 모델을 사용 하겠지만 헬퍼와 블록에도 적용됩니다.

Magento는 재정의 할 수있는 클래스를 인스턴스화해야 할 때 new 키워드를 사용하지 않습니다.

$foo = new FooBar(); 

대신 static factory 메소드가 전역 Mage 객체에서 호출됩니다. getModel이 무엇

$foo = Mage::getModel('foo/bar'); 

실제 클래스 이름에 문자열 "foo는/바"를 켭니다. 이는 일련의 규칙을 기반으로 수행되며, 그 중 하나는 모든 모듈 구성에서 모든 재정의를 확인하는 것입니다. 클래스 이름이 결정되면 객체가 인스턴스화됩니다.

잘 작동하지만, 만 클래스의 인스턴스를 무시할 수 있습니다. 부모 클래스의 메소드를 오버라이드 할 수있는 방법은 없습니다. 그 방법은 일반적인 PHP 메커니즘을 통해 상속되기 때문입니다.

명확한 설명 : 그래서, 당신이

class Bar 
{ 
    public function example() 
    { 
    } 
} 

class Foo extends Bar 
{ 
    public function example() 
    { 
     return parent::example(); 
    } 
} 

확장하는 클래스의 푸가 있다고 가정하자 누군가가 Foo 객체를 인스턴스화하고를 호출 할 때 당신은

//magento configured ot use Baz in place of Bar 
class Baz 
{ 
} 

같은 뭔가 class Bar를 오버라이드 (override) 예를 들어 parent 클래스를 덮어 썼습니다. Magento 설정의 ss Bar.

+0

감사합니다. Alan, 체인의 맨 아래에있는 하위 클래스를 재정의해야한다는 것을 이해합니다. 따라서 Mage_Catalog_Block_Product_View를 확장하는 대신 Mage_Review_Block_Product_View_List를 확장하는 것이 좋습니다. 리뷰에 포함 된 이후로 확장하는 것이 이상하게 보입니다. . 어떤 수업을 연장해야하는지 쉽게 알 수 있습니까? "하지만 클래스의 인스턴스화 만 재정의 할 수 있습니다."라는 말은 클래스를 호출하는 마지막 클래스를 의미하는 것입니까? 그런데 당신 기사에서 대부분의 Magento 개발을 배웠습니다 –

+0

내가 무엇을 몰고 왔는지에 대한 소식을 업데이트하십시오. 다행이 유용하다고 생각합니다! –

+0

아아 네, 그게 당신이 의미하는 줄 알았습니다. 그래서 유일한 옵션은 푸를 확장하는 것이 맞지 않을지라도 추측합니다. –

1

클래스를 올바르게 재정의 했습니까?

+0

예 모든 것이 올바르게 설정 되었기 때문에 모든 것이 올바르게 설정되었으므로 디버깅하고 작동하는지 확인했기 때문에 모든 것이 올바르게 설정되었습니다. 그냥 다른 클래스가 실행되고 parent :: _ prepareLayout()을 호출하는 것은 당연히 클래스 대신 Mage_Catalog_Block_Product_View를 호출합니다. –

+0

예, 부모 클래스 인 Mage_Catalog_Block_Product_View가 있기 때문에 정상입니다. 클래스를 확장하는 메커니즘은 간단하기 때문에 클래스 X가 Mage_Catalog_Block_Product_View를 확장한다고 가정합니다. 클래스 X는 Mage :: getBlock을 확장합니다 (예 : 'catalog/product_review') - 그렇게 무시할 수 있습니다. 유일한 해결책은 부모 호출 클래스를 재정의하고 _prepareLayout도 수정하는 것입니다. – matei

+0

예, 확장했는데 무엇을해야할지 확신하지 못했습니다. 내 _prepareLayout에있는 모든 것을 넣었을 것입니다. 왜냐하면 정적 함수가 아니고 내 클래스 계층의 다른 클래스이기도하기 때문에 MyClass :: _ prepareLayout()을 호출 할 수 없기 때문입니다. 저는 사람들이 확장 기능을 통해이 클래스를 확장한다고 생각해야합니다.하지만 둘 다 수정해야한다고 생각합니다. –

1

작동하지 않습니다 당신이 확장하고 당신이 생각 명확 단어에 설명 해주십시오, 예라면 (나는 당신이이 클래스를 재정의 알을 젠토을 수 있도록 모듈의 config.xml 파일에 < 재 작성 > 태그를 넣어 의미) 세 가지 여기에 옵션이 있습니다 : 그들은 제대로 클래스에서 내려 있도록

  1. 재정의 모든 하위 클래스뿐만 아니라 (또는 적어도 어떤 방법으로 클래스를 호출).

  2. app/code/local/ 폴더에 상위 클래스를 두어 Magento가 기본 클래스가 아닌 상위 클래스를 찾습니다. 따라서 디렉토리 app/code/local/Mage/Catalog/Block/Product/을 만들고 View.php를 복사하십시오. 하지만 Varien이 클래스에 변경 한 사항을 병합해야하므로 업그레이드하는 경우 문제가 될 수 있습니다.

  3. 템플릿을 다시 작성하고 변경합니다. _prepareLayout 메서드의 변경 사항을 염려 할 필요가 없으므로이 옵션이 가장 좋습니다.도움이

희망, 조

+0

1. 그래,이 일은 내가하려고하는 단순한 일을하는 것 같아서 더 좋은 방법이 있어야한다고 생각했다. 2. 나는 이걸 영원히 어지럽히고 나면 아마 그렇게 할 것입니다. 3.나는 단지 제품 페이지에 대한 메타 제목과 설명을 변경하려고하기 때문에 템플릿에서 어떻게 변경할지 모르겠다. 설명을 위해 제품 이름을 가져야한다. –

관련 문제