web-dev-qa-db-ja.com

モジュールパスを取得するにはどうすればよいですか?

Drupal 8でモジュールを作成しています。このようにJavaScriptファイルで渡すには、mymoduleへの相対パスを定義する必要があります。

$scope.getPlatformIcon = function (_platform) {
     var modulePath = "/modules/mymodule"
     switch (_platform) {
         case "youtube":
         case "Twitter":
         case "instagram":
         case "facebook":
             return modulePath+"/img/"+_platform+".png";
     }
     return false;
};

Drupal 7では、以下を使用できます。

var modulePath = Drupal.settings.mymodule.basePath;

Drupal 8ルートディレクトリの場合、以下を使用できます。

drupalSettings.path.baseUrl

モジュールパスを取得する方法が見つかりませんでした。

Drupal 8でどうすればよいですか?

8
ceaucari

Drupal 8では、このdrupal設定はデフォルトでは使用できません。既存の変数を確認するには、HTMLページでこのJSON配列を探します。

<script type="application/json" data-drupal-selector="drupal-settings-json">{

モジュールパス変数を追加するには、次のコードを使用します。

$build['#attached']['drupalSettings']['mymodule']['mylib']['path'] = drupal_get_path('module', 'mymodule');

DrupalSettingsの詳細については、以下を参照してください。

{{twig変数}}を外部jquery内で使用

7
4k4

元の質問(モジュールパスを取得する方法)に答えるために、ここでJavaScriptの添付ファイルの部分を考慮に入れていないOOフレンドリーなソリューション(依存関係を示さない)注射自体):

$module_handler = \Drupal::service('module_handler');
$module_path = $module_handler->getModule('my_module')->getPath();

これにより、次のものが返されます(もちろん、ディレクトリ構造がどのように見えるかによっても異なります)。

"modules/custom/my_module"

drupal_get_pathは実際に書く方が速いです。ただし、上記と同じサービスを静的に呼び出すため、コードで単体テストを実行できません(クラスの依存関係が表示されないことは言うまでもありません)。簡単に言えば、物事をクイック&ダーティーにすることを選択した場合、drupal_get_path他のケースでは、適切な依存関係注入を使用して、適切なサービスを自分で使用します。

12
ssibal