Drupal 8テーマへのJSの追加(drupal_add_jsの置き換え)


8

Drupal 7ではdrupal_add_js、テーマのtemplate.phpファイル内でtheme_preprocess_html(&$vars)関数として使用できます。

   drupal_add_js(drupal_get_path('theme', 'mytheme') . '/js/scripts.js',
        array(
          'group' => JS_THEME,
          'preprocess' => TRUE,
          'weight' => '999',
        ));

  $vars['scripts'] = drupal_get_js();

Drupal 8ではattached、テーマの.themeファイルで次のように変換してみました。

  $vars['#attached']['js'] = array(
    array(
      'data' => drupal_get_path('theme', 'mytheme') . '/js/scripts.js',
      'options' => array(
        'group' => JS_THEME,
        'preprocess' => TRUE,
        'every_page' => TRUE,
      ),
    ),
  );

...しかし、それは機能せず、ウォッチドッグ/コンソールなどにエラーはありませんでした。

よるとD8のAPIのページのためにdrupal_add_js

非推奨-Drupal 8.0以降。代わりに、レンダー配列で#attachedキーを使用してください。

ただし、それ以上の情報はありませんでした。そのようでdrupal_add_cssも、この方法を使用します。Drupal 8はまだ初期の段階ですが、これに飛びつきたいと思っていました。


1
ただの推測です-おそらくライブラリアプローチを試すべきですか?また、「動作しませんでした」という記述はご遠慮ください。それが何を意味するかを推測しなければならないとき、あなたはそれを嫌いではありませんか?警告?エラー?何もファイルが含まれていませんか?
Mołot

@Mołot-警告やエラーはなく、ウォッチドッグもチェックしました。Chromeのコンソールも確認しましたが、エラーは発生しなかったため、「動作しませんでした」と報告することができます。完全なエラー報告がオンになっていて、このテーマをDrupal 8に移植している間、私は間違いなくそれらの公平なシェアを手に入れました。とにかく、ライブラリアプローチは以下の答えではなく、進むべき道のように思えます。Drupal 8モジュールをいくつか選択して、理解できるかどうかを確認します。
ダニーイングランド人2013年

あなたは「それはエラーなしで動作するのに失敗しました...」と報告することができます-そして、私たちは何もないことを知っているでしょう、そしてあなたは尋ねる前に実際にあなたの部分をしました。それは私があなたから望んでいたすべてです:)ここであまりにも多くの人が...でもチェックせずに尋ねる
Mołot

1
わかりました、より良い問題の概要で更新しました。:)
ダニーイングランド人2013年

回答:


7

次のようにhook_preprocess_page接続して使用できるようです:

function MYTHEME_preprocess_page(&$vars, $hook) {
  $path = drupal_get_path('theme', 'MYTHEME');
     // Render the main scripts file.
  $local_js = array(
    '#attached' => array(
      'js' => array(
        $path . '/js/scripts.js' => array(
          'group' => JS_THEME,
          'weight' => 9999),
      ),
    ),
  );
  \Drupal::service('renderer')->renderRoot($local_js);
}

これはうまく機能します(theme.incがこのメソッドを使用します)。ウェイトの周りにネストされた追加の配列に注意してください。


完全に機能するバージョン、重量などを反映するようにコードを更新しました。
ダニーイングランド人2013年

まさに私が必要としたもの、大歓迎です!!!
Yassin Tahtah、2015年

4

ドキュメントの重要なポイントはこのビットです

代わりに、レンダー配列で #attachedキー使用してください。

鉱山を強調します。

$variablesテーマ/前処理機能の配列は、それが変数を保持しているだけで、配列の配列だレンダリングではありません。使用#attachedするには、前処理関数で次のようなものが必要です。

$vars['foo'] = array(
  '#markup' => '<p>Bar</p>',
  '#attached' => array(
    'data' => drupal_get_path('theme', 'mytheme') . '/js/scripts.js',
    'options' => array(
      'group' => JS_THEME,
      'preprocess' => TRUE,
      'every_page' => TRUE,
    ),
  ),
);

そして、これはテンプレートファイルにあります:

{ foo }

つまり、Drupal 7とほぼ同じです(少なくとも現時点では)。

hook_preprocess_html()ちなみに、おそらくこのコードの適切な場所ではありません。これ以上追加するには遅すぎますので、JS / CSSファイルが実際にそのテンプレートでレンダリングされていることを忘れないでくださいhook_preprocess_page()hook_preprocess_node()または同等のは、おそらくあなたに、より信頼性の高い結果を得ることができます。

変数の前処理の詳細については、Twigのベストプラクティス-関数とテンプレートの前処理のページをご覧ください。


1
これは正しいです。プリプロセス/プロセス関数に渡される変数は、レンダリング配列にはなりません。
kiamlaluno

すべての敬意を払って、私は単にテーマにjsファイルを追加するためのDrupal 8の代替品を見つけようとしているだけで、その中に変数をレンダリングしようとしているのではありません。私がそうしたとしても、それは{{ foo }}Twigの世界のように行われます。テーマテンプレートにphp / print renderはもうありません。すなわち、node.html.twig/page.html.twig
Danny

1
うん、脳が凍ってるわ。答えは同じです。#attachedレンダー配列のコンテキストでのみ使用できます。ドキュメントは正しいです。あなたのいずれかと一緒に、上記のメソッドを使用する必要があり、この前処理およびプリレンダリングの変数に、またはJSを含めるようにあなたのテーマの.info.ymlファイルを使用します。私がこれまでに知ることができる唯一の選択肢は、ライブラリのルートを下ることなく
クライヴ

1
:私はアプローチがこれに似たものになるだろうと思いますdrupalcode.org/project/drupal.git/blob/refs/heads/8.x:/core/... -用途ライン564参照hook_library_infoMołotは、上記暗示しています。少し遊んでみます。ありがとう。
ダニーイングランド人2013年


2

この例では、実際のレンダリング配列を使用しており、関数自体でレンダリングされる配列は使用していません。

このように、他のモジュール、テーマなどがそれを変更できます。

/**
 * Implements hook_page_alter().
 */
function db_jacket_page_alter(&$page) {
  $page['#attached']['js'][] = drupal_get_path('theme', 'db_jacket') . '/js/jquery.image-depth.js';
}

0

OPは、Drupalの8についてですけれども、これは使用せず、Drupalの7における同様の方法で行うことができるdrupal_add_js()持っていないために慣れ始めるためにdrupal_add_js()周り:

/**
 * Implements hook_preprocess_page().
 */
function YOURMODULE_preprocess_page(&$variables) {
  $module_path = drupal_get_path('module', 'YOURMODULE');
  $variables['page']['content']['#attached']['js'][$module_path . '/js/YOURMODULE.js'] = array();
}

オプションは空の配列で定義できます。https://api.drupal.org/api/drupal/includes%21common.inc/function/drupal_add_js/7を参照してください

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