2012-09-24 3 views
4

고객이 특정 제품을 구매 한 경우에만 이용 약관 (agreements.phtml)을 표시하고 싶습니다. 예를 들어 일부 제품에는 처방전이 필요합니다. 고객이이 중 하나를 구매하면 약관이 표시되기를 바랍니다.Magento 고객이 특정 제품을 구입 한 경우 이용 약관이 있습니다

내가 백엔드의 속성을 만들었습니다

사이비 코드를 prescription_required 다음입니다 : 플래그가 yes로 설정되어있는 경우, agreements.phtml

내가 코드를 통과

Loop through products in the basket 
    if prescription_required == yes 
     set flag to yes 
    end if 
end loop 

내가 겪고있는 주된 문제는 agreements.phmtl에서 제품 정보를 얻고 바구니를 통해 반복하는 것입니다.

나는

<?php 
    $_product = Mage::getModel('catalog/product')->load($this->getData('product_id')); 
    echo $_product->getName(); 
?> 

을 시도했지만 아무 것도 반환하지 않습니다. 옵션 텍스트 필드가 있다고 가정

+0

해당 이용 약관을 장바구니 페이지, 결제 페이지 또는 다른 곳에 표시 하시겠습니까? –

+0

은 $ this-> getData ('product_id')가 전혀 설정되어 있지 않습니까? 즉, 그냥 에코를 표시하면 무엇이 표시됩니까? –

+0

여전히 답을 대답으로 선택하지 않았습니다. 그들 중 누구도 만족하지 못합니까? –

답변

7

편집 :

Magento Connect를 통해 달성하고자하는 작업을 정확하게 수행하는 확장 프로그램을 만들었습니다. 링크는 http://www.magentocommerce.com/magento-connect/catalog/product/view/id/14603입니다. 다운로드하거나 아래 단계를 수행 할 수 있습니다. 확장 소스 코드에 대한 링크는 답변의 맨 아래에 있습니다.

  1. 새로운 제품을 만들기가 이용 약관
  2. 에 대한 책임 블록을 다시 작성 표시 (여부)에 대한 책임을 속성 : 편집의 끝

    이러한 단계는 만들 필요가 있습니다 해당 이용 약관 표시 체크 아웃 페이지의

  3. 모든 책임자

    난 당신이 당신이 실제로 필요한 것보다 더 복잡한 무언가를 창조하고 싶지 않은 가정 : quired 이용 약관 체크 박스는 사용자

가정 및 목표로 클릭합니다. 장바구니에 이용 약관이 필요한 제품이 하나 이상 있거나 NONE이있는 제품이 하나 이상있는 경우 사용할 수있는 모든 이용 약관이 표시되는 확장 프로그램을 만드는 방법을 설명합니다. 카트에 제품이없는 경우 이것을 요구할 것이다.

나는 또한 일을 올바르게 만들고 핵심 파일 만 남기고 싶다고 가정합니다. 물론 핵심 기능을 수정하는 것이 더 쉬울 수도 있지만이 방법은 앞으로 문제가 발생할 수 있습니다. 이것이 우리가 새로운 모듈을 만드는 이유입니다.

다음은이 기능이 둘 이상인 경우 모든 상점에서이 기능이 필요하다고 가정합니다.

그리고 마지막으로 Magento Community Edition 1.7에서 내 접근 방식을 테스트했습니다. 다른 버전에서도 작동한다는 보장은 없지만 1.6 및 1.5에서 작동해야한다고 생각합니다. 이러한 버전 중 하나를 사용하면 시도 할 수 있습니다. 이전 버전에서 작동하는지 확신 할 수 없습니다.

새로운 속성을 만들기 :

그것은 질문의 범위를 벗어난, 그러나이 될 최고의 경우 : 우리가하지 않기 때문에

  • 속성은 예/아니오 옵션이었다 속성이 시스템 속성이었다
  • 더 아무것도 필요, 그래서 우리는 모든 속성 그룹에 추가 할 필요가 없습니다

의 물론, 필요에 따라 다른 방법으로 속성을 만들 수도 있습니다.

내 경우 제품 속성에 코드 conditional_agreements이 지정되었습니다. 이 코드는 아래의 코드 스 니펫에서 사용됩니다. 우리가 다시 작성해야하는 블록 Mage_Checkout_Block_Agreements 인 블록

를 다시 쓰기

. 그것은 하나의 기능 - getAgreements()을 가지고 있습니다.

우선 가장 먼저해야 할 일은 다시 작성하는 것입니다. 내 패키지는 bartoszgorski라고 내 모듈은 너무 config.xml 내 코드는, conditionalagreements입니다 :

파일 자체에서
<config> 
    <!-- other code --> 
    <global> 
     <!-- other code --> 
     <blocks> 
      <checkout> 
       <rewrite> 
        <agreements>Bartoszgorski_Conditionalagreements_Block_Agreements</agreements> 
       </rewrite> 
      </checkout> 
     </blocks> 
     <!-- other code --> 
    </global> 
</config> 

, 난 그냥 도우미를 사용 (나중에 설명) 우리가 어떤 용어를 표시 할 경우, 확인하고 정황. 내 코드는 다음과 같습니다.

표시 할 항목이 있으면 표시 할 수 있습니다. 그렇지 않으면 function은 빈 계약 array을 반환합니다.

도우미를 다시 쓰기 :

을 우리가 다시 작성해야하는 helperMage_Checkout_Helper_Data입니다. helper을 다시 작성하지 않으면 Magento는 이용 약관을 표시하지 않지만 사용자는 여전히 확인란을 선택해야합니다. 물론 불가능합니다. 그래서, config.xml에 내 코드는 다음 helper에서

<config> 
    <!-- other code --> 
    <global> 
     <!-- other code --> 
     <helpers> 
      <conditionalagreements> 
       <class>Bartoszgorski_Conditionalagreements_Helper</class> 
      </conditionalagreements> 
      <checkout> 
       <rewrite> 
        <data>Bartoszgorski_Conditionalagreements_Helper_Data</data> 
       </rewrite> 
      </checkout> 
     </helpers> 
     <!-- other code --> 
    </global> 
</config> 

에 동의해야 할 모든 조건을 얻기위한 책임이 기능 getRequiredAgreementIds()있다. 우리는 똑같은 작업을 원하지만 카트에 적어도 하나의 제품이 필요한 경우에만 가능합니다. 그 이유는 그러한 제품을 검사하고 getRequiredAgreementIds() (그리고 앞에서 설명한대로 block)에서 사용하는 다른 도우미 함수 (checkIfQuoteRequiresAgreements())를 만드는 것이 좋습니다.

public function getRequiredAgreementIds() 
{ 
    if($this->checkIfQuoteRequiresAgreements() == true) { 
     if (is_null($this->_agreements)) { 
      if (!Mage::getStoreConfigFlag('checkout/options/enable_agreements')) { 
       $this->_agreements = array(); 
      } else { 
       $this->_agreements = Mage::getModel('checkout/agreement')->getCollection() 
        ->addStoreFilter(Mage::app()->getStore()->getId()) 
        ->addFieldToFilter('is_active', 1) 
        ->getAllIds(); 
      } 
     } 
     return $this->_agreements; 
    } else { 
     return array(); 
    } 
} 

public function checkIfQuoteRequiresAgreements() { 
    $showAgreements = false; 
    $quote = Mage::getSingleton('checkout/session')->getQuote(); 
    foreach ($quote->getAllVisibleItems() as $quoteItem) { 
     $product = Mage::getModel('catalog/product')->load($quoteItem->getProductId()); 
     if($product->getConditionalAgreements() == 1) { 
      $showAgreements = true; 
      break; 
     } 
    } 
    return $showAgreements; 
} 

을 그리고 그것 뿐이다 : 그래서, 다시 작성 helper 그 기능이 있어야합니다. 이렇게하고 나면, 당신이 원하는 것을 가지고 있어야합니다. 이용 약관에 둘 이상의 상품이있는 경우 모든 상품을 표시하거나 표시하지 않을 수 있습니다. 물론 내 코드 단편을 기반으로 더 많은 것을 개발할 수 있습니다. 이는 귀하에게 달려 있습니다.

https://github.com/bgorski/conditionalagreements

당신은 내가 거기에 무슨 짓을 미리하거나 다운로드하여 귀하의 웹 사이트에 사용할 수 있습니다 여기에

내 완벽하게 작동하는 모듈입니다.

희망이 있습니다. 모든 피드백이 가장 높이 평가됩니다.

+0

죄송합니다. 대처해야 할 큰 수술이 있었는데 그것은 내 레이다에서 떨어졌습니다. 확장 프로그램을 다운로드하려고 시도했는데 사이트가 다운되어 사이트가 조금씩 코드를 복사했습니다. 나는 엔터프라이즈 1.12를 실행 중입니다. 내 사이트가 충돌을 일으키지는 않았지만 아무 것도하지 않는 것 같습니다. '이용 약관 사용'을 '예'로 설정하면 해당 이용 약관이 표시됩니다. 내가 그것을 아니오로 설정하면 그것을 보여주지 않습니다. "conditional_agreements"속성이 무엇으로 설정되었는지는 중요하지 않습니다. 긴 반응을 보내 주셔서 감사 드리며 죄송합니다. 다시 연락 드리겠습니다. – user1694820

+0

나는 그것을 작동하게했다 ... 그것은 나의 실수였다. 코드가 잘 작동하고 설명이 매우 유용하고 철저했습니다. – user1694820

+0

Magito에서 작동하도록 GitHub 복사본 테스트 및 확인 1.9.2.4 - 클래스 재 작성 충돌 (사이트에 이미 설치된 다른 확장)으로 인해 필요한 수정 만있었습니다. – Meogi

0

, 당신은 이런 식으로 작업을 수행 할 수 있습니다

// get your cart object 
$quote = Mage::getSingleton('checkout/session')->getQuote(); 

foreach ($quote->getItems() as $item) { 
    $productId = $item->getProductId(); 
    $product = Mage::getModel('catalog/product')->load($productId); 
    $prescriptionRequired = $product->getAttributeText('prescription_required'); 

    // code for subscription handling goes here 

} 

가이 일을 알려줘 ...

감사

+0

그는 $ _product-> getName()이 아무 것도 반환하지 않는다고 말했습니다. 그것은 그가 제품의 객체를 얻는 방법을 모른다는 것을 의미하고 그것은 주된 문제입니다. – ivantedja

+0

내 대답을 업데이트했습니다 ... – user1638055

관련 문제