提供されたモジュール機能のオーバーライド


7

寄稿したモジュールを少しハックして、必要な機能を少し追加する必要があります。これは通常、モジュールのメンテナがおそらく使用したくないプロジェクトに固有の機能です。

現在、私はすべてのハックのためのパッチファイルを作成し、そのようなパッチファイルをすべてsite / all / modulesに保存しています。このようにして、モジュールを更新するときはいつでも、ハックを簡単に再適用して競合を解決できます。

どうしようもない気がします。私ですか?

回答:


11

パッチは必ずしも新しいバージョンのモジュールに適用されるとは限りません。パッチを適用した関数を別の行に移動するか、その関数のコードを変更するだけで、パッチは適用されなくなります。関数を別の行に移動するには、別の関数を書き直して行数を増やす(または行数を減らす)だけで十分です。

モジュールの動作を変更するより良い方法は、Drupal 7の場合です。

  • モジュールが、変更するページコールバックのコードを使用する場合は、hook_menu_alter()使用してページコールバックを変更します。
  • モジュールが変更するテーマ関数を実装している場合は、hook_theme_registry_alter()に関連付けられている関数を変更します。それはテーマ機能が取得する変数を変更するのに十分である場合の代替では、あなたは例えば(そのテーマ機能のための前処理機能を実装することができhook_preprocess_rdf_metadata()ため)(theme_rdf_metadata、テーマ機能が得ることの変数を変更します。
  • モジュールがdb_select()を使用してSQLクエリを実行し、タグをクエリに割り当てる場合、実行されたクエリをhook_query_alter()で変更します。
  • モジュールが実行したくないフックを実装している場合は、hook_module_implements_alter()を実装して、実行されないようにすることができます。
  • モジュールが変更フック(たとえばhook_page_alter())を実装していて、そのフックが変更したものを変更したい場合は、同じ変更フックを実装し、そのモジュールから実装された後に実行されることを確認します。

変更したい関数がフックではない場合:

  • 関数が他のモジュールから実装されたフックを使用していることを確認してください。たとえば、node_save()hook_node_presave()を呼び出します。ノードの「変更された」プロパティを変更する場合は、ハッキングnode_save()はしませんがhook_node_presave()、変更するために実装します。
  • 関数がフックから参照/使用されていることを確認してください。その場合、前に説明したように、そのフックに対して何かを行うことができます。

今まで述べたことが当てはまらない場合は、カスタムモジュールを作成し、他のモジュールのコードを使用して作成することをお勧めします。また、機能が実装されていることを期待して、既存のモジュールの機能リクエストを依頼してみます。
特に、(Update ManagerまたはDrushを介した)モジュールの自動更新がそのモジュールで不可能になるため、サードパーティのモジュールをハッキングすることは決して良い考えではありません。


2

ほとんどのモジュールには、モジュールの多くの機能をオーバーライドするフックと、テーマを乗り越えるためのテーマ機能が付属しています。ほとんどの場合、それを試して使用する必要があります。コード自体をハッキングすることを避けます。

達成したいことがオーバーライドで実行できるものではないことが確実である場合、私が選択する次のオプションは、モジュールのコピーを作成し、それに他の名前を付け、さらには、本当に必要はありませんし、そこから新しいモジュールを作成します。

変更がほとんどない場合は、コード自体を変更しても害はありませんが、アップグレード後に変更を追跡して、すでに実行していると思われるコードを再度機能させる必要があります。


1
ありがとう。可能な場合はフックを使用します。私が言及しているハックは常にかなりマイナーなので、モジュールのコピーは、特にモジュールの更新を処理する場合、その価値よりも問題が多くなる可能性があります。
デイブ

だから私はあなたが正しい軌道に乗っていると思います:-)
Mohammed Shameem 2013年

1

ええ、IMOあなたは「間違っている」のかもしれませんが、おそらくプロジェクトの要件は私の平均的なプロジェクトの要件よりも少ないでしょう:)すべてのパッチとモジュールのバージョンをDrushメイクファイルに入れて、Drushで常にプラットフォームを構築できるようにします何かが起こります。

http://drupal.org/project/drush_make

構文がわかれば、Makeファイルは非常に簡単に記述できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.