ubercart. image вместо submit. Можно ли обойтись без изменения готового модуля (т.е. только template.php)

Главные вкладки

Аватар пользователя iigor iigor 21 мая 2008 в 21:20

друпал 5.7
ubercart последний (rc5)

хочу на форме заказа отображать не кнопку, а картинку с теми же свойствами.

отображение кнопки в ubercart реализовано следующим образом:

есть функция

function theme_uc_product_add_to_cart($node) {
  $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

function uc_product_forms($saved_args) {
  $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

function phptemplate_uc_product_add_to_cart($node){

  $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 ?

Комментарии

Аватар пользователя iigor iigor 21 мая 2008 в 22:24

разве можно _только_ стилями заменить submit элемент на картинку?

если нет, то нужно менять форму, чем я собственно и озадачен.

Аватар пользователя glu2006 glu2006 21 мая 2008 в 22:58

Я не уверен на 100% но где-то читал что можно))) есть пример? кинь линк посмотреть тогда скажу можно или нет. Из личного опыта, прикручивал собственную кнопку купить к уберкарту (правда не стилями;) )

К грязный хак могу предложить, поставь картинку бэкграундом для кнопки, а текст на кнопке переведи как пробел)))

Но это не самый хороший способ.
.form-submit, .button {
background: url(images/ имя файла с картинкой) no-repeat (если необходимо вывовнять по топ лефт и т.д.);
padding:0px; (выставляется какой нужно в зависимости от размеров кнопки)
}

Аватар пользователя iigor iigor 21 мая 2008 в 23:13

вроде такие кнопочки опера плохо отрисовывала.
Да и не хочется делать неправильно то, что можно сделать правильно.
Теоретически, можно было б и джавоскриптом убрать кнопку и поставить картинку, тогда вообще ничего менять бы не пришлось.

Аватар пользователя glu2006 glu2006 21 мая 2008 в 23:24

врут про оперу, если задать правильно то все рисуется как надо. самый капризный браузер - ИЕ 6. но и он рисует нормальные submit кнопки. Воспользуйтесь firebug для Firefox. и попробуйте поменять свойства кнопки просмотр или добавить хотя бы на этом сайте)))

Аватар пользователя neochief neochief 22 мая 2008 в 4:53

Надо создать свой модуль и засунуть туда:

function yourmodule_form_alter($form_id, &$form) {
  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

function phptemplate_button2($element) {
  // 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;
}

результут можно помотреть тут

Аватар пользователя NecroHill NecroHill 16 сентября 2009 в 1:18

neochief, а без создания своего модуля и использования _form_alter ни как с формой добавления в корзину не совладать?
Ubercart 2.x на 6.x Drupal у меня. хочу завернуть кнопку в div отдельный. как это можно сделать?

Аватар пользователя neochief neochief 16 сентября 2009 в 1:31

"NecroHill" wrote:
без создания своего модуля и использования _form_alter ни как с формой добавления в корзину не совладать?

Нет. Можно через template.php, но с теми же трудозатратами. Search "темизация форм Drupal"

Аватар пользователя NecroHill NecroHill 16 сентября 2009 в 16:35

ага. спасибо. прочитал твою статью по темизации, только все уперто не хочет работать в случае с ubercart (в моем случае)
на каждой сранице форма имеет свой уникальный ID вида uc_product_add_to_cart_form_# где # - это ID ноды. и вставив в template.php функцию типа

<?php
function  названиетемы_uc_product_add_to_cart_form($form) {
    
$form['submit']['#value'] =t('Быстро добавь меня в корзину');
}
?>

ничего не меняет, я уверен что делаю что-то не так. просьба ткнуть носом.

Аватар пользователя glu2006 glu2006 16 сентября 2009 в 16:38

NecroHill wrote:
ага. спасибо. прочитал твою статью по темизации, только все уперто не хочет работать в случае с ubercart (в моем случае)
на каждой сранице форма имеет свой уникальный ID вида uc_product_add_to_cart_form_# где # - это ID ноды. и вставив в template.php функцию типа

<?php
function  названиетемы_uc_product_add_to_cart_form($form) {
    
$form['submit']['#value'] =t('Быстро добавь меня в корзину');
}
?>

ничего не меняет, я уверен что делаю что-то не так. просьба ткнуть носом.

Зачем парится? Smile
есть модуль cart_links идет в стандартной поставке убера, позволяет формировать вместо кнопки ссылку добавить в корзину.
ну и сделайте просто ссылку а бекграундом у нее положите картинку какую захотите.

Аватар пользователя petuzueg petuzueg 18 февраля 2010 в 19:09

glu2006 wrote:
NecroHill wrote:
ага. спасибо. прочитал твою статью по темизации, только все уперто не хочет работать в случае с ubercart (в моем случае)

ничего не меняет, я уверен что делаю что-то не так. просьба ткнуть носом.

Зачем парится? Smile
есть модуль cart_links идет в стандартной поставке убера, позволяет формировать вместо кнопки ссылку добавить в корзину.
ну и сделайте просто ссылку а бекграундом у нее положите картинку какую захотите.

Мне помогло! Спасибо!!!

Аватар пользователя NecroHill NecroHill 16 сентября 2009 в 17:43

это все я знаю, в данном случае меня интересует принцип темизации этой формы не настройкой в админке Ubercart, не через hook_form_alter(), а добавлением функции в template.php