Вы здесь

Как изменить название скидки в Drupal Commerce?

1

С помощью статьи http://xandeadx.ru/blog/drupal/867 разобрался как программно добавить скидку к заказу. Сделал так: к заказу привязал словарь таксономии, в котором в терминах забивается название скидки и её процент. При редактировании заказа можно выбрать скидку в выпадающем списке и дальше с помощью commerce_price_component_add() добавляется скидка в заказ. Если знаете, как сделать лучше, с удовольствием выслушаю ваши варианты.

Но вопрос про другое. Скидка корректно добавляется к заказу, но хотелось бы в суммарном поле видеть не просто "Скидка", а добавить её название. Например, "Скидка на 8 марта (8%)". Как это сделать?

Прикладываю картинку, куда мне хотелось бы добавить название скидки:

Может кому-то будет интересен код добавления скидки:

/**
 * Implements hook_commerce_order_presave().
 * Настраиваем добавление скидки к заказу
 */
function my_module_commerce_order_presave($order) {

  $order_wrapper = entity_metadata_wrapper('commerce_order', $order);
  $discount_term = $order_wrapper->field_order_discount->value(); //получаем термин скидки

  // Если скидка выбрана, то
  if($discount_term){
    $discount_wrapper = entity_metadata_wrapper('taxonomy_term', $discount_term); //получаем термин, в котором процент скидки
    $discount = $discount_wrapper->field_order_discount_summ->value();
    if($discount){
      $order_total = $order_wrapper->commerce_order_total->value();
      foreach ($order_total['data']['components'] as $key => $component) {
        if($component['name'] == 'base_price'){
          $discount_amount = $component['price']['amount'] * $discount / 100; //получаем базовую цену без доставки
          break;
        }
      }
      $order_wrapper->commerce_order_total->amount = $order_total['amount'] - $discount_amount;
      $order_wrapper->commerce_order_total->data = commerce_price_component_add($order_total, 'discount', array(
        'amount' => $discount_amount,
        'currency_code' => $order_total['currency_code'],
        'data' => array(),
      ), TRUE);
      $discount_message = ceil(commerce_currency_amount_to_decimal($discount_amount, 'RUB'));
      drupal_set_message('Добавлена скидка к заказу: ' . $discount_term->name . ' (' . $discount_message . ' руб.)');    
    }
  }

}
Версия Drupal: 
7.x
Связанные проекты: 
Drupal Commerce
Вопрос задан 07.02.2016 - 11:21
Аватар пользователя shu
shu
178

Ответы

1

Создайте свой price component с помощью hook_commerce_price_component_type_info и добавляйте его вместо discount, или переименуйте существующий в hook_commerce_price_component_type_info_alter или в hook_commerce_price_formatted_components_alter

Ответ дан 07.02.2016 - 11:51
Аватар пользователя xandeadx
xandeadx
1542

Спасибо, так и сделал:

function my_module_commerce_price_component_type_info_alter(&$component_types) {

  //если мы находимся в админке
  if(arg(0) == 'admin' && arg(1) == 'commerce' && arg(2) == 'orders' && is_numeric(arg(3))){

    $order = commerce_order_load(arg(3));
    $order_wrapper = entity_metadata_wrapper('commerce_order', $order);

    //если к заказу привязан термин скидки
    if($discount_term = $order_wrapper->field_order_discount->value()){
      $discount_wrapper = entity_metadata_wrapper('taxonomy_term', $discount_term);

      //если в термине скидки указана скидка
      if($discount = $discount_wrapper->field_order_discount_summ->value()){
        $discount_type = $discount_term->name;
        $component_types['discount']['display_title'] .= ' (' . $discount_type . ')';
      }

    }

  }
}
Комментарий оставлен 07.02.2016 - 12:00
-1

Если к скидке пристроить class или id - можно красявую надпись картинкой в background пристроить - реально прикольно получитсо... ))

А то уже многих давно тошнит от штатных дизайнов.

Ответ дан 07.02.2016 - 11:57
Аватар пользователя Pavel
Pavel
-47