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';
}
}
?>
Любая помощь была бы очень признательна.
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:
" и сохранив изменения. Вы можете увидеть скриншот этого здесь: - НО я также покажу вам, как изменить его программно (вы можете увидеть это ниже в коде - вам нужно установить
$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;
}
}
// ...
Я также опубликовал несколько скриншотов с текстом кнопки изменение:
Изменение текста кнопки "Добавить в корзину":
ДО:
ПОСЛЕ:
Изменение кнопок страницы "Корзина покупок":
ДО:
ПОСЛЕ ( "Продолжить покупки" в виде "Текстовой ссылки" ):
ПОСЛЕ ( "Продолжить покупки" в виде "Кнопки" ):
Попробуйте это
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