カートからラインアイテムを削除する削除ボタンを変更します。ゴミ箱を表す画像ボタンに次のようにできます。
カスタムモジュールで使用しているコードは次のようになります。
<? 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が削除されます。上記のコードの何が問題になっていますか?
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()
を使用しました。