web-dev-qa-db-ja.com

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

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

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;
}
8
user9359

それは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モジュールの同じ関数からコードを取得し、必要な場所で変更を加えるだけです。

12
Clive

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

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

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

2
Eugene Fidelin

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

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

1
nedwardss