web-dev-qa-db-ja.com

テーマのアクティブ化時にカスタムモジュールを自動的に有効にする方法は?

[root]/modules/[custom module]ディレクトリに定義したカスタムモジュールがあります。カスタムモジュールフォルダーをユーザーに渡し、ダッシュボードの[拡張]オプションを使用してそのモジュールを1つずつ手動でインストールするように求めるのではなく、誰かが私のテーマをインストールするとすぐにアクティブになるようにします。 Drupal 8でそれをどのように行うことができますか?

4
hira12

@ 4k4が言及したように、現在進行中の開発があります テーマがモジュールへの依存関係を宣言できるようにする 8.6.0のコアにうまく行きます。それまでは、次のコード行をトリガーするためにテーマのどこかに場所があることを除いて、少し運が悪いです。

\Drupal::service('module_installer')->install(['MYMODULE']);

あるいは、2番目のモジュールを提供することもできますこれはバックエンドにいくつかのボタンを提供しますどのクリックが上記の行に加えて、次の2行をすべて同時にトリガーするか。

\Drupal::service('theme_installer')->install(['MYTHEME']);
\Drupal::service('theme_handler')->setDefault('MYTHEME');

上記の問題の背後にある背景は、テーマがDrush 9コマンドを提供できないことです。 Drush 9コマンドは特定のサービスに依存しているため。しかし、テーマはこれらのサービスを提供することを許可されていません。次の問題を参照してください: テーマにservices.ymlを提供することを許可として閉じられましたが、修正できません

サービスの問題を(簡単に言えば)クローズする理由は、物事を(OOPの観点から))クリーンに保ち、テーマがotherにならないようにするためですモジュール。テーマはテンプレート、スタイル、スクリプトを提供する必要がありますが、モジュールはサービスを含むOOP関連のすべてを提供する必要があります。

また、(この決定のため)テーマはDrushコマンドを提供できなくなったため、(サブ)テーマの開発とメンテナンスに役立つコマンド/スクリプトとライブラリを提供するために、コンパニオンモジュールに依存できるようにする必要があります。その後、テーマのアクティブ化時に自動的にアクティブ化されます。楽しみにして、これをできるだけ早くコアに組み込むために貢献しましょう!

2
leymannx