web-dev-qa-db-ja.com

カートから削除ボタンを画像ボタンに変更

カートからラインアイテムを削除する削除ボタンを変更します。ゴミ箱を表す画像ボタンに次のようにできます。

enter image description here

カスタムモジュールで使用しているコードは次のようになります。

<? php
function mymodule_custom_form_views_form_commerce_cart_form_default_alter(&$form, &$form_state, $form_id) {
  foreach ($form['edit_delete'] as &$item) {
    $item['#type']='image_button';
    $item['#src']='sites/all/themes/mytheme/images/trash.svg';
    $item['#alt']='Remove';
  }
}

このコードでは、期待どおりにテキストではなくアイコンが表示されますが、残念ながら大きな問題が発生します。ボタンを押しても対応する広告申込情報は削除されませんが、最後に追加された広告申込情報が連続して誤って削除されます。したがって、item1、item2、item3をこの順序でカートに追加すると、対応するどの削除ボタンを押しても、item3が削除されます。次に、残りの2つのラインアイテムの削除ボタンの1つを押すと、アイテム2が削除されます。上記のコードの何が問題になっていますか?

1
Madam Adam

Image_buttonsの_#value_の設定を解除する必要があります:

_  $item['#type']='image_button';
  $item['#src']='sites/all/themes/mytheme/images/trash.svg';
  $item['#alt']='Remove';
  unset($item['#value']); // this line here
_

削除されるラインアイテムは、_#triggering_element_の_$form_data_によって決定されます。この要素は、コアのform.incの関数_form_button_was_clicked($element, &$form_state)によって決定されます。

_#value_がimage_buttonに設定されている場合、すべての画像ボタンがクリックされたことが検出されたようです。

_  // line 2227 in form.inc
  elseif (!empty($element['#has_garbage_value']) && isset($element['#value']) && $element['#value'] !== '') {
    return TRUE;
  }
_

つまり、ライドの最後に、最後の画像ボタンは常に#triggering_elementとして設定され、最後のラインアイテムは常に削除されます。

_#value_の設定を解除すると、問題が解決します。空の文字列に設定しても、なんとかしません。

_#value_プロパティの設定を解除する代わりに(これは機能しますが、個人的には直観に反します)、 form_type_image_button_value() 関数を使用して設定することもできます。

例として:

_function my_custom_module_form_views_form_commerce_cart_form_default_alter(&$form, 
&$form_state, $form_id) {
  if (!empty($form['edit_delete'])) {
    foreach (element_children($form['edit_delete']) as $key) {
      $form['edit_delete'][$key]['#type'] = 'image_button';
      $form['edit_delete'][$key]['#src'] = 'sites/all/themes/trash.png';
      $form['edit_delete'][$key]['#alt'] = 'Remove';
      $form['edit_delete'][$key]['#value'] = 
        form_type_image_button_value($form['edit_delete'][$key], NULL, $form_state);
    }
  }
} 
_

form_type_image_button_value() 関数は、ブラウザーの特性を考慮して、クリックされた画像ボタンの値を$ _POST配列から正しく抽出するように構築されています。

幸運を!

PS:フックの実装を穏やかに書き直して、ラインアイテムの削除要素を反復するときにelement_children()を使用しました。

2