Aggiunta di JS a un tema Drupal 8 (sostituzione di drupal_add_js)


8

In Drupal 7, posso usare drupal_add_jsall'interno del file template.php di un tema come una theme_preprocess_html(&$vars)funzione:

   drupal_add_js(drupal_get_path('theme', 'mytheme') . '/js/scripts.js',
        array(
          'group' => JS_THEME,
          'preprocess' => TRUE,
          'weight' => '999',
        ));

  $vars['scripts'] = drupal_get_js();

In Drupal 8, ho provato a convertirlo usando attachedil file .theme del mio tema in quanto tale:

  $vars['#attached']['js'] = array(
    array(
      'data' => drupal_get_path('theme', 'mytheme') . '/js/scripts.js',
      'options' => array(
        'group' => JS_THEME,
        'preprocess' => TRUE,
        'every_page' => TRUE,
      ),
    ),
  );

... ma quello non ha funzionato e non ci sono stati errori nel watchdog / console o altro.

Secondo la pagina API D8 per drupal_add_js:

Obsoleto - a partire da Drupal 8.0. Utilizzare invece la chiave #attaccata negli array di rendering.

Non c'erano molte più informazioni che comunque. Sembra che drupal_add_cssutilizzerà anche questo metodo. So che sono ancora i primi giorni per Drupal 8, ma speravo di fare un salto.


1
Solo un'ipotesi - forse dovresti provare l'approccio alla biblioteca? E per favore astenersi dall'usare la frase "non ha funzionato". Non lo odi quando devi indovinare cosa significa? Avvertimenti? Errori? Niente e il file non è incluso?
Mołot,

@ Mołot - non ci sono stati avvisi o errori e ho controllato anche il cane da guardia. Ho anche guardato la console in Chrome e semplicemente nessun errore, quindi tutto ciò che posso segnalare è "non ha funzionato". La segnalazione completa degli errori è attivata e certamente ne ho avuto la mia giusta parte durante il porting di questo tema su Drupal 8. Ad ogni modo, penso che l'approccio della biblioteca sembra essere la strada da percorrere e non la risposta fornita di seguito. Sceglierò alcuni moduli Drupal 8 per vedere se riesco a capirlo.
Danny Englander,

Avresti potuto riferire "non ha funzionato senza errori in ..." - quindi sapremmo che non ce n'erano, e in realtà hai fatto la tua parte di lavoro prima di chiedere. Questo è tutto ciò che volevo da te :) Troppi ragazzi qui chiedono senza nemmeno controllare ...
Mołot,

1
Ok grazie, aggiornato con un riepilogo del problema migliore. :)
Danny Englander,

Risposte:


7

Sembra che tu possa usare hook_preprocess_pagecon allegato come tale:

function MYTHEME_preprocess_page(&$vars, $hook) {
  $path = drupal_get_path('theme', 'MYTHEME');
     // Render the main scripts file.
  $local_js = array(
    '#attached' => array(
      'js' => array(
        $path . '/js/scripts.js' => array(
          'group' => JS_THEME,
          'weight' => 9999),
      ),
    ),
  );
  \Drupal::service('renderer')->renderRoot($local_js);
}

Funziona alla grande ( theme.inc usa questo metodo), nota l'array nidificato extra attorno al peso.


Codice aggiornato per riflettere una versione completamente funzionante, peso e tutto.
Danny Englander,

Esattamente quello di cui avevo bisogno, molto apprezzato !!!
Yassin Tahtah,

4

Il punto chiave nella documentazione è questo bit

Utilizzare invece la chiave #attaccata negli array di rendering .

Enfasi mia.

L' $variablesarray in una funzione theme / preprocess non è un array di rendering, è solo un array che contiene variabili. Per usare #attachedavrai bisogno di qualcosa del genere nella funzione di preelaborazione:

$vars['foo'] = array(
  '#markup' => '<p>Bar</p>',
  '#attached' => array(
    'data' => drupal_get_path('theme', 'mytheme') . '/js/scripts.js',
    'options' => array(
      'group' => JS_THEME,
      'preprocess' => TRUE,
      'every_page' => TRUE,
    ),
  ),
);

E questo nel file modello:

{ foo }

In altre parole, più o meno lo stesso di Drupal 7 (almeno in questo momento).

hook_preprocess_html()tra l'altro non è probabilmente il posto giusto per questo codice; non dimenticare che i file js / css sono effettivamente resi in quel modello, quindi è troppo tardi per aggiungerne altri hook_preprocess_page(), hook_preprocess_node()o equivalenti probabilmente ti daranno risultati più affidabili.

Consulta la pagina sulle best practice di Twig: funzioni di preelaborazione e modelli per ulteriori informazioni sulle variabili di preelaborazione.


1
Questo è corretto: le variabili passate alle funzioni di preelaborazione / processo non sono mai un array di rendering.
kiamlaluno

Con tutto il rispetto, sto semplicemente cercando di trovare un sostituto in Drupal 8 per l'aggiunta di un file js a un tema, non sto cercando di renderizzare una variabile in esso. Anche se lo fossi, sarebbe fatto come {{ foo }}nel mondo di Twig, non c'è più il rendering php / print nei template dei temi, ovvero node.html.twig/page.html.twig
Danny Englander,

1
Sì, il cervello si congela lì, mio ​​male. La risposta è la stessa però. È possibile utilizzare solo #attachednel contesto di un array di rendering; la documentazione è corretta. O è necessario utilizzare il metodo sopra, insieme a questo per preelaborare e pre-renderizzare la variabile o per utilizzare il file .info.yml del tema per includere JS. Queste sono le uniche opzioni che posso dire fino ad ora, senza andare giù per il percorso della biblioteca
Clive

1
Penso che l'approccio sarà qualcosa di simile a questo: drupalcode.org/project/drupal.git/blob/refs/heads/8.x:/core/… - vedi la riga 564 che usa hook_library_infoe che Mołot ha insinuato sopra. Dovrò giocarci un po '. Grazie.
Danny Englander,


2

In questo esempio si sta utilizzando un array di rendering reale e non uno reso nella funzione stessa.

In questo modo altri moduli, temi ecc. Possono modificarlo.

/**
 * Implements hook_page_alter().
 */
function db_jacket_page_alter(&$page) {
  $page['#attached']['js'][] = drupal_get_path('theme', 'db_jacket') . '/js/jquery.image-depth.js';
}

0

Sebbene l'OP riguardi Drupal 8, questo potrebbe essere fatto in modo simile in Drupal 7 senza usare drupal_add_js()per iniziare ad abituarsi a non avere drupal_add_js()intorno:

/**
 * Implements hook_preprocess_page().
 */
function YOURMODULE_preprocess_page(&$variables) {
  $module_path = drupal_get_path('module', 'YOURMODULE');
  $variables['page']['content']['#attached']['js'][$module_path . '/js/YOURMODULE.js'] = array();
}

Le opzioni possono essere definite nell'array vuoto, consultare https://api.drupal.org/api/drupal/includes%21common.inc/function/drupal_add_js/7 .

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.