これまでに調査した次の事項があります。
コマースカートのバージョン:7.x-1.9
ショッピングカートフォームはcommerce_cart_form
ビューによって制御されます。
チェックアウトページはcommerce_cart_summary
ビューによって制御されます。
数量ウィジェットは、製品表示コンテンツタイプの表示の管理で有効または無効にできます。ただし、表示数量ウィジェットを制御するルールアクションはありません。
したがって、問題は、チェックアウトページのテキスト数量ウィジェットを(プログラムで)有効または無効にするにはどうすればよいですか(たとえば、特定の条件/商品タイプの場合)ですか?そのため、人々は特定の製品タイプの数量のみを編集できます。
Commerce Rules Extra モジュールがありますが、あまり機能が提供されていませんが、そのために既に feature request を投稿しました。
数量ウィジェットは、ビューの構成の問題のようです。
コマースビューの1つを編集する場合。 _commerce_cart_form
_または_commerce_cart_summary
_、数量はフィールドリストで確認できます。
デフォルトでは、Commerce Cartモジュールはテキストフィールド(ファイル:commerce_cart.views_default.inc)に設定された数量を持っているため、ウィジェットをテキストフィールドから数値に、またはその逆に変更するには、ビューを編集して数量フィールドを他のフィールドに置き換える必要があります。
これらのビューで使用できるフィールドは2つあります。
コマースラインアイテム:数量
ラインアイテムの数量。
マシン名:数量
ハンドラー:views_handler_field_numeric
コマースラインアイテム:数量テキストフィールド
ビューでラインアイテムの数量を編集するためにテキストフィールドを追加します。)
マシン名:edit_quantity
ハンドラー:commerce_line_item_handler_field_edit_quantity
特定の条件で数値ウィジェットとテキストウィジェットを切り替える必要がある場合は、hook_views_pre_view()
を使用してビューを変更し、その場でハンドラーを変更する必要があります。
以下に簡単な例を示します。
_/**
* Implements hook_views_pre_view().
*/
function MODULENAME_views_pre_view(&$view) {
switch ($view->name) {
case 'commerce_cart_form':
case 'commerce_cart_summary':
$view->display['default']->handler->options['fields']['quantity']['field'] = 'edit_quantity'; // 'quantity' for numeric, 'edit_quantity' for text field
break;
}
}
_
他の方法は、TPLビューテンプレートファイル、つまり_views-view-field--commerce-cart-summary--default--quantity.tpl.php
_を作成し、そこからウィジェットを変更することです。詳細については、ビューの編集ページの「テーマ:情報」を確認してください。
以下は、製品タイプに基づいて数量フィールドを制限する例です。
テンプレートディレクトリ(sites/all/themes/foo)に少なくとも1つのTPLファイルを作成する必要があります。
カートページの場合:
views-view-field--commerce-cart-form--default--quantity.tpl.php
概要ページの場合:
views-view-field--commerce-cart-summary--default--quantity.tpl.php
次のPHPコード:
_print foo_quantity_available_for_row($row) ? $output : 1; // Hardcoded '1'.
_
注:数量が数値の場合は常に1と表示されるため、必要に応じて拡張してください。
そして、次の2つの関数:
_/**
* Implements hook_views_pre_view().
*/
function foo_views_pre_view(&$view) {
switch ($view->name) {
case 'commerce_cart_form': // On cart page
// case 'commerce_cart_summary': // On summary page
$view->display['default']->handler->options['fields']['quantity']['field'] = 'edit_quantity'; // Enforce Quantity field from numeric to text field for further changes.
// $view->display['default']->handler->options['fields']['text_quantity'] = $view->display['default']->handler->options['fields']['quantity']; // Create clone.
break;
}
}
/**
* Restrict edit of Quantity field based on the product type.
*
* Callback from views-view-field--commerce-cart-summary--default--quantity.tpl.php.
*
*/
function foo_quantity_available_for_row($row) {
($line_item = $row->commerce_line_item_field_data_commerce_line_items_line_item_) &&
($line_item_wrapper = entity_metadata_wrapper('commerce_line_item', $line_item)) &&
($product = $line_item_wrapper->commerce_product->value());
if ($product) {
switch ($product->type) {
case 'product_type_1':
case 'product_type_2':
return TRUE; // Allow users to edit Quantity field.
break;
}
}
return FALSE; // Disallow users to edit Quantity field.
}
_
すべてのケースで機能するわけではないので、必要に応じて変更してください。
MarcElbichon で提案されている他の方法は hook_form_alter を使用することです。
_<?php
function yourmodule_form_alter(&$form, &$form_state, $form_id) {
if (strpos($form_id, 'views_form_commerce_cart_form_') === 0 ) {
$form["edit_quantity"][0]["#attributes"]["readonly"] = "readonly";
$form["edit_quantity"][0]["#attributes"]["disabled"] = TRUE;
}
}
?>
_
この記事は 重いやかん で見つかり、この方法でうまくいきます。
Commerceショッピングカートはビューで作成されます。これにより、変更が簡単になりますが、ルールを使用して条件付きで広告申込情報を操作することは困難になります。
ここで、entity_metadata_wrapperを使用して、hook_form_alterが助けになります。ラインアイテムをループすると、特定の製品タイプのラインアイテムの数量と削除フィールドを無効にすることができます。ただし、ショッピングカートのラインアイテムIDとフォームのラインアイテムID属性を比較する必要があるため、これを達成することはすぐにはわかりません。
これを念頭に置いて、次のコードは、特定の製品タイプのラインアイテムの数量フィールドと削除フィールドを無効にする方法を示しています。
/** * hook_form_alter()。 を実装します*/ function custom_form_alter(&$ form、$ form_state、$ form_id){ if($ form_id = = 'views_form_commerce_cart_form_default'){ global $ user; $ product_types = array( 'pickup'、 'delivery'); $ cart = commerce_cart_order_load($ user-> uid) ; foreach(entity_metadata_wrapper( 'commerce_order'、$ cart)-> commerce_line_items as $ delta => $ line_item_wrapper){ //無効にするタイプのリストと照らし合わせて現在のラインアイテムの製品タイプをチェックします if(in_array($ line_item_wrapper-> commerce_product-> value()-> type、$ product_types)){ foreach($ form ['edit_quantity'] as $ index => $ line_item){ if(is_numeric($ index)){ //現在のショッピングカートのラインアイテムIDをフォームのラインアイテムIDと比較します if($ line_item_wrapper-> raw()= = $ form ["edit_quantity"] [$ index] ['#line_item_id']){ $ form ['edit_quantity'] [ $ index] ['#attributes'] ['readonly'] = 'readonly'; $ form ['edit_quantity'] [$ index] ['#attributes'] ['disabled'] = TRUE; $ form ['edit_quantity'] [$ index] ['#attributes'] ['title'] = t( 'この数量は変更できません。'); unset($ form [' edit_delete '] [$ index]); } } } } } } }
説明されているオプション以外に、views_conditionalモジュールを使用してこれを解決することもできます。
カートフォームの数量フィールドの変更、つまり次のように機能します
この方法で、1つの製品タイプの数量を編集できるようになりました。