4

顧客が特定の製品を購入した場合にのみ、利用規約 (agreements.phtml) を表示したいと考えています。たとえば、一部の製品には処方箋が必要です。顧客がこれらのいずれかを購入した場合、条件が表示されるようにします。

バックエンドで属性を作成しました:prescription_required

疑似コードは次のとおりです。

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

フラグが yes に設定されている場合は、agreements.phtml のコードを確認します

私が抱えている主な問題は、agreements.phmtl で製品情報を取得し、バスケットをループすることだと思います。

私が試してみました

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

しかし、何も返されません。

4

2 に答える 2

7

編集:

私はまさにあなたが達成しようとしている拡張機能を作成し、Magento Connect 経由で公開しました。リンクは次のとおりです: http://www.magentocommerce.com/magento-connect/catalog/product/view/id/14603 . ダウンロードするか、以下の手順に従ってください。拡張機能のソース コードへのリンクは、回答の下部にあります。

編集の終わり

これらはあなたがしなければならないステップです:

  1. 利用規約の表示 (または非表示) を担当する新しい商品属性を作成する
  2. チェックアウト ページで利用規約を表示するブロックを書き換える
  3. 必要な利用規約のチェックボックスがすべてユーザーによってクリックされたかどうかをチェックするヘルパーを書き直します

前提と目標:

実際に必要以上に複雑なものを作成したくないと思います。利用規約を必要とする商品がカートに少なくとも 1 つある場合、またはカートに利用規約が必要な商品がない場合は、すべての有効な利用規約を表示する拡張機能を作成する方法を説明します。これが必要になります。

また、物事を正しく処理し、コア ファイルはそのままにしておきたいと考えています。もちろん、コア機能だけを変更する方が簡単かもしれませんが、このアプローチは将来本当に問題を引き起こします。そのため、新しいモジュールを作成しています。

次に、複数の店舗がある場合、この機能はすべての店舗で必要になると思います。

最後に、Magento Community Edition 1.7 でアプローチをテストしました。他のバージョンでの動作は保証されていませんが、1.6 と 1.5 では動作するはずです。これらのバージョンのいずれかで作業している場合は、試すことができます。古いバージョンで動作するかどうかはわかりません。

新しい属性の作成:

質問の範囲外ですが、次の場合に最適です。

  • これ以上何も必要ないため、属性ははい/いいえのオプションでした
  • 属性はシステム属性だったので、すべての属性グループに追加する必要はありません

もちろん、必要に応じて、別の方法で属性を作成することもできます。

私の場合、商品属性には code が与えられましたconditional_agreements。このコードは、以下のコード スニペットで使用されています。

ブロックの書き換え

書き換える必要があるブロックは ですMage_Checkout_Block_Agreements。機能は 1 つだけgetAgreements()です。

まずは書き直しです。私のパッケージは呼び出されbartoszgorski、私のモジュールはconditionalagreementsであるため、私のコードconfig.xmlは次のとおりです。

<config>
    <!-- other code -->
    <global>
        <!-- other code -->
        <blocks>
            <checkout>
                <rewrite>
                    <agreements>Bartoszgorski_Conditionalagreements_Block_Agreements</agreements>
                </rewrite>
            </checkout>
        </blocks>
        <!-- other code -->
    </global>
</config>

ファイル自体では、ヘルパー (後で説明します) を使用して、利用規約を表示するかどうかを確認しました。私のコードは次のようになります。

public function getAgreements() {
    if(Mage::helper('conditionalagreements')->checkIfQuoteRequiresAgreements() == true) {
        return parent::getAgreements();
    } else {
        return array();
    }
}

だから、表示するものがあれば、それを表示できます。それ以外の場合はfunction、空arrayの契約を返します。

ヘルパーを書き直す:

helper書き換える必要があるのはMage_Checkout_Helper_Dataです。書き換えられていない場合helper、Magento は利用規約を表示しませんが、それでもユーザーにチェックボックスをオンにする必要があり、それはもちろん不可能です。したがって、config.xml の私のコードは次のとおりです。

<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>

には、同意する必要があるすべての条件を取得するhelper機能があります。getRequiredAgreementIds()まったく同じことをしたいのですが、それを必要とする製品がカートに少なくとも 1 つある場合に限られます。checkIfQuoteRequiresAgreements()そのため、そのような製品をチェックしてgetRequiredAgreementIds()(および前に示したように) で使用する別のヘルパー関数 (私の場合) を作成することをお勧めしblockます。したがって、書き換えにhelperは次の機能が必要です。

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;
}

以上です。これを行った後、必要なものが得られるはずです。契約条件に複数の項目がある場合は、それらすべてを表示するか、まったく表示しないかを指定できます。もちろん、私のコード スニペットに基づいてさらに何かを開発することもできます。それはあなた次第です。

これが私の完全に機能するモジュールです:

https://github.com/bgorski/conditionalagreements

私がそこで行ったことをプレビューするか、ダウンロードしてあなたのウェブサイトで使用することができます.

それが役立つことを願っています。どんなフィードバックでも大歓迎です。

于 2012-09-26T23:12:50.927 に答える
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

}

それがうまくいったかどうか教えてください...

よろしく

于 2012-09-24T15:24:20.717 に答える