顧客が注文ごとに購入できる特定の製品の最大数量を簡単に制限できることはわかっていますが、(ネイティブまたはプラグインを使用して) CUSTOMER ごとに特定の製品の最大数量を制限することは可能ですか??
クーポンを使用したり、コードを変更したりしたくありません。ネイティブまたは拡張機能を使用してセール価格にする必要があります。
マジェント 1.5.1
顧客が注文ごとに購入できる特定の製品の最大数量を簡単に制限できることはわかっていますが、(ネイティブまたはプラグインを使用して) CUSTOMER ごとに特定の製品の最大数量を制限することは可能ですか??
クーポンを使用したり、コードを変更したりしたくありません。ネイティブまたは拡張機能を使用してセール価格にする必要があります。
マジェント 1.5.1
ネイティブにはできませんが、そのような制限を実行するモジュールを作成できます。
特定の製品 ID を持つ製品のキャンセルも返金もされていない注文を取得するリソース モデルを作成する必要があります。実際には、sales/order テーブルと sales/order_item テーブルを単純に選択するだけです。リソース モデルのメソッドは次のようになります。
public function getPurchasedProductQty(array $productIds, $customerId)
{
$select = $this->_getReadAdapter()->select();
$select
->from(array('order_item' => $this->getTable('sales/order_item')),
array(
'qty' => new Zend_Db_Expr('order_item.ordered_qty - order_item.canceled_qty - order_item.refunded_qty'),
'product_id'))
// Joining order to retrieve info about item and filter out canceled or refunded orders
->join(array('order' => $this->getTable('sales/order')),
'order.entity_id = order_item.order_id',
array())
// Limit it to the current customer
->where('order.customer_id = ?', $customerId)
// Filter out refunded and canceled orders
->where('order.state NOT IN(?)', array(
Mage_Sales_Model_Order::STATE_CLOSED,
Mage_Sales_Model_Order::STATE_CANCELED
))
// Add Product Id Condition
->where('order_item.product_id IN(?)', $productIds);
return $this->_getReadAdapter()->fetchCol($select);
}
次に、イベントを観察するsales_quote_item_collection_products_after_load
と、カートで使用される製品の制限をチェックしてカスタム ロジックを配置し、ロードされたコレクションからその製品を削除できます。このロジックは、自分で実装する必要があります。
現在ログインしている登録済みの顧客がカートに追加できる製品の数量を制限しようとしていると仮定します。
(これは 1 対 1 の関係ですが、多くの異なる製品と顧客ごとの数量に対応するために簡単に変更できます)
顧客エンティティにフィールドを追加するカスタム モジュールを作成して、管理者が顧客ごとに適切な数量を設定できるようにします。
フィールド名: [ModuleName]_product_id (顧客エンティティへの属性の追加を参照)
フィールド名: [ModuleName]_max_cart_qty (顧客エンティティへの属性の追加を参照)
(以下のファイルをローカルのテンプレート フォルダーにコピー) で、数量入力フィールドを更新します。
/app/design/frontend/base/default/template/catalog/product/view/addtocart.phtml /app/design/frontend/base/default/template/checkout/cart/item/default.phtml
変化する
<input type="text" class="input-text qty" name="qty" id="qty" maxlength="12" value="<?php echo $this->getProductDefaultQty() * 1 ?>" title="<?php echo $this->__('Qty') ?>" />
to (数量が以下であることを確認するための検証クラスを追加します)
$addValidationClass = '';
if( Customer is login && ModuleName_product_id == $_product->getId() && [ModuleName]_max_cart_qty > 0){
$addValidationClass = ' validate-digits-range-1-' . [ModuleName]_max_cart_qty
}
<input type="text" class="input-text qty<?php echo $addValidationClass; ?>" name="qty" id="qty" maxlength="12" value="<?php echo $this->getProductDefaultQty() * 1 ?>" title="<?php echo $this->__('Qty') ?>" />
サーバー側の検証を行いたい場合は、カートに追加イベントのオブザーバーを作成し、上記のロジックを現在カートに追加されているアイテムと比較します