Ubercart - как изменить тексты кнопок с помощью формы крючка 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';           
    }   
}
?>

Любая помощь была бы очень признательна.

Author: Sk8erPeter, 2012-04-17

2 answers

Есть тема об этой проблеме на drupal.org, и есть даже патч для решения этой проблемы:
http://drupal.org/node/1170364

Краткое объяснение, почему изменение текста кнопки нарушает нормальное поведение (что немного "забавно"):
Давайте взглянем на код uc_cart_view_form_submit(), в основном на часть под комментарием "//Укажите соответствующее перенаправление на основе кнопки, используемой для отправки". Вы можете видеть, что существует блок переключателей, в котором проверяется текст нажатой кнопки ($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_programatically на TRUE, чтобы попробовать, но я бы предложил использовать первый метод)
  • Я также должен упомянуть, что "Продолжить покупки " - это ссылка (не кнопка) в 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

ПОСЛЕ ( "Продолжить покупки" в виде "Текстовой ссылки" ): Modifying "Shopping cart" page's buttons - AFTER ("Continue shopping" as a "Text link")

ПОСЛЕ ( "Продолжить покупки" в виде "Кнопки" ): Modifying "Shopping cart" page's buttons - AFTER ("Continue shopping" as a "Button")

 2
Author: Sk8erPeter, 2012-05-11 19:23:17

Попробуйте это

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
Author: niksmac, 2012-04-18 13:27:53