サポートされているエディターのツールバーにボタンを追加するDrupal 7のWYSIWYG APIモジュールを使用してプラグインを構築しています。
hook_wysiwyg_plugin()
フックを使用して、エディターのツールバーに新しいボタンを作成していますが、他のJavaScriptファイルをいくつかロードする必要があります。 hook_wysiwyg_plugin()
フックを使用すると、JSファイルとCSSファイルを1つ指定できます。
プラグインJavaScriptに必要な追加のJavaScriptファイルをロードするにはどうすればよいですか?
ライブラリ、つまりjs/cssファイルを定義するためにhook_library()
を実装しましたが、それをどのようにwysiwyg apiに接続して、ノード/編集画面にロードするかがわかりませんか?
実際には非常に単純ですが、同じことをする私の経験はDrupal 6であるので、私のコードにはいくつかの小さな違いがあるかもしれません:
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
// Only modify node_form's.
// @TODO - Set a condition for all forms you wish to alter for D7 entities.
if (isset($form['type']['#value']) && $form_id == "{$form['type']['#value']}_node_form") {
// We use after build to add JS and CSS to prevent issues caused by form caching.
$form['#after_build'][] = 'MYMODULE_form_alter_after_build';
}
}
function MYMODULE_form_alter_after_build($form_element, &$form_state) {
drupal_add_js(...);
}
繰り返しますが、このコードはD6用ですが、基本原則は引き続き機能します。
Wysiwyg APIに直接関連付けられているわけではありませんが、Wysiwyg APIはプラグイン(iirc)ごとのJSファイルでのみサポートしているため、おそらくこれが最良のオプションです。
あなたのためのいくつかの野生の/試されていないオプション:
プラグインで定義されたJavaScriptファイルのメニューコールバックを作成し、複数のJavaScriptファイルのソースを含む多少キャッシュされたJavaScriptファイルを返します。 (Wysiwyg Fieldsは動的に生成されたプラグインのメニューコールバックを行いますが、1つのjavascriptファイルについてのみです。アイデアのソースを参照してください)。
http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml と同様のJavaScript動的Javascriptロードテクニックを使用します
お役に立てれば。
drupal_add_js の場合:
function yourmodule_preprocess_page(&$vars)
{
$node = $vars['node'];
if($node->type == 'yournodetype' AND arg(2) == 'edit')
{
drupal_add_js([...]);
}
}
理論的には、#type textarea
で適切な "#text_format"パラメータを使用するだけです。テキスト形式に関連付けられたwysiwygエディターのFAPI要素は、次のようにして自動的に含まれます。
function mymodule_menu(){
return array(
'mypage' => array(
'title' => 'A page to test wysiwyg',
'page callback' => 'drupal_get_form',
'page arguments' => array('mymodule_page'),
'access arguments' => array('access content'),
)
);
}
function mymodule_page($form, &$form_state) {
$element = array(
'#type' => 'textarea',
'#title' => t('Comment'),
'#default_value' => 'something',
'#text_format' => 'full_html',
'#required' => TRUE,
);
$form['mytext'] = $element;
return $form;
}
ただし、「ノード編集」ページでない限り含まれないため、関数「filter_process_format
」または「wysiwyg_pre_render_text_format
」に関連するものが強制的に実行される可能性がありますが、見つかりませんでしたまだ魔法の組み合わせですが、Wysiwygモジュールのソースを読んで、欠けている部分を見つけます。