編集:
私はまさにあなたが達成しようとしている拡張機能を作成し、Magento Connect 経由で公開しました。リンクは次のとおりです: http://www.magentocommerce.com/magento-connect/catalog/product/view/id/14603 . ダウンロードするか、以下の手順に従ってください。拡張機能のソース コードへのリンクは、回答の下部にあります。
編集の終わり
これらはあなたがしなければならないステップです:
- 利用規約の表示 (または非表示) を担当する新しい商品属性を作成する
- チェックアウト ページで利用規約を表示するブロックを書き換える
- 必要な利用規約のチェックボックスがすべてユーザーによってクリックされたかどうかをチェックするヘルパーを書き直します
前提と目標:
実際に必要以上に複雑なものを作成したくないと思います。利用規約を必要とする商品がカートに少なくとも 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
私がそこで行ったことをプレビューするか、ダウンロードしてあなたのウェブサイトで使用することができます.
それが役立つことを願っています。どんなフィードバックでも大歓迎です。