モジュールから関数をオーバーライドするにはどうすればよいですか?


8

まず、この回答が他の場所でカバーされている場合は、申し訳ありません。私はたくさんの検索を行ってきましたが、テーマの関数とフックのオーバーリングに関する情報しか見つけることができません。

Drupal Commerceアイテムの価格表を作成するモジュールを使用しています。テーブルヘッダーをフォーマットする関数があります。

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

ご覧のとおり、これはtemplate.phpでオーバーライドできるテーマ関数ではありませんが、出力の一部を微調整することができます。

もちろん、将来的に更新される場合に備えてモジュール自体を編集したくないので、この関数を再定義して、いくつかを変更したり変更したりするにはどうすればよいですか?

これまでの私の仕事...

これまでのところ、それが機能しているかどうかを示すためにいくつかの微妙な変更を加えた別のモジュールとして作成しようとしましたが、出力を上書きしていません。

情報ファイル

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

モジュールファイル

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

回答:


12

それはDrupalです...常に方法はありますが、それを実行するのにかかる時間の長さによって、2度考えてしまうかもしれません:)

フードチェーンといえば、この関数がによって排他的に使用されていることがわかります。これはcommerce_price_table_field_formatter_view()commerce_price_tableフィールドタイプに使用されるフィールドフォーマッターを宣言しています。

これを念頭に置くと、独自のフィールドフォーマッタを非常に簡単に実装し、commerce_price_tableフィールドタイプに割り当て、必要なだけカスタムコードを使用できます。

基本的には実装する必要があります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'),
      ),
    ),
  );
}

そしてhook_field_formatter_view()field_formatter_settings_form()そして(オプションで)を実装しますhook_field_formatter_summary()

これらの各関数については、contribモジュールの同じ関数からコードを取得し、必要な場所で変更を加えます。


すばらしい答えをありがとう。コードを調べて、それが金曜日の午後に私の頭で処理できる種類の仕事かどうかを確認します。
user9359 2012

@Clive、あなたの答えは、Drupal開発のベストプラクティスの観点からは完全に正しいです。ただし、一部の関数で1つの小さな文字列のみを変更する必要がある場合-カスタムフォーマッタを作成するのは良い方法ではありません。作成するカスタムコードが多いほど、バグが増えるためです。そして、あなたはuser9359に4つのフックを作成することを提案しますそれらのほとんどは既存のコマースモジュールからコピーペーストされます!!! この状況では、小さなパッチを使用する方がはるかに適切だと思います。
ユージーンフィデリン2012

2
@Eugeneええ、それは本当に判断の呼びかけです。この状況では、一人一人がおそらく「適切」の異なる定義を持つでしょう。個人的には、パッチファイルを維持する必要がないことを意味する長い方法と、この不正な「変更された」モジュールファイルの影響を受けない豪華なバージョン管理ロジックを好みます。しかし、それは私に過ぎません。パッチファイルの保守に慣れている場合は、この機能をすべて再実装するよりもはるかに少ない労力で済みます。この答えは、の線に沿って間違いだった必ずしも、なぜ :)
クライヴ

再び解決策を練る
2013年

2

テーマやフックワークフローを使用しないため、この関数をオーバーライドできないようです。

唯一の方法- commerce_price_table_display_quantity_headers()機能を直接変更することです。次に変更を加えたパッチ作成します。

後でコマースモジュールを更新する場合-パッチを適用する必要があります。


ええ、それは私が避けようとしていたことですが、クライヴの提案をざっと見た後、それは魅力的に思えます!
user9359 2012

1

ユージーンの答えだと思いますあなたが直接上書きせずにそれを行うことができないということが正しいです。

ただし、これが絶対に必要な場合は、このモジュールをsites/all/modules/contribディレクトリからsites/all/modules/customdir に移動すると、カスタムの変更を認識して追跡できるようになります。


ええ、ヒントをありがとう、私はそれについて以前に読んだでしょう
user9359
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.