Come si fa a caricare i file JavaScript supplementari necessari per WYSIWYG plugin API sulle pagine nodo / modificare?
Domanda
Sto costruendo un plugin utilizzando il modulo API WYSIWYG per Drupal 7 che aggiunge un pulsante alla barra degli strumenti di editor supportati.
Sto usando il gancio hook_wysiwyg_plugin()
per creare un nuovo pulsante sulla barra degli strumenti dell'editor ma ho bisogno di caricare un paio di altri file javascript. Il gancio hook_wysiwyg_plugin()
sembra permettere di specificare un file JS e CSS.
Come posso caricare aggiuntivo richiesto file JavaScript necessari per il plugin di javascript?
Ho implementato hook_library()
per definire una libreria ossia js file / css, ma sono sicuro di come ho gancio che fino ad api wysiwyg in modo che caricano sul nodo / schermate di modifica?
Soluzione
In realtà è abbastanza semplice, anche se la mia esperienza con il fare la stessa cosa è attraverso Drupal 6, così ci possono essere alcune differenze minori con il mio codice:
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(...);
}
Ancora una volta, questo codice è per D6, ma il principio di base dovrebbe funzionare.
Mentre non è legato direttamente alle API Wysiwyg, è probabilmente l'opzione migliore in quanto l'API Wysiwyg solo supporti su file di JS per plug-in (IIRC).
Alcuni selvaggio / opzioni non testati per voi:
-
Fare un callback di menu per il file JavaScript definiti nel plugin e passare di nuovo un file javascript in qualche cache contenente le fonti di più file javascript. (Wysiwyg Campi fa fare la richiamata menù per i plugin generati dinamicamente, ma solo per un file javascript, vedere la fonte di idee).
-
L'uso di una tecnica di caricamento Javascript dinamica Javascript simile a http: //www.javascriptkit. com / javatutors / loadjavascriptcss.shtml
Spero che questo aiuti.
Altri suggerimenti
function yourmodule_preprocess_page(&$vars)
{
$node = $vars['node'];
if($node->type == 'yournodetype' AND arg(2) == 'edit')
{
drupal_add_js([...]);
}
}
In teoria, tutto ciò che avrebbe bisogno di fare è utilizzare il diritto " # text_format " parametro sull'elemento #type textarea
FAPI per l'editor wysiwyg associato con il formato testo da includere automaticamente, in questo modo:
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;
}
Tuttavia, non ottiene incluso a meno che non si tratta di una pagina "nodo di modifica", in modo da qualcosa legato a funzioni "filter_process_format
" o "wysiwyg_pre_render_text_format
" può essere in grado di forzare, ma non ho ancora trovato la combinazione magica, ancora leggendo la fonte del modulo Wysiwyg per trovare il pezzo mancante.