web-dev-qa-db-ja.com

Ubercart-hook_form_alter()を介してボタンのテキストを変更する方法?

商品フォームとカートフォームのボタンの言語を変更しようとしています。

すべてが製品フォームでうまく機能していますが、カートページに同じものが実装されると、正しく送信されなくなります。ボタンの値は変わりますが、機能しなくなります。

<?php

/**
**Custom Module for hook_form_alter
*/

function MYMODULE_form_alter(&$form, &$form_state, $form_id){

    if ($form_id == uc_product_add_to_cart_form_1){
            $form['submit']['#value'] = 'Register';     
    }

    if ($form_id == uc_cart_view_form){
        //dsm($form);   
        $form['continue_shopping']['#value'] = 'Back';
        $form['update']['#value'] = 'Update';
        $form['checkout']['#value'] = 'Continue';           
    }   
}
?>

どんな助けでも大歓迎です。

1
piranah

Drupal.orgにこの問題に関するスレッドがあり、この問題を解決するためのパッチもあります。
http://drupal.org/node/1170364

ボタンのテキストを変更すると通常の動作が崩れる理由の簡単な説明(これは少し「面白い」):
c_cart_view_form_submit() のコードを見てみましょう。主にコメントの下の部分 "//ボタンに基づいて適切なリダイレクトを指定します参加する"。クリックされたボタンのtextが検査されるスイッチブロックがあることがわかります($form_state['clicked_button']['#value'])。これは非常に悪い習慣です。ロジックは、このボタンが表示するように設定されているテキストによって異なります。つまり、プログラムでボタンのテキストを単に変更すると、適切なリダイレクトが機能しなくなります。正直なところ、Ubercartのこの部分がこのように開発された理由がよくわかりません。

私はUbercartコアにパッチを適用せずにカスタムモジュールでそれを解決しました、いくつかのテストの後に機能します。以下のコードを見つけることができます。

買い物を続ける」テキストの変更について:

  • ショッピングを続ける」というテキストは/admin/store/settings/cart/edit/basicページで簡単に変更できます。これは多言語変数であるため、これを変更する適切な方法です。 「Custom continue shopping link text:」テキストフィールドに別の名前を入力し、変更を保存します。あなたはここにそれのスクリーンショットを見ることができます: "Cart settings" on "/admin/store/settings/cart/edit/basic"
  • しかし、それをプログラムで変更する方法も示します(以下のコードで確認できます-$set_continue_shopping_type_programaticallyTRUEに設定して試す必要があります-最初の方法を使用することをお勧めします)
  • また、「買い物を続ける」はリンク(ボタンではない)であることにも言及する必要がありますUbercart 6.x-2.7デフォルトで-したがって、その値をプログラムで変更したい場合は、 「テキストリンク」として表示されるように設定されている場合、その値はリンクマークアップである必要があります(通常の文字列ではなく、この方法では期待どおりに機能しません。 )-Drupalの l() 関数を使用して適切なリンクを作成できます。ただし、ボタンとして表示するように設定することもできます。この方法では、元のテキストを変更するためにプレーンテキストを使用する必要があります(コメントから、ボタンとして表示するように設定したことがわかります)。

以下がテスト済みで動作するコードです。

// ...

// you should change MYMODULE to your module's name

/**
 * Implementation of hook_form_alter()
 * @see http://api.drupal.org/api/drupal/developer%21hooks%21core.php/function/hook_form_alter/6
 */
function MYMODULE_form_alter(&$form, &$form_state, $form_id)
{

    // for testing, you can output the appropriate $form_id variable
    // to detect the form id(s) of the actual form(s) printed to the page
    // e.g. by using Devel module: http://drupal.org/project/devel
    /*
    if(function_exists('dsm'){
        dsm('Actual $form_id:');
        dsm($form_id);  
    }
    */

    // You can just simply toggle overriding the default cart button values 
    // with setting the variable below to "TRUE" or "FALSE" (without the quotes)
    // (this can be good for testing!)
    $modify_default_ubercart_buttons = TRUE;

    switch ($form_id) {
        // CHANGE IT TO THE APPROPRIATE $form_id!!!
        case 'uc_product_add_to_cart_form_1':
            // dsm($form);           
            if($modify_default_ubercart_buttons){
                $form['submit']['#value'] = 'Register';
            }
            break;

        case 'uc_cart_view_form':
            // dsm($form);

            if ($modify_default_ubercart_buttons) {
                $form['#submit'][] = 'testModule_form_alter_uc_cart_view_form_submit';

                // 1.) changing the "Update cart" button's text

                $form['update']['#value'] = 'Update';
                // if you modify the "#name" attribute, you also have to modify it in testModule_form_alter_uc_cart_view_form_submit()
                $form['update']['#name']  = 'update-cart';

                // 2.) changing the "Checkout" button's text

                $form['checkout']['#value'] = 'Continue';
                // if you modify the "#name" attribute, you also have to modify it in testModule_form_alter_uc_cart_view_form_submit()
                $form['checkout']['#name']  = 'cart-checkout';

                // IMPORTANT!!!
                // You should rather set the "Continue shopping element display" on the "/admin/store/settings/cart/edit/basic" page!
                // This is a multilingual variable, so setting it on the appropriate admin page is the best solution.
                // The code below is just a sample for setting it programatically!
                $set_continue_shopping_type_programatically = FALSE;

                if ($set_continue_shopping_type_programatically) {
                    $uc_continue_shopping_type = variable_get(uc_continue_shopping_type, 'link');

                    $continue_shopping_link_text = 'Back';
                    // $continue_shopping_link_path   = uc_cart_continue_shopping_url();
                    if ($uc_continue_shopping_type == 'link') {
                        $continue_shopping_link_markup       = l($continue_shopping_link_text, $continue_shopping_link_path);
                        $form['continue_shopping']['#value'] = $continue_shopping_link_markup;
                    } else {
                        $form['continue_shopping']['#value'] = $continue_shopping_link_text;
                        // the default "#name" attribute equals to "op" by default
                        // we change it to the desired button text to make it clear
                        $form['continue_shopping']['#name']  = $continue_shopping_link_text;
                    }
                }
            }

            // ...

            break;
    }
}
/**
 * Ubercart submit function needed because of button text altering
 * @see http://drupal.org/node/1170364
 */
function MYMODULE_form_alter_uc_cart_view_form_submit($form, &$form_state)
{

    // Specify the appropriate redirect based on the button used to submit.
    switch ($form_state['clicked_button']['#name']) {
        // Update cart button.
        case 'update-cart':
            // No redirect.  Just display a message and preserve the last URL.
            drupal_set_message(t('Your cart has been updated.'));
            break;

        // Checkout button.
        case 'cart-checkout':
            $form_state['redirect'] = variable_get('uc_checkout_enabled', TRUE) ? 'cart/checkout' : 'cart';
            break;
    }
}

// ...

ボタンのテキストを変更することについてのスクリーンショットもいくつか投稿しました。

「カートに追加」ボタンのテキストを変更する:

前: Modifying "Add to cart" button's text - BEFORE

後: Modifying "Add to cart" button's text - AFTER


「ショッピングカート」ページのボタンの変更:

前: Modifying "Shopping cart" page's buttons - BEFORE

AFTER( "Continue shopping"as a "Text link"): Modifying "Shopping cart" page's buttons - AFTER ("Continue shopping" as a "Text link")

AFTER( "Continue shopping"as a "Button"): Modifying "Shopping cart" page's buttons - AFTER ("Continue shopping" as a "Button")

2
Sk8erPeter

これを試して

function MYMODULE_form_alter(&$form, &$form_state, $form_id){

    if ($form_id == 'uc_product_add_to_cart_form_1'){
            $form['submit']['#value'] = 'Register';     
    }

    if ($form_id == 'uc_cart_view_form'){
        //dsm($form);   
        $form['continue_shopping']['#value'] = 'Back';
        $form['update']['#value'] = 'Update';
        $form['checkout']['#value'] = 'Continue';           
    }   
}

おかげでSk8erPeter

0
niksmac