2008-09-14 11 views
23

Drupal 6の特定のノードにCSSまたはJavascriptファイルを含める最良の方法は何ですか?Drupal 6の特定のノードにCSSまたはJavascriptファイルを含める

小さなJavaScriptアプリケーションを実行しているサイトにページを作成したいので、CSSとjavascriptは固有のものですそのページは、他のページの読み込みには全く含まれたくないでしょう。

答えて

3

PHPの入力モードを有効にしてから、ノード本体の先頭にあるPHPブロックでdrupal_add_cssdrupal_add_jsを適切に呼び出してください。

+0

私はDrupal 5でこの技術を繰り返し使用しました。たとえば、このサイトのフロントページの「クラブカレンダー」はこのように実装されました。 http://www.chesmontastro.org/ –

+4

これは最も簡単な解決策かもしれませんが、データベースにPHPコードを保存することは非常に難しいため、改訂管理はほとんど不可能です。上記のInferisのソリューションは、はるかにクリーンなアプローチです。 – jhedstrom

0

javascriptを呼び出すノード(node-needsjs.tpl.php)のカスタムテンプレートを作成できます。これは、ノード本体でPHPを使用するよりも少し洗練されており、将来的にコンテンツの変更を容易にします。

編集:私は上ではっきりとは思わなかった。テンプレートファイルにnode-(nodeid).tpl.phpという名前を付けたいとします。したがって、ノード1の場合、node-1.tpl.phpファイルを呼び出してください。

+0

私は本当にこの答えをよく考えていたはずです - カスタムテンプレートファイルを使用することのさらなるメリットはtemplate.phpのtemplate_preprocess_page関数を介して他のノードにテンプレートを使用させることです。 – MattBelanger

2

これは、ノードを表示するときにhook_nodeapiを使用してJS/CSSを挿入するトリックモジュールです。

function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { 
    // the node ID of the node you want to modify 
    $node_to_modify = 6; 

    // do it! 
    if($op == 'view' && $node->nid == $node_to_modify) { 
    drupal_add_js(drupal_get_path('module', 'mymodule') . '/mymodule.js'); 
    drupal_add_css(drupal_get_path('module', 'mymodule') . '/mymodule.css'); 
    } 
} 

これはPHPの入力フィルタを有効にすると、セキュリティ上の問題を回避し、あなたがメインのノードテンプレートを更新して、カスタム1を忘れてしまった場合に時代遅れになる可能性があり、別のノードテンプレートファイルを必要としません。

14

これには、hook_nodeapiを使用しないことをおすすめします。 CSSとJavascriptを追加するとレイアウトに関係するので、hook_nodeapiはそれを使用する場所ではありません:テーマを使用してください。こうすることで、新しいテーマを作成するときにのファイルを上書きすることができます。 nodeapiアプローチを使用すると、ファイルのjs/cssリストを検索して削除し、自分で置き換える必要があります。

とにかく必要なことは、それらのファイルを追加するノード前処理機能を追加することです。これは、モジュールまたはカスタムテーマで行うことができます。モジュールについては、これは次のようになります。

function mymodule_preprocess_node(&$variables) { 
    $node = $variables['node']; 
    if (!empty($node) && $node->nid == $the_specific_node_id) { 
    drupal_add_js(drupal_get_path('module', 'mymodule') . "/file.js", "module"); 
    drupal_add_css(drupal_get_path('module', 'mymodule') . "/file.css", "module"); 
    } 
} 

やテーマについて:

function mytheme_preprocess_node(&$variables) { 
    $node = $variables['node']; 
    if (!empty($node) && $node->nid == $the_specific_node_id) { 
    drupal_add_js(path_to_theme() . "/file.js", "theme"); 
    drupal_add_css(path_to_theme(). "/file.css", "theme"); 
    } 
} 

はまず、キャッシュをクリアすることを忘れないでください。

これらの関数は、ノードがテーマ指定される前に呼び出されます。 js/cssを指定すると、カスケード型のアプローチが可能になります。モジュールに汎用/基本的な機能を持たせ、テーマに拡張機能や特定の機能を提供することができます。

+0

些細な修正:テーマにCSSを追加するときは、drupal_add_cssコールの後にstyles変数を更新する必要があります。 $ variables ['styles'] = drupal_get_css(); – Pianosaurus

5

私は前処理機能を使用しますが、これにはいくつかの問題があります。 $variables['styles']は通常に設定されてから、のノード前処理機能が呼び出されます。つまり、drupal_get_cssが既に呼び出されているため、drupal_add_cssは役に立ちません。 drupal_add_jsも同様です。私はこれを回避するために$variables['styles']の値をリセットします。

function mytheme_preprocess_node(&$variables) { 
    $node = $variables['node']; 
    if (!empty($node) && $node->nid == $the_specific_node_id) { 
    drupal_add_js(path_to_theme() . "/file.js", "theme"); 
    drupal_add_css(path_to_theme(). "/file.css", "theme"); 
    $variables['styles'] = drupal_get_css(); 
    $variables['script'] = drupal_get_js(); 
    } 
} 

これはほとんどの場合有効です。

P.S.テーマの問題を解決するためのモジュールを作成する必要はほとんどありません。

乾杯。

4

これは良い解決策のように思える:

http://drupal.org/project/js_injectorhttp://drupal.org/project/css_injector

あなたは何のノードIDと無PHPの入力オプションがありませんので、技術的にノード以外の何かにインラインコードを挿入したい場合には動作します利用可能です。私は小さなjQueryの調整をいくつかの管理ページに挿入するのと同じように使いました。これはノードIDではなくパスで動作します。

関連する問題