Как загружать дополнительные файлы JavaScript, необходимые для плагина Wysiwyg API на страницах узла/редактирования?
Вопрос
Я строю плагин, используя модуль API Wysiwyg для Drupal 7, который добавит кнопку на панель инструментов поддерживаемых редакторов.
Я использую hook_wysiwyg_plugin()
Зацепите, чтобы создать новую кнопку на панели инструментов редактора, но мне нужно загрузить несколько других файлов JavaScript. А hook_wysiwyg_plugin()
Крюк, кажется, позволяет вам указать один файл JS и CSS.
Как я могу загрузить дополнительные необходимые файлы JavaScript, необходимые для плагина JavaScript?
Я реализовал hook_library()
Чтобы определить библиотеку, то есть файлы JS/CSS, но я не уверен, как я подключаю это к API Wysiwyg, чтобы они загружали на экраны узла/редактирование?
Решение
Это на самом деле довольно просто, хотя мой опыт работы с тем же, что через 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, но основной принцип все еще должен работать.
Хотя он не связан непосредственно с API Wysiwyg, это, вероятно, лучший вариант, поскольку API Wysiwyg поддерживает только в файле JS на плагин (IIRC).
Несколько диких/непроверенных вариантов для вас:
Сделайте обратный вызов меню для файла JavaScript, определенного в плагине, и передайте несколько кэшированный файл JavaScript, содержащий источники нескольких файлов JavaScript. (Fields Wysiwyg выполняет обратный вызов меню для динамически сгенерированных плагинов, но только для одного файла JavaScript см. Источник для идей).
Используйте метод загрузки JavaScript Dynamic JavaScript, аналогичный http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml
Надеюсь это поможет.
Другие советы
function yourmodule_preprocess_page(&$vars)
{
$node = $vars['node'];
if($node->type == 'yournodetype' AND arg(2) == 'edit')
{
drupal_add_js([...]);
}
}
Теоретически все, что вам нужно сделать, это использовать правильное »#Text_format"Параметр на #type textarea
Элемент FAPI для редактора wysiwyg, связанного с текстовым форматом, будет автоматически включать, таким образом:
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, чтобы найти недостающую часть.