2010-04-06 23 views
7

In Drupal è possibile creare il proprio nodetype in un modulo personalizzato. In questo modo puoi creare la tua forma che è molto bella.Aggiunta di js a un modulo di drupal node

Tuttavia se si desidera aggiungere js al modulo le cose diventano un po 'più complicate. Se aggiungi il js nel modulo, il js verrà aggiunto al modulo solo quando viene caricato. Se l'utente pubblica il modulo con errori di convalida, la funzione del modulo non viene eseguita di nuovo e quindi il js non viene aggiunto. Normalmente si dovrebbe semplicemente creare un callback di menu e aggiungere i js lì, ma per il modulo di aggiunta del nodo, questa non sarà una possibile soluzione.

Quindi qual è la soluzione migliore per aggiungere js in un modulo di aggiunta nodo, per mantenerlo persistente quando il modulo non convalida?

+0

Lo stesso su Drupal Answers: http://drupal.stackexchange.com/questions/70015/adding-css-and-js-to-form-with-attachments – Nux

risposta

11

Provando alcuni hack diversi, ho trovato una soluzione abbastanza semplice a questo problema, creare una funzione tema per il modulo e aggiungere i js lì. Sembrerebbe qualcosa del genere:

function theme_content_type_node_form($form) { 
    drupal_add_js(...); 
    return theme('node_form', $form); 
} 

Ciò richiama semplicemente la funzione tema predefinita per il modulo di aggiunta nodo dopo l'aggiunta di js. Poiché la funzione tema è chiamata anche il modulo è memorizzato nella cache, funziona bene. È inoltre necessario implementare hook_theme per farlo funzionare.

Aggiornamento per Drupal 7.

Drupal 7 rende molto più facile in quanto è possibile fare

$form['#attached']['js'][] = 'path_to_js_file; 

Un esempio di utilizzo di questo potrebbe essere:

$form['#attached']['js'][] = drupal_get_path('module', 'foo') . '/js/foo.form.js'; 
+4

Interessante - Sono sorpreso che questo funzioni senza creare un ciclo infinito, poichè la chiamata a 'theme ('node_form')' potrebbe finire per invocare di nuovo il tuo override. Non sarebbe meglio mettere la chiamata 'drupal_add_js' in una funzione' theme_preprocess'? –

+2

@ Henrik Opel: Suppongo che una funzione theme_preprocess faccia il trucco, non ci ho pensato al momento. La funzione theme_node_form è la funzione che verrebbe chiamata se content_type_node_form non esiste, quindi non credo che un loop infinito sia di alcun pericolo.Ma immagino che sia un po 'più hacker che usare la funzione di pre-elaborazione del tema s. – googletorp

+0

Si potrebbe fare return theme_node_form ($ form); invece del tema di ritorno ('node_form', $ form); per evitare il loop infinito. – rooby

2

ho inviato un cerotto al modulo Smilies che risolve questo problema: Smilies are not selectable when resubmitting a page

La patch aggiunge una funzione hook_nodeapi() per verificare se l'operazione nodo è "verifica" e se lo è, controlla se il nodo dovrebbe avere smiley e in tal caso chiama la funzione per aggiungere il file javascript smileys.js che crea il modulo di selezione.

Dovresti solo fare lo stesso nel tuo caso. Ciò richiederà la scrittura di un modulo molto semplice che implementa la funzione hook_nodeapi e controlla gli aggiornamenti nello stesso modo in cui fa il modulo Smileys patchato.

+0

Grazie per il suggerimento. Ho finito per utilizzare una funzione tema per fare il trucco poiché è un po 'più pulito in questo caso specifico. – googletorp

0

È possibile l'utente hook_nodeapi con il caso prepare:

Esempio:

/** 
* Implementation of hook_nodeapi 
*/ 

function mymodulename_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { 
    switch($op) {  
    case 'prepare': 
     $module_path = drupal_get_path('module' , 'mymodulename'); 
     drupal_add_js($module_path."/myscript.js"); 
     break; 
    } 
} 

Ora è possibile aggiungere il codice JavaScript nel modulo di cartella di esempio myscript.js.