web-dev-qa-db-ja.com

カート/チェックアウトページでプログラムで数量テキストウィジェットを有効/無効にする方法は?

これまでに調査した次の事項があります。

  • コマースカートのバージョン:7.x-1.9

  • ショッピングカートフォームはcommerce_cart_formビューによって制御されます。

  • チェックアウトページはcommerce_cart_summaryビューによって制御されます。

  • 数量ウィジェットは、製品表示コンテンツタイプの表示の管理で有効または無効にできます。ただし、表示数量ウィジェットを制御するルールアクションはありません。

したがって、問題は、チェックアウトページのテキスト数量ウィジェットを(プログラムで)有効または無効にするにはどうすればよいですか(たとえば、特定の条件/商品タイプの場合)ですか?そのため、人々は特定の製品タイプの数量のみを編集できます。

Commerce Rules Extra モジュールがありますが、あまり機能が提供されていませんが、そのために既に feature request を投稿しました。

2
kenorb

数量ウィジェットは、ビューの構成の問題のようです。

コマースビューの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_を作成し、そこからウィジェットを変更することです。詳細については、ビューの編集ページの「テーマ:情報」を確認してください。


以下は、製品タイプに基づいて数量フィールドを制限する例です。

  1. テンプレートディレクトリ(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. そして、次の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;
    }
}
?>
_
2
kenorb

この記事は 重いやかん で見つかり、この方法でうまくいきます。

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]); 
} 
} 
} 
} 
} 
} 
 }
2
S. Carrozzi

説明されているオプション以外に、views_conditionalモジュールを使用してこれを解決することもできます。

カートフォームの数量フィールドの変更、つまり次のように機能します

  1. / admin/structure/views/view/commerce_cart_form/editでビューを開きます
  2. 関係コマース広告申込情報を追加:参照商品
  3. フィールドCommerce Product:typeを追加します。既存の数量テキストフィールドの上に配置し、フィールドを非表示にします
  4. コマースラインアイテムのフィールドを追加:数量;既存の数量テキストフィールドの上に配置し、フィールドを非表示にします
  5. 既存のコマース広告申込情報を非表示:数量テキストフィールド
  6. フィールドビューの追加:条件付きビュー。上記の下に配置する
    • タイトル:数量
    • このフィールドの場合…:[type_1] == Commerce Product:type
    • …:等しくない
    • この値:YOUR-PRODUCT-TYPE
    • 次に、これを出力します…:[数量]
    • それ以外の場合、これを出力します…:[edit_quantity]

この方法で、1つの製品タイプの数量を編集できるようになりました。

1
upunkt