web-dev-qa-db-ja.com

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

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

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

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

7
Dave

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

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

  • モジュールが変更するページコールバックのコードを使用する場合は、ページコールバックを hook_menu_alter() で変更します。
  • モジュールが変更したいテーマ関数を実装している場合は、 hook_theme_registry_alter() に関連付けられている関数を変更します。または、テーマ関数が取得する変数を変更するだけで十分な場合は、そのテーマ関数のプリプロセス関数を実装できます(例:hook_preprocess_rdf_metadata() for 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を介した)モジュールの自動更新が不可能になるためです。

11
kiamlaluno

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

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

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

2

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

http://drupal.org/project/drush_make

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

1
David Meister