Caricamento JavaScript in Drupal 7

19 contenuti / 0 new
Ultimo contenuto
Caricamento JavaScript in Drupal 7

Ciao a tutti,
Ho un problemino con il caricamento di file js.
Ho aggiornato jQuery con il modulo update-jquery, ed ho inserito nel file .info la seguente riga:
scripts[] = js/nav.js

Ho creato la dir js all'interno del mio tema (chmod 755) e ci ho infilato uno script che esegue un semplice "alert" per verificare il funzionamento.
Ciò che è strano che ne body non appare lo script, vi allego il contenuto dell'header:

<head profile="http://www.w3.org/1999/xhtml/vocab">
<meta
content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta content="Drupal 7 (http://drupal.org)" name="Generator">
<title>Welcome</title>
<style media="all" type="text/css">
<style media="all" type="text/css">
<style media="all" type="text/css">
<script src="http://.../drupal/sites/all/modules/jquery_update/replace/jquery/jquery.min.js?v=1.5.2" type="text/javascript">
<script src="http://.../drupal/misc/jquery.once.js?v=1.2" type="text/javascript">
<script src="http://.../drupal/misc/drupal.js?lnyjxv" type="text/javascript">
<script type="text/javascript">
<!--//--><![CDATA[//><!--
jQuery.extend(Drupal.settings, {"basePath":"\/~public\/itineradog.it\/drupal\/","pathPrefix":"","ajaxPageState":{"theme":"itineradog","theme_token":"Y3LzT4YATtomqrPXzWeE
LDxlNTQkjeCMzW7znznFK54","js":{"sites\/all\/modules\/jquery_update\/replace\/jquery\/jquery.min.js":1,"misc\/jquery.once.js":1,"misc\/drupal.
js":1},"css":{"modules\/system\/system.base.css":1,"modules\/system\/system.menus.css":1,"modules\/system\/system.messages.css":1,"mod
ules\/system\/system.theme.css":1,"modules\/comment\/comment.css":1,"modules\/field\/theme\/field.css":1,"modules\/node\/node.css":1,"mo
dules\/search\/search.css":1,"modules\/user\/user.css":1,"sites\/all\/themes\/itineradog\/css\/reset.css":1,"sites\/all\/themes\/itineradog\/css\/lay
out.css":1,"sites\/all\/themes\/itineradog\/css\/style.css":1}}});
//--><!]]>
</script>

Ho dimenticato qualcosa?
Grazie a tutti per l'aiuto

Ciao,
hai ricostrutito la cache dopo aver modificato il file .info?
Passaggio assolutamente necessario!!!
;)

Ciao, grazie, si, è proprio quello, me lo ero scordato!
Grazie comunque ;)

--
G.

Come dicevo questo problema l'ho risolto, ma ora ho anche la necessità di caricare un js per una sola pagina.
ho visto il comando drupal_add_js(); ho provato ad utilizzarlo nel page.tpl.php sopra a tutto (alla fine dei commenti) ma non viene caricato.
Sbaglio qualcosa?

Grazie a tutti

--
G.

Ciao,
non so se da page ti funzionerebbe (in line teorica dovrebbe, comunque). Una via più "pulita" sarebbe quello di inserirlo in template.php. Ad esempio:

<?php
/**
 * Override or insert variables into the node template.
 */
function mytheme_preprocess_node(&$vars) {
 
drupal_add_js('path/to/my_javascript.js');
}
 
?>

in questo modo il javascript viene caricato solo se la pagina è un nodo (leggiti, comunque, le informazioni sulla funzione su drupal api).

P.S.: ricordati di rigenerare la cache anche in questo caso!
;)

Grazie per la dritta, ma non ho capito molto bene.
Non sono molto esperto, anzi... sto facendo il mio progetto (anche a scopo didattico) e mi sono letto un po' di documentazione, quello che sto cercando di creare è un sito con diverse pagine.
Sono partito dal tema "bartik" usando il page.tpl.php e modificandolo un po' , aggiungendo i miei css ed un mio javascript (che sarà usato in tutte le pagine).

Io però ho necessità di creare un sito con pagine... diciamo così... diverse l'una dall'altra e che carichino javascript diversi.

Innanzitutto io vorrei sapere come faccio a creare pagine diverse e collegarle a voci del menù diverse?
E a questo punto come carico i javascript nelle diverse pagine?

Grazie per il vostro supporto

--
G.

giacomop81 wrote:
Grazie per la dritta, ma non ho capito molto bene.
Non sono molto esperto, anzi... sto facendo il mio progetto (anche a scopo didattico) e mi sono letto un po' di documentazione, quello che sto cercando di creare è un sito con diverse pagine.
Sono partito dal tema "bartik" usando il page.tpl.php e modificandolo un po' , aggiungendo i miei css ed un mio javascript (che sarà usato in tutte le pagine).

Io però ho necessità di creare un sito con pagine... diciamo così... diverse l'una dall'altra e che carichino javascript diversi.

Innanzitutto io vorrei sapere come faccio a creare pagine diverse e collegarle a voci del menù diverse?
E a questo punto come carico i javascript nelle diverse pagine?

Grazie per il vostro supporto


Ah, ok...
Allora, parti sempre da una analisi strutturale del tuo sito: che tipo di contenuti dovrà avere? Ad esempio, news, post, prodotto, pagina, ecc... Ogni tipologia di contenuto lo puoi personalizzare come ti serve semplicemente duplicando il file node.tpl.php e rinominandolo in nodo--news.tpl.php, inserendo il machine name del tipo di contenuto (nel nostro caso, se il machine name del contenuto news è news il file diventa appunto node--news.tpl.php). Questo influirà solo i tipi di contenuto news, mentre gli altri saranno sempre gestiti da node.tpl.php (è una gerarchia).
Per i menu basta che li associ nelle impostazione di ogni singolo tipo, se quel dato tipo di contenuto deve avere un qualche menu.

Per la questione javascript, specifica in modo un pò più dettagliato cosa intendi per caricare i javascript nelle diverse pagine.
;)

La struttura ce l'ho, devo fare il "porting" di un sito su piattaforma drupal, quindi so già come deve essere fatto.

il file node.tpl.php in modules/system non l'ho trovato, di solito sta da un altra parte? o intendi il page.tpl.php?

La questione dei javascript è questa: so che aggiungendo il file js all'array scripts[] nel fle .info questo viene aggiunto in automatico a TUTTE le pagine, mentre io (avendo diverse pagine con strutture diverse) vorrei caricare i javascript solo nelle pagine in cui vanno utilizzati.
Per esempio io userò il plugin di jQuery "galleria" per la fotogallery del sito, e vorrei che i javascript vengano caricato solamente nella pagina della fotogallery.

--
G.

Quote:
La struttura ce l'ho, devo fare il "porting" di un sito su piattaforma drupal, quindi so già come deve essere fatto.

il file node.tpl.php in modules/system non l'ho trovato, di solito sta da un altra parte? o intendi il page.tpl.php?

node.tpl.php lo trovi in modules/node, non fa parte di system!

Quote:
La questione dei javascript è questa: so che aggiungendo il file js all'array scripts[] nel fle .info questo viene aggiunto in automatico a TUTTE le pagine, mentre io (avendo diverse pagine con strutture diverse) vorrei caricare i javascript solo nelle pagine in cui vanno utilizzati.
Per esempio io userò il plugin di jQuery "galleria" per la fotogallery del sito, e vorrei che i javascript vengano caricato solamente nella pagina della fotogallery.

Qui puoi avere diverse vie: potresti usare drupal_add_js() direttamente dal template dei nodi (avendo tipologie di contenuti diversi fai un drupal_add_js() all'interno del node--myctype.tpl.php). La seconda via (migliore della prima) è quella di farlo da template.php:
<?php
/**
 * Override or insert variables into the node template.
 */
function mytheme_preprocess_node(&$vars) {
  if(
$vars['node']->type == 'myctype'){
   
drupal_add_js('path/to/my_javascript.js');
  }
}
 
?>

in questo modo, il tuo javascript viene caricato solo se il nodo è di tipo myctype (ovviamente, ti conviene fare uno switch con tutti i tipi di contenuto che hai).
;)

Grazie per i consigli,
Io ho provato ad utilizzare il drupal_add_js all'interno del page.tpl.php per verificarne il funzionamento, ma non è cambiato nulla (ho pulito la cache) e comunque non mi è ancora chiara una cosa, ma il page.tpl.php? è solo la home page? e viene utilizzato se non è presente nessun node--myctype.tpl.php?

Se devo realizzare 3 pagine che hanno struttura diversa e caricano 3 js diversi, devo creare il page.tpl.php e poi un node--myctype1.tpl.php e un node--myctype2.tpl.php ?

grazie a tutti

--
G.

drupal_add_js non lo puoi usare in page.tpl.php, a quel punto l'array dei javascript è già stato costruito e quindi è troppo tardi!
Come dice gioppy lo devi mettere in [...]_preprocess_node o [...]_preprocess_page in template.php

Per la seconda questione: page.tpl.php è il "contenitore" mentre node.tpl.php (e tutti i suoi derivati) contengono l'html della singola unità di contenuto (ossia i nodi, in Drupal), quindi node--myctype1.tpl.php, [...] non non campi la struttura della pagina intera, ma solo la parte relativa al contenuto vero e proprio (nel caso sia un nodo di tipo myctype1). Se vuoi layout diversi per diverse sezioni del sito devi fare page--[...].tpl.php diverse oppure (ed è più semplice) usare il modulo panels che ti fa fare proprio questo: layout diversi per pagine diverse (che però per d7 è un alpha3)

Grazie a tutti per il supporto che mi sate dando, lo apprezzo moltissimo.
Credo che il modo in cui sto sviluppando il tutto non sia il modo più corretto, quindi ora vi chiedo uno sforzo in più :) andiamo sul concreto.

Devo fare il porting di Questo sito web su piattaforma Drupal, "loro" vogliono poter aggiornare i contenuti, aggiungere foto ecc. in completa autonomia.

Fermiamoci alla homepage. Io ho preso il page.tpl.php di Bartik, l'ho un po' modificato, ho aggiunto i miei css e il javascript per gestire il mouseover del menu ecc...

Per i 2 box centrali, ho creato 2 content type, che hanno creato due div.
I 2 div che (guarda caso) si chiamano node-3 e node-4 ed li ho stilati nel css caricato.

Il modo in cui ho agito è giusto? Avrei dovuto separare di più le cose? Se non è giusto, potreste indicarmi per favore, il modo corretto (o migliore secondo voi) di procedere?

Un super grazie per il vostro supporto

--
G.

Ciao,
diciamo che, a mio avviso, non è il modo corretto per procedere.
Partiamo dall'inizio: l'home page presenta un menu principale, un box con del testo "statico", e un'ultima nuews.
Ora, il menu lo puoi gestire tranquillamente con i menu di Drupal. Per il box "statico" la cosa migliore sarebbe utilizzare un semplice blocco: fai una regione nel tuo page.tpl.php che sarà visualizzata solo in home page e all'interno basta che ci posizioni un blocco. Per far si che un blocco si visualizzi solo in home page puoi usare questo codice (tenendo presente che la regione si chiami focus):

<?php
 
if($is_front && $page['focus']){
  print
render($page['focus']);
}
 
?>

L'ultima news, infine, la potresti creare con l'utilizzo delle viste, in modo da automatizzare il tutto e così da creare anche un'archivio news. Ti basta creare un contenuto di tipo news e da views crei una nuova vista che visualizza l'utlimo nodo tipo news come blocco.
;)

P.S.: attenzione ad una cosa molto importante! Ho visto che le voci di menu sono senza testo (ci sono degli span)... questo è abbastanza grave nel senso che Google quando visita il sito non trova dei link per le pagine interne, quindi l'indicizzazione ne potrebbe risentirebbe parecchio...

Avevo il sospetto che non fosse il modo giusto di gestirlo... essendo il mio primo tentativo, da completo ignorante di Drupal e CMS non poteva essere altrimenti :)

Il menu sono riuscito a gestirlo attraverso i CSS come descritto nei precedenti post, inoltre il problea del testo non dovrebbe più essere un problema perchè in drupal il testo el link c'è ma ho usato il "text-indent:-9999px"

Quote:
Per il box "statico" la cosa migliore sarebbe utilizzare un semplice blocco: fai una regione nel tuo page.tpl.php che sarà visualizzata solo in home page e all'interno basta che ci posizioni un blocco.

Ok, creo una nuova regione per esempio "focus" nel file info con:
regions[focus] = Focus

Poi, nel page.tpl.php nel "posto giusto" aggiungo

<?php if($is_front && $page['focus']): ?>
<?php print render($page['focus']); ?>
<?php endif; ?>

Da qualche parte nell'area admin (devo ancora vedere dove) setto il contenuto di Focus

--
G.

Ci sono riuscito, grazie.
Altre 3 domande i rapida successione:
1) In template.php ho aggiunto:

function itineradog_preprocess_page(&$vars) {
drupal_add_js('../js/home.js');
}

Il path è relativo al template.php e al page.tpl.php perchè sono entrambi nella sottodir "template" del tema.
Ovviamnete non funziona, ma non capisco il perchè.

2) Sempre riguardo a quanto sopra, capisco che in quel modo viene aggiunto il javascript a tutte lepagine, come seleziono la pagina? (ho visto sopra come si seleziona il type)

3) Sto per procedere ad una seconda pagina, devo creare un page--[...].tpl.php per ogni sezione, nel mio caso ad esempio potrebbe esserci un page--gallery-tpl.php, la mia domanda è: come associo ad ogni voce del menu una pagina?

Ancora una volta, grazie a tutti per il vostro supporto.

--
G.

Quote:
Ci sono riuscito, grazie.
Altre 3 domande i rapida successione:
1) In template.php ho aggiunto:
function itineradog_preprocess_page(&$vars) {
drupal_add_js('../js/home.js');
}

Il path è relativo al template.php e al page.tpl.php perchè sono entrambi nella sottodir "template" del tema.
Ovviamnete non funziona, ma non capisco il perchè.

Devi usare un funziona che ti restituisce il path corretto in qualsiasi pagina che ti trovi. Il tuo codice diventa:

<?php
drupal_add_js
(base_path().path_to_theme().'/js/home.js');
 
?>

base_path() è una funzione che ti ritorna il path di insstallazione di drupal e path_to_theme() è una funziona che ti restituisce il path relativo al template attualmente attivo.

Quote:
2) Sempre riguardo a quanto sopra, capisco che in quel modo viene aggiunto il javascript a tutte lepagine, come seleziono la pagina? (ho visto sopra come si seleziona il type)

Hai usato il _preprocess_page, quidni significa che viene aggiungo al momento in cui viene costruito il page.tpl.php (quindi, con la struttura generale). Se vuoi applicarlo solo sui nodi devi usare il _preprocess_node.

Quote:
3) Sto per procedere ad una seconda pagina, devo creare un page--[...].tpl.php per ogni sezione, nel mio caso ad esempio potrebbe esserci un page--gallery-tpl.php, la mia domanda è: come associo ad ogni voce del menu una pagina?

Ancora una volta, grazie a tutti per il vostro supporto.


Devi farlo associando al tipo di contenuto un menu. Le trovi nelle impostazioni dei tipi di contenuto!
;)

gioppy wrote:
Quote:
Ci sono riuscito, grazie.
Altre 3 domande i rapida successione:
1) In template.php ho aggiunto:
function itineradog_preprocess_page(&$vars) {
drupal_add_js('../js/home.js');
}

Il path è relativo al template.php e al page.tpl.php perchè sono entrambi nella sottodir "template" del tema.
Ovviamnete non funziona, ma non capisco il perchè.

Devi usare un funziona che ti restituisce il path corretto in qualsiasi pagina che ti trovi. Il tuo codice diventa:

<?php
drupal_add_js
(base_path().path_to_theme().'/js/home.js');
 
?>

base_path() è una funzione che ti ritorna il path di insstallazione di drupal e path_to_theme() è una funziona che ti restituisce il path relativo al template attualmente attivo.

Quote:
2) Sempre riguardo a quanto sopra, capisco che in quel modo viene aggiunto il javascript a tutte lepagine, come seleziono la pagina? (ho visto sopra come si seleziona il type)

Hai usato il _preprocess_page, quidni significa che viene aggiungo al momento in cui viene costruito il page.tpl.php (quindi, con la struttura generale). Se vuoi applicarlo solo sui nodi devi usare il _preprocess_node.

Per il caricamento ho trovato il problema.
Io volevo inserire tutti i php dentro la dir templates ma a quanto pare a drupal da fastidio che il file templates.php si li dentro perchè provando a spostarlo fuori da quella dir il caricamente del js funziona, a voi risulta?

Non capisco ancora come devo utilizzare il caricamento "selettivo" dei js, se utilizzo il _preprocess_node, come seleziono il nodo "front" page?

--
G.

giacomop81 wrote:

Per il caricamento ho trovato il problema.
Io volevo inserire tutti i php dentro la dir templates ma a quanto pare a drupal da fastidio che il file templates.php si li dentro perchè provando a spostarlo fuori da quella dir il caricamente del js funziona, a voi risulta?

Il file template.php deve risiedere all'interno della cartella del tuo template. Vedi questa pagina per maggiori informazioni: http://drupal.org/node/171194.

Quote:
Non capisco ancora come devo utilizzare il caricamento "selettivo" dei js, se utilizzo il _preprocess_node, come seleziono il nodo "front" page?

Il nodo front non esiste... a meno che non cambi la front page con un nodo, ma nel tuo caso non credo sia la via correttada seguire.
;)

Grazie per il link, l'obiezione del nodo front è accolta, mi sono confuso ;)

Scusate ma sono veramente in crisi e vorrei fare un passo indietro.
Vorrei continuare la discussione qui: http://www.drupalitalia.org/node/15356

Grazie a tutti per la pazienza e il suporto.

--
G.