Magento 1.4.1.1 を使用していますが、一部の製品の支払いオプションを無効にしたいと考えています。一部の製品については代金引換のみを表示し、その他は非表示にする必要があります。
助けてくれる人はいますか?どうすればこれを管理できますか?管理者にオプションはありますか?それともコードをカスタマイズする必要がありますか?もしそうなら、コードとファイルへの正確なパスを教えてください。
前もって感謝します。
Magento 1.4.1.1 を使用していますが、一部の製品の支払いオプションを無効にしたいと考えています。一部の製品については代金引換のみを表示し、その他は非表示にする必要があります。
助けてくれる人はいますか?どうすればこれを管理できますか?管理者にオプションはありますか?それともコードをカスタマイズする必要がありますか?もしそうなら、コードとファイルへの正確なパスを教えてください。
前もって感謝します。
支払い方法をフィルタリングする目立たない方法は、次のように呼ばれるイベントのオブザーバーを実装することです。payment_method_is_active
ステップ
1 > config.xml で「payment_method_is_active」というイベントを登録します。次の xml コードを app/code/local/MagePsycho/Paymentfilter/etc/config.xml に追加します。
...
<global>
...
<events>
<payment_method_is_active>
<observers>
<paymentfilter_payment_method_is_active>
<type>singleton</type>
<class>paymentfilter/observer</class>
<method>paymentMethodIsActive</method>
</paymentfilter_payment_method_is_active>
</observers>
</payment_method_is_active>
</events>
...
</global>
...
2> オブザーバー モデルを実装する オブザーバー ファイルを作成します: app/code/local/MagePsycho/Paymentfilter/Model/Observer.php を作成し、次のコードを貼り付けます。
<?php
/**
* @category MagePsycho
* @package MagePsycho_Paymentfilter
* @author magepsycho@gmail.com
* @website http://www.magepsycho.com
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
*/
class MagePsycho_Paymentfilter_Model_Observer {
public function paymentMethodIsActive(Varien_Event_Observer $observer) {
$event = $observer->getEvent();
$method = $event->getMethodInstance();
$result = $event->getResult();
$currencyCode = Mage::app()->getStore()->getCurrentCurrencyCode();
if($someTrueConditionGoesHere){
$result->isAvailable = true;
}else{
$result->isAvailable = false;
}
}
}
まず、これらの製品を識別するために製品属性 (名前: 'magepal_payment_filter_by_product'、タイプ: yes/no) を作成します。
たとえば、Magento v1.7 のベース
プログラムで支払いモジュールを自動有効化 https://stackoverflow.com/a/14023210/1191288を参照
適用可能なすべての支払いモジュールを有効にし、どのモジュールをどこに表示するかをフィルタリングします
/app/code/local/MagePal/PaymentFilterByProduct/etc/config.xml 内
<?xml version="1.0"?>
<config>
<modules>
<MagePal_PaymentFilterByProduct>
<version>1.0.1</version>
</MagePal_PaymentFilterByProduct>
</modules>
<global>
<helpers>
<paymentfilterbyproduct>
<class>MagePal_PaymentFilterByProduct_Helper</class>
</paymentfilterbyproduct>
<payment>
<rewrite>
<data>MagePal_PaymentFilterByProduct_Helper_Payment_Data</data>
</rewrite>
</payment>
</helpers>
</global>
</config>
/app/code/local/MagePal/PaymentFilterByProduct/Helper/Payment/Data.php 内
<?php
class MagePal_PaymentFilterByProduct_Helper_Payment_Data extends Mage_Payment_Helper_Data
{
public function getStoreMethods($store = null, $quote = null)
{
$methods = parent::getStoreMethods($store, $quote);
if(!Mage::getStoreConfig('paymentfilterbyproduct/general_option/paymentfilterbyproduct_enable', Mage::app()->getStore()) || !$quote){
return $methods;
}
//get a list of product in cart
$cart = Mage::getSingleton('checkout/session');
$specialProductInCart = array();
foreach ($cart->getQuote()->getAllItems() as $item) {
$specialProductInCart[] = $item->getMagepalPaymentFilterByProduct();
}
// if special product in cart
// need to if check $item->getMagepalPaymentFilterByProduct() return 'yes/no' or '0/1)
if(in_array('yes', $specialProductInCart)){
$filter_csv = Mage::getStoreConfig('paymentfilterbyproduct/filter_option/paymentfilter_special_products', Mage::app()->getStore());
}
else{
$filter_csv = Mage::getStoreConfig('paymentfilterbyproduct/filter_option/paymentfilter_all_product', Mage::app()->getStore());
}
$filter_array = explode(",", $filter_csv);
foreach ($methods as $k => $method){
if(!in_array($method->getCode(), $filter_array))
unset($methods[$k]);
}//methods
return $methods;
}
}
/app/code/local/MagePal/PaymentFilterByProduct/etc/system.xml 内
<?xml version="1.0"?>
<config>
<tabs>
<magepal translate="label" module="paymentfilterbyproduct">
<label>MagePal</label>
<sort_order>900</sort_order>
</magepal>
</tabs>
<sections>
<paymentfilterbyproduct translate="label" module="paymentfilterbyproduct">
<label>Payment Method Filter by Product</label>
<tab>magepal</tab>
<sort_order>1000</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
<groups>
<general_option translate="label">
<label>General Options</label>
<frontend_type>text</frontend_type>
<sort_order>1</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
<fields>
<paymentfilter_enable translate="label">
<label>Enable Payment Filter</label>
<frontend_type>select</frontend_type>
<source_model>adminhtml/system_config_source_yesno</source_model>
<sort_order>50</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
</paymentfilter_enable>
</fields>
</general_option>
<filter_option translate="label">
<label>Payment Method Filter Configuration</label>
<frontend_type>text</frontend_type>
<sort_order>2</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
<comment>Please enable all applicable payment methods in system payment config</comment>
<fields>
<paymentfilter_all_products translate="label">
<label>Select Default Payment option for All Products</label>
<frontend_type>multiselect</frontend_type>
<source_model>MagePal_PaymentFilterByProduct_ActivePaymentMethod</source_model>
<sort_order>30</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
</paymentfilter_admin>
<paymentfilter_special_products translate="label">
<label>Select Payments for Cart with Special Products</label>
<frontend_type>multiselect</frontend_type>
<source_model>MagePal_PaymentFilterByProduct_ActivePaymentMethod</source_model>
<sort_order>40</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
</paymentfilter_store>
</fields>
</filter_option>
</groups>
</paymentfilterbyproduct>
</sections>
</config>
/app/code/local/MagePal/PaymentFilterByProduct/Helper/Data.php 内
<?php
class MagePal_PaymentFilterByProduct_Helper_Data extends Mage_Core_Block_Template
{
}
/app/code/local/MagePal/PaymentFilterByProduct/ActivePaymentMethod.php 内
<?php
class MagePal_PaymentFilterByProduct_ActivePaymentMethod
{
//get all active (enable) payment method
public function toOptionArray()
{
$payments = Mage::getSingleton('payment/config')->getActiveMethods();
foreach ($payments as $paymentCode=>$paymentModel) {
if($paymentModel->canUseCheckout() == 1){
$paymentTitle = Mage::getStoreConfig('payment/'.$paymentCode.'/title');
$methods[$paymentCode] = array(
'label' => $paymentTitle,
'value' => $paymentCode,
);
}
}
return $methods;
}
}
/app/etc/modules/MagePal_PaymentFilterByProduct.xml 内
<?xml version="1.0"?>
<config>
<modules>
<MagePal_PaymentFilterByProduct>
<active>true</active>
<codePool>local</codePool>
</MagePal_PaymentFilterByProduct>
</modules>
</config>