2013-03-28 2 views
0

가상 제품이 포함 된 플러그인이 있습니다 (VISIBILITY_NOT_VISIBLE). 그것은 가상 제품입니다.Magento 1.7의 리오더/사이드 바는 보이지 않는 제품을 보여줍니다 - 이전 버전에서 작동

그러나 위젯 "내 주문"에는 표시되지만 Magento 1.7에서만 표시됩니다. 그것은 1.6과 1.5에서 잘 작동합니다. 나는 Mage/Sales/Block/Reorder/Sidebar.php에서 getItems() 방법으로 테스트했으며 정확한 VISIBILITY_NOT_VISIBLE 상태를 가지고 있습니다.

  1. magento 1.6에서 1.7 사이에 어떤 점이 변경 되었습니까? 나는 코드베이스에서 차이점을 발견 할 수 있지만이 동작의 원인이 될 수있는 것은 아닙니다.

  2. 1.7에 표시되는 버그 일 수 있으십니까?

  3. 원본 코드베이스를 건드리지 않고도이 문제를 무시할 수 있습니까?

+0

플러그인 이름은 무엇입니까? – Meabed

+0

직접 개발했습니다.나는 코드를 공유하거나 개발자 환경에 접근 할 수있다. 링크는 다음과 같다 : http://www.magentocommerce.com/boards/viewthread/327899/ – shredding

+0

당신의 질문은 모호하다. 항목이 1.6과 1.7 모두에서'getItems()'에 있었는지 여부는 확실하지 않습니다. 위에서 언급 한 블록에 해당하는 블록 템플릿'/ app/design/frontend/base/default/template/sales/reorder/sidebar.phtml '을 사용하고 있습니까? 맞춤 코드 또는 템플릿을 사용하는 경우 게시하십시오. 또한 원하는 동작을 게시하십시오. –

답변

2

정확합니다. 나는 이것이 버그인지 잘 모르겠다. (하지만 기능적으로 현명하다. 버그 일 것이다.)

그래서 1.6 (및 이전 버전)/1.7의 차이는 다음과 같습니다

모델

Mage_Sales_Model_Order

protected function _getItemsRandomCollection($limit, $nonChildrenOnly = false){ 

     $(...)->setVisibility(Mage::getSingleton('catalog/product_visibility')->getVisibleInSiteIds()) // This is Visibility check (its fine) 
      foreach ($collection as $item) { 
       $product = $productsCollection->getItemById($item->getProductId()); 
       if ($product) { 
        $item->setProduct($product); // Set Object Data ('product') if it exists 
       } 
      } 

} 

그래서이 방법을 가지고 있습니다 마지막으로 주문한 아이템 컬렉션에있는 이전 코드 erty는 반환 된 제품 객체와 반환되지 않은 객체를 보유하는 '제품'이라고합니다.

위의 코드는 문제가 없으며 아무런 문제가 없습니다. 모델

에서

Mage_Sales_Block_Reorder_Sidebar

getItems 방법은 다음과 같습니다

/** 
* Get list of last ordered products 
* 
* @return array 
*/ 
public function getItems() 
{ 
    $items = array(); 
    $order = $this->getLastOrder(); 
    $limit = 5; 

    if ($order) { 
     $website = Mage::app()->getStore()->getWebsiteId(); 
     foreach ($order->getParentItemsRandomCollection($limit) as $item) { 
      if ($item->getProduct() && in_array($website, $item->getProduct()->getWebsiteIds())) { 
       $items[] = $item; 
      } 
     } 
    } 

    return $items; 
} 

=================== ========================================================================================================== ============ Magento 1.6 및 이전 버전

으로 전화 할 때 $ item-> getProduct(); (- 제품 인스턴스 - Mage_Catalog_Model_Product) 사이드 블록,

그것은 객체 속성 반환 (_getItemsRandomCollection())

상기 방법으로 설정되거나 설정되지 않은 경우에는 NULL 반환한다.이 제품 객체를 반환하는 경우

그래서 항목은 ============= 사이드 바 블록에 표시됩니다 그렇지 않은 경우 반환 배열은 가상 항목이

포함되지 않습니다 ========================================================================================================== ==================

당신이 $ 항목 -> getProduct를 호출 젠토 1.7에서 (); 사이드 블록,

=== >>이 방법은 모델에서 구현

Mage_Sales_Model_Order_Item

는 메소드를 호출 할 때, 그것은 (그것을 모델에서 실행될 객체 속성을 찾지 않습니다.)

그래서 방법 (_getItemsRandomCollection은()) 때문에 보이지 또는 무언가 (객체 속성 '제품'을 설정하지 않은 경우는 경우

/** 
* Retrieve product 
* 
* @return Mage_Catalog_Model_Product 
*/ 
public function getProduct() 
{ 
    if (!$this->getData('product')) { // If no object attribute set with name ('product') 
     $product = Mage::getModel('catalog/product')->load($this->getProductId()); // it will always return product instance with that product id. 
     $this->setProduct($product); // set it to the current sidebar item 
    } 

    return $this->getData('product'); // return the object property 'product' 
} 

그래서 메소드 구현을 살펴 경우 이 방법은

예 나는이 버그 고려한다. 직접 시정 또는 아무것도 확인하지 않고 제품 ID에 의해 할당하고이 고정 될 필요가

그 이유에 대한 대답은

================== ===========================

해결책은 매우 간단합니다.

1. 맞춤 모듈을 만듭니다.

2. 모델을 확장/다시 작성하십시오.

Mage_Sales_Model_Order_Item

3.Override 방법 및 (코멘트 코드 블록) 또는 방법에서의 가시성 검사를 추가한다.

해결 방법 1 (항목 제품을 설정하는 코드 블록에 주석 달기).

/** 
* Retrieve product 
* 
* @return Mage_Catalog_Model_Product 
*/ 
public function getProduct() 
{ 
    /** comment from here 
    *if (!$this->getData('product')) { 
    * $product = Mage::getModel('catalog/product')->load($this->getProductId()); 
    * $this->setProduct($product); 
    *} 
    * Till here. 
    */ 
    return $this->getData('product'); 
} 

또는

해결 방법 2 : 아래와 같은 방법으로 가시성 검사를 추가합니다.

/** 
* Retrieve product 
* 
* @return Mage_Catalog_Model_Product 
*/ 
public function getProduct() 
{ 
    if (!$this->getData('product')) { 
     $product = Mage::getModel('catalog/product')->load($this->getProductId()); 
     if(!$product->isVisibleInSiteVisibility()) // add visibility check here 
     { 
      $this->setProduct($product); 
     } 
    } 

    return $this->getData('product'); 
} 

나는 이것을하는 데 약간의 시간을 보냈다.

+0

좋아, 이것은 지금까지 stackoverflow에있어 최고의 답변입니다. 나는 여기에 많은 시간을 보내고 있지만, 나는 magento에 익숙하지 않기 때문에 조금 제한되어있었습니다. 고마워요! – shredding

+1

버그 리포트를 작성하는 것이 가치가 있을지도 모른다. 나는 이것에 대한 피드백을 얻으려고 노력할 것이다. – shredding

+1

그것이 당신을 도왔다 니 기쁩니다 :) 환영합니다. – Meabed