друпал 5.7
ubercart последний (rc5)
хочу на форме заказа отображать не кнопку, а картинку с теми же свойствами.
отображение кнопки в ubercart реализовано следующим образом:
есть функция
$output = '[div class="add_to_cart"\]';
if ($node->nid) {
$output .= drupal_get_form('uc_product_add_to_cart_form_'. $node->nid, $node);
}
else {
$output .= drupal_get_form('uc_product_add_to_cart_form', $node);
}
$output .= '[/div]';
return $output;
}
function uc_product_add_to_cart_form($node) {
$form = array();
$form['#base'] = 'uc_product_add_to_cart_form';
$form['nid'] = array('#type' => 'value', '#value' => $node->nid);
if ($node->default_qty > 0 && variable_get('uc_product_add_to_cart_qty', false)) {
$form['qty'] = array('#type' => 'textfield',
'#title' => t('Quantity'),
'#default_value' => $node->default_qty,
'#size' => 5,
'#maxlength' => 6,
);
}
else {
$form['qty'] = array('#type' => 'hidden', '#value' => 1);
}
$form['submit'] = array(
'#type' => 'submit',
'#value' => variable_get('uc_product_add_to_cart_text', t('Add to cart')),
'#id' => 'edit-submit-'. $node->nid,
'#attributes' => array(
'class' => 'node-add-to-cart',
),
);
return $form;
}
При этом все функции uc_product_add_to_cart_form_NID перелинковываются на uc_product_add_to_cart_form
$forms = array();
if (substr($saved_args[0], 0, 27) == 'uc_product_add_to_cart_form' || substr($saved_args[0], 0, 26) == 'uc_catalog_buy_it_now_form') {
$products = db_query("SELECT DISTINCT nid, type FROM {node} WHERE nid = %d", $saved_args[1]->nid);
while ($product = db_fetch_object($products)) {
if (in_array($product->type, array_keys(uc_product_node_info()))) {
$forms['uc_product_add_to_cart_form_'. $product->nid] = array('callback' => 'uc_product_add_to_cart_form');
$forms['uc_catalog_buy_it_now_form_'. $product->nid] = array('callback' => 'uc_catalog_buy_it_now_form');
}
}
}
return $forms;
}
Я дописал в файл template.php
$output = '[div class="add_to_cart"]';
if ($node->nid){
$output .= drupal_get_form('user_uc_product_add_to_cart_form_'. $node->nid, $node);
}
else{
$output .= drupal_get_form('user_uc_product_add_to_cart_form', $node);
}
$output .= '[/div]';
return $output;
}
function user_uc_product_add_to_cart_form($node){
$form = array();
$form['#base'] = 'uc_product_add_to_cart_form';
if ($node->default_qty > 0 && variable_get('uc_product_add_to_cart_qty', false)){
$form['qty'] = array('#type' => 'textfield',
'#title' => t('Quantity'),
'#default_value' => $node->default_qty,
'#size' => 5,
'#maxlength' => 6,
);
}
else{
$form['qty'] = array('#type' => 'hidden', '#value' => 1);
}
$form['submit']['#type'] = 'submit';
$form['submit']['#value']= variable_get('uc_product_add_to_cart_text', t('Add to cart'));
$form['submit']['#theme'] = 'button';
$form['submit']['#button_type'] = 'image';
$form['submit']['#name']="submit";
$form['submit']['#attributes'] = array(
'src' => '/sites/all/themes/mcgraw/img/cart-button.png',
'alt' => t(Search)
);
//$form['submit'] = array('#type' => 'submit', '#value' => variable_get('uc_product_add_to_cart_text', t('Add to cart')),);
return $form;
}
То, что я написал не работает, т.к. функций user_uc_product_add_to_cart_form_NID не существует.
(Кстати, сомневаюсь насчёт корректности такого префикса)
Если дописать алиас user_uc_product_add_to_cart_form_NID на user_uc_product_add_to_cart_form в uc_product_forms,
то при исполнении получаем, что user_uc_product_add_to_cart_form - не определена.
вопрос такой: можно ли решить проблему, не меняя uc_product_add_to_cart_form, а по возможности и uc_product_forms ?
Комментарии
Попробуй стилями.
разве можно _только_ стилями заменить submit элемент на картинку?
если нет, то нужно менять форму, чем я собственно и озадачен.
Я не уверен на 100% но где-то читал что можно))) есть пример? кинь линк посмотреть тогда скажу можно или нет. Из личного опыта, прикручивал собственную кнопку купить к уберкарту (правда не стилями;) )
К грязный хак могу предложить, поставь картинку бэкграундом для кнопки, а текст на кнопке переведи как пробел)))
Но это не самый хороший способ.
.form-submit, .button {
background: url(images/ имя файла с картинкой) no-repeat (если необходимо вывовнять по топ лефт и т.д.);
padding:0px; (выставляется какой нужно в зависимости от размеров кнопки)
}
вроде такие кнопочки опера плохо отрисовывала.
Да и не хочется делать неправильно то, что можно сделать правильно.
Теоретически, можно было б и джавоскриптом убрать кнопку и поставить картинку, тогда вообще ничего менять бы не пришлось.
врут про оперу, если задать правильно то все рисуется как надо. самый капризный браузер - ИЕ 6. но и он рисует нормальные submit кнопки. Воспользуйтесь firebug для Firefox. и попробуйте поменять свойства кнопки просмотр или добавить хотя бы на этом сайте)))
Надо создать свой модуль и засунуть туда:
if ($form['#base'] == 'uc_product_add_to_cart_form') {
$form['submit']['#theme'] = 'button2';
$form['submit']['#button_type'] = 'image';
$form['submit']['#attributes'] = array(
'src' => '/files/cartbutton.gif', // картинка кнопки
);
}
}
в template.php
// following lines are copied directly from form.inc core file:
//Make sure not to overwrite classes
if (isset($element['#attributes']['class'])) {
$element['#attributes']['class'] = 'form-'. $element['#button_type'] .' '. $element['#attributes']['class'];
}
else {
$element['#attributes']['class'] = 'form-'. $element['#button_type'];
}
// here the novelty begins: check if #button_type is normal submit button or image button
$return_string = '<input ';
if ($element['#button_type'] == 'image') {
$return_string .= 'type="image" ';
}
else {
$return_string .= 'type="submit" ';
}
$return_string .= (empty($element['#name']) ? '' : 'name="'. $element['#name'] .'" ') .'value="'. check_plain($element['#value']) .'" '. drupal_attributes($element['#attributes']) ." />\n";;
return $return_string;
}
результут можно помотреть тут
спасибо, это оно.
phptemplate_button2 уже написана правда была, так что немного по-другому там параметры.
neochief, а без создания своего модуля и использования _form_alter ни как с формой добавления в корзину не совладать?
Ubercart 2.x на 6.x Drupal у меня. хочу завернуть кнопку в div отдельный. как это можно сделать?
Нет. Можно через template.php, но с теми же трудозатратами. Search "темизация форм Drupal"
ага. спасибо. прочитал твою статью по темизации, только все уперто не хочет работать в случае с ubercart (в моем случае)
на каждой сранице форма имеет свой уникальный ID вида uc_product_add_to_cart_form_# где # - это ID ноды. и вставив в template.php функцию типа
<?php
function названиетемы_uc_product_add_to_cart_form($form) {
$form['submit']['#value'] =t('Быстро добавь меня в корзину');
}
?>
ничего не меняет, я уверен что делаю что-то не так. просьба ткнуть носом.
Зачем парится?
есть модуль cart_links идет в стандартной поставке убера, позволяет формировать вместо кнопки ссылку добавить в корзину.
ну и сделайте просто ссылку а бекграундом у нее положите картинку какую захотите.
Мне помогло! Спасибо!!!
это все я знаю, в данном случае меня интересует принцип темизации этой формы не настройкой в админке Ubercart, не через hook_form_alter(), а добавлением функции в template.php