Làm cách nào để ghi đè chức năng từ mô-đun?


8

Thứ nhất, xin lỗi nếu câu trả lời này được đề cập ở nơi khác. Tôi đã thực hiện rất nhiều tìm kiếm và chỉ có thể tìm thấy thông tin về các chức năng và móc nối chủ đề.

Tôi đang sử dụng một mô-đun xây dựng bảng giá cho các mặt hàng Thương mại Drupal. Có một chức năng định dạng các tiêu đề bảng:

/**
 * Helper function that takes care of the quantity displayed in the headers of 
 * the price table.
 */
function commerce_price_table_display_quantity_headers($item) {
  // Set the quantity text to unlimited if it's -1.
  $max_qty = $item['max_qty'] == -1 ? t('Unlimited') : $item['max_qty'];
  // If max and min qtys are the same, only show one.
  if ($item['min_qty'] == $max_qty) {
    $quantity_text = $item['min_qty'];
  }
  else {
    $quantity_text = $item['min_qty'] . ' - ' . $max_qty;
  }
  return $quantity_text;
}

Như bạn có thể thấy, đây không phải là một chức năng chủ đề nơi tôi có thể ghi đè lên nó trong template.php nhưng tôi có thể điều chỉnh một số đầu ra.

Rõ ràng tôi không muốn tự chỉnh sửa mô-đun trong trường hợp nó được cập nhật trong tương lai, vì vậy, làm thế nào tôi có thể xác định lại chức năng này để tôi có thể cắt và thay đổi một số thứ?

Công việc của tôi cho đến nay ...

Cho đến nay, tôi đã cố gắng tạo nó như một mô-đun riêng biệt với một vài thay đổi tinh tế để hiển thị nếu nó hoạt động hay không, nhưng nó không ghi đè bất kỳ đầu ra nào.

Thông tin tập tin

; $id$
name = Price Table: Tweaked Display
description = A different layout for the price table as shown on the product display nodes
package = Commerce (contrib)
core = 7.x

dependencies[] = commerce_product
dependencies[] = commerce_price
dependencies[] = commerce_price_table

Mô-đun tập tin

 /**
 * Override of the helper function that takes care of the quantity displayed in the headers of 
 * the price table.
 */
function commerce_table_tweak_display_quantity_headers($item) {
  // Set the quantity text to unlimited if it's -1.
  $max_qty = $item['max_qty'] == -1 ? t('Unlimited gnhh') : $item['max_qty'];
  // If max and min qtys are the same, only show one.
  if ($item['min_qty'] == $max_qty) {
    $quantity_text = $item['min_qty'];
  }
  else {
    $quantity_text = $item['min_qty'] . ' - this is working - ' . $max_qty;
  }
  return $quantity_text;
}

Câu trả lời:


12

Đó là Drupal ... luôn có cách, nhưng lượng thời gian cần làm có thể khiến bạn phải suy nghĩ hai lần :)

Nếu bạn nhìn xa hơn một chút về chuỗi thức ăn có thể nói, bạn sẽ thấy rằng chức năng này được sử dụng riêng commerce_price_table_field_formatter_view(), nó khai báo một định dạng trường được sử dụng cho commerce_price_tableloại trường.

Với ý nghĩ đó, bạn hoàn toàn có thể dễ dàng thực hiện trình định dạng trường của riêng mình, gán nó cho commerce_price_tableloại trường và sử dụng bao nhiêu mã tùy chỉnh mà bạn muốn, luôn luôn tuân thủ các thực tiễn tốt nhất.

Về cơ bản bạn cần thực hiện hook_field_formatter_info():

function MYMODULE_field_formatter_info() {
  return array(
    'MYMODULE_commerce_multiprice_default' => array(
      'label' => t('MyModule Price chart'),
      'field types' => array('commerce_price_table'),
      'settings' => array(
        'calculation' => FALSE,
        'price_label' => t('Price'),
        'quantity_label' => t('Quantity'),
        'table_orientation' => t('Orientation'),
      ),
    ),
  );
}

Và sau đó thực hiện hook_field_formatter_view(), field_formatter_settings_form()và (tùy chọn) hook_field_formatter_summary().

Đối với mỗi hàm này, chỉ cần lấy mã từ cùng một hàm trong mô-đun đóng góp và thực hiện các thay đổi mà bạn cần.


Cảm ơn cho một câu trả lời tuyệt vời. Tôi sẽ lội qua mã và xem đó có phải là công việc mà tâm trí tôi có thể xử lý vào chiều thứ sáu không!
dùng9359

@Clive, bạn trả lời là hoàn toàn chính xác từ quan điểm thực hành tốt nhất về phát triển Drupal. Nhưng trong trường hợp khi bạn chỉ cần thay đổi một chuỗi nhỏ trong một số chức năng - thì đó không phải là cách tiếp cận tốt để tạo định dạng tùy chỉnh. Bởi vì bạn viết càng nhiều mã tùy chỉnh - bạn càng thêm nhiều lỗi. Và bạn đề nghị user9359 tạo 4 hook hầu hết trong số chúng sẽ được sao chép từ mô-đun thương mại hiện có !!! Tôi nghĩ rằng sử dụng miếng vá nhỏ phù hợp hơn nhiều cho tình huống này.
Eugene Fidelin

2
@Eugene Vâng, đó thực sự là một lời kêu gọi phán xét, mỗi người có lẽ sẽ có một định nghĩa khác nhau về 'thích hợp' trong tình huống này. Cá nhân tôi thích phương pháp dài vì nó có nghĩa là tôi không phải duy trì các tệp vá và bất kỳ logic điều khiển phiên bản ưa thích nào tôi sẽ không bị ảnh hưởng bởi tệp mô-đun 'thay đổi' giả mạo này; nhưng đó chỉ là tôi, nếu bạn cảm thấy thoải mái khi duy trì các tệp vá thì việc thực hiện điều đó sẽ tốn ít công sức hơn nhiều so với thực hiện lại tất cả các chức năng này. Câu trả lời này chắc chắn nằm dọc theo cách thức , không nhất thiết là tại sao :)
Clive

một lần nữa Clive đến resuce
Vishal

2

Có vẻ như, bạn không thể ghi đè chức năng này vì nó không sử dụng luồng công việc chủ đề hoặc móc.

Cách duy nhất - là trực tiếp thay đổi commerce_price_table_display_quantity_headers()chức năng. Sau đó tạo một bản vá với bạn thay đổi.

Sau này nếu bạn cập nhật mô-đun Thương mại - bạn sẽ cần áp dụng bản vá của mình.


Vâng, đó là những gì tôi đã cố gắng tránh nhưng nó có vẻ hấp dẫn sau khi xem nhanh đề nghị của Clive!
dùng9359

1

Tôi nghĩ rằng câu trả lời của Eugene là chính xác rằng bạn không thể làm điều đó mà không ghi đè trực tiếp.

Tuy nhiên, điều tôi thấy hữu ích là nếu thực sự cần thiết phải làm điều này, hãy chuyển mô-đun này từ sites/all/modules/contribthư sites/all/modules/custommục của bạn sang thư mục để bạn có thể nhận biết và theo dõi thực tế rằng bạn đã thực hiện các thay đổi tùy chỉnh.


Vâng cảm ơn vì tiền boa, tôi đã đọc về điều đó sớm hơn
user9359
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.