Bagaimana cara mengganti fungsi dari modul?

8

Pertama, maaf jika jawaban ini dibahas di tempat lain. Saya telah melakukan banyak pencarian dan hanya dapat menemukan info tentang fungsi tema dan kait yang ada di atasnya.

Saya menggunakan modul yang membuat tabel harga untuk item Drupal Commerce. Ada fungsi yang memformat header tabel:

/**
 * 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;
}

Seperti yang Anda lihat, ini bukan fungsi tema di mana saya bisa menimpanya di template.php tapi saya bisa men-tweak beberapa output.

Jelas saya tidak ingin mengedit modul itu sendiri kalau-kalau akan diperbarui di masa depan, jadi, bagaimana saya bisa mendefinisikan kembali fungsi ini sehingga saya dapat memotong dan mengubah beberapa hal?

Pekerjaan saya sejauh ini ...

Sejauh ini, saya telah mencoba membuatnya sebagai modul terpisah dengan beberapa perubahan halus untuk menunjukkan apakah itu berfungsi atau tidak, tetapi tidak mengesampingkan salah satu output.

File info

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

File Modul

 /**
 * 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;
}
pengguna9359
sumber

Jawaban:

12

Itu Drupal ... selalu ada jalan, tetapi jumlah waktu yang diperlukan untuk membuat Anda berpikir dua kali :)

Jika Anda melihat sedikit lebih jauh ke atas rantai makanan sehingga Anda akan melihat bahwa fungsi ini secara eksklusif digunakan oleh commerce_price_table_field_formatter_view(), yang menyatakan formatter bidang yang digunakan untuk commerce_price_tablejenis bidang.

Dengan mengingat hal itu, Anda dapat dengan mudah mengimplementasikan formatter bidang Anda sendiri, menetapkannya ke commerce_price_tablejenis bidang, dan menggunakan kode kustom sebanyak yang Anda inginkan, sepanjang waktu sejalan dengan praktik terbaik.

Pada dasarnya Anda perlu menerapkan 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'),
      ),
    ),
  );
}

Dan kemudian menerapkan hook_field_formatter_view(), field_formatter_settings_form()dan (opsional) hook_field_formatter_summary().

Untuk masing-masing fungsi ini, ambil kode dari fungsi yang sama di modul contrib, dan buat perubahan di tempat yang Anda inginkan.

Clive
sumber
Terima kasih atas jawaban yang bagus. Saya akan memeriksa kode dan melihat apakah itu jenis pekerjaan yang dapat saya pikirkan pada sore hari!
user9359
@Clive, jawaban Anda benar-benar benar dari sudut pandang praktik terbaik pengembangan Drupal. Tetapi jika Anda hanya perlu mengubah satu string kecil di beberapa fungsi - itu bukan pendekatan yang baik untuk membuat formatter khusus. Karena semakin banyak kode khusus yang Anda tulis - semakin banyak bug yang Anda tambahkan. Dan Anda menyarankan user9359 untuk membuat 4 kait, kebanyakan dari mereka akan dikopi dari modul perdagangan yang ada !!! Saya pikir menggunakan tambalan kecil jauh lebih tepat untuk situasi ini.
Eugene Fidelin
2
@Eugene Ya itu benar-benar panggilan penilaian, setiap orang mungkin akan memiliki definisi berbeda 'tepat' dalam situasi ini. Secara pribadi saya lebih suka metode panjang karena itu berarti saya tidak perlu memelihara file tambalan, dan logika kontrol versi mewah yang saya miliki tidak akan terpengaruh oleh file modul 'diubah' yang nakal ini; tapi itu hanya saya, jika Anda merasa nyaman untuk memelihara file tambalan maka akan jauh lebih sedikit upaya untuk melakukan itu daripada menerapkan kembali semua fungsi ini. Jawaban ini jelas sejalan dengan bagaimana , belum tentu alasannya :)
Clive
lagi dekat dengan resuce
vishal
2

Tampaknya, Anda tidak dapat mengabaikan fungsi ini karena tidak menggunakan tema atau alur kerja pengait.

Satu-satunya cara - adalah dengan langsung mengubah commerce_price_table_display_quantity_headers()fungsi. Kemudian buat tambalan dengan Anda perubahan.

Nanti jika Anda memperbarui modul Commerce - Anda perlu menerapkan tambalan Anda.

Eugene Fidelin
sumber
Ya, itulah yang saya coba hindari tapi sepertinya menggoda setelah melihat saran Clive!
user9359
1

Saya pikir jawaban Eugene benar bahwa Anda tidak dapat melakukannya tanpa menimpa secara langsung.

Namun, apa yang menurut saya bermanfaat adalah jika benar-benar diperlukan untuk melakukan ini, pindahkan modul ini dari sites/all/modules/contribdirektori Anda ke sites/all/modules/customdir sehingga Anda dapat mengetahui dan melacak fakta bahwa Anda membuat perubahan khusus.

nedwardss
sumber
Ya terima kasih atas tipnya, saya pernah membaca tentang hal itu sebelumnya
user9359