Modo giusto per aggiungere JS e CSS al nodo / modifica e altri moduli


10

Sto creando un sito con molti JS e mi chiedo dove dovrei inserire il codice JS. In modo ottimale, vorrei mantenere JS con ciascun modulo e non con il tema. Alcuni contenuti potrebbero essere esposti come blocchi, ecc.

Ma sto riscontrando alcuni problemi con la cache. Nel mio esempio ho bisogno di aggiungere JS e CSS al modulo di modifica del nodo. Ho usato hook_block_view, ma è memorizzato nella cache. Pertanto, se si verifica un errore nel modulo di modifica del nodo, le funzioni drupal_add_js e drupal_add_css non vengono chiamate. Lo stesso sembra essere vero per hook_node_prepare.

Dove inseriresti il ​​livello JS e CSS? e ci sono hook che vengono chiamati anche se c'è un errore nel modulo di modifica del nodo?

Risposte:


6

Se si desidera aggiungere JS e CSS alla pagina di modifica del nodo in particolare (o qualsiasi modulo in generale), il posto migliore e giusto per farlo è hook_form_alter () e la proprietà che si dovrebbe usare è #after_build.

Questo commento su DO ti dice esattamente cosa fare - http://drupal.org/node/1253520#comment-4881588

Spero che sia di aiuto :-)


Grazie, proprio quello di cui avevo bisogno. Ha una bella forma ora, molto meglio del suo default. Qualche opinione sull'architettura di un tale sito?
Jens,

Sono contento che abbia funzionato. In questo caso dovresti contrassegnare la risposta come "risposta accettata", in modo che la domanda non compaia nell'elenco delle domande senza risposta e la persona che ti aiuta ottiene "karma". Vedo che sei nuovo qui. Anche io lo sono, ma ho account più attivi su altri servizi StackOverflow e adoro questo posto.
Sumeet Pareek,

E oh ... solo sapere che hai bisogno di JS CSS su un modulo e provare a commentare l'architettura del sito non sarebbe altro che un crimine :-p
Sumeet Pareek,

Certo, rispose ora.
Jens,

1
@SumeetPareek Ho annullato il voto della tua risposta (ma senza offesa) perché l'uso #attachedè raccomandato in quasi ogni caso. Inoltre, drupal_add_js / css sarà deprecato in Drupal 8.
AyeshK

6

È necessario utilizzare la proprietà #attached per assicurarsi che JS / CSS venga sempre caricato correttamente insieme a un altro elemento di rendering.


Ho sentito che ciò trarrebbe beneficio da un esempio di come usare #attachede forse alcune informazioni aggiuntive sul problema che stai evitando.
Michael Greisman,

@MichaelGreisman Devo dire che non vedo immediatamente il valore di aggiungere il codice in linea qui. Sarà meglio gestito al link che ho fornito, che è la documentazione ufficiale su come farlo. La mia risposta spiega cosa fare, ma il modulo di documentazione API è il posto giusto per come .
Letharion,

3

Ho sentito che queste risposte e commenti avevano un disperato bisogno di un esempio di codice, in particolare quelli di @AyeshK e @Letharion. È troppo lungo per un commento, quindi ti prego di perdonare la risposta. Se ti è utile, vota per favore o la risposta di Sumeet o Letharion. Inoltre, l'esempio seguente aggiunge ovviamente CSS, ma sarebbe quasi identico per l'aggiunta di javascript.

L'utilizzo della risposta di @ Sumeet, ma l'utilizzo della #attachedproprietà anziché drupal_add_css, si presenta così:

/* Implements hook_form_FORM_ID_alter() */
function MY_MODULE_form_MY_FORM_ID_alter(&$form, &$form_state, $form_id) {
  $form['#after_build'][] = 'MY_MODULE_some_function_name_after_build';
}

function MY_MODULE_some_function_name_after_build($form, &$form_state) {
  $style_path = drupal_get_path('module','MY_MODULE') . '/css/my_css.css';
  // drupal_add_css('file', $style_path);
  $form['#attached']['css'][] = $style_path;
  return $form;
}

Infine, la deprecazione di drupal_add_csspuò essere trovata in questo post . Questa potrebbe essere una novità per molti per i quali drupal_add_xxx stava lavorando bene, come per me.


Il #after_buildpeggio è, per quanto ne so, senza senso, e dovrebbe semplicemente essere rimosso. (C'è un commento simile sulla risposta che fornisce la #after_buildsoluzione) Penso che questo di per sé spieghi perché la mia breve risposta è buona. Se semplicemente guardassi il link che ho fornito, troverai lo stesso codice, ma senza i bit inutili.
Letharion,

0

Per Drupal 8, ti consiglio di leggere questo articolo

libraries.yml

something: 
  version: VERSION
  js: 
    js/something.js: {}
  dependencies: 
    - core/jquery

.modulo

function MODULE_page_attachments(array &$page) {
  $page['#attached']['library'][] = MODULE/something;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.