Modulo custom: caricare css e js solo quando il modulo viene chiamato

13 contenuti / 0 new
Ultimo contenuto
Modulo custom: caricare css e js solo quando il modulo viene chiamato

Sto creando un modulo personalizzato ed ho scritto l'hook_init come segue:

/**
* Implementation of hook_init().
*/
function mymodule_init() {
  $path = drupal_get_path('module', 'mymodule');
  $path = drupal_get_path('module', 'mymodule');
  drupal_add_css($path . '/mymodule.css');
  drupal_add_js($path . '/mymodule.js');
}

quando chiamo modulo attraverso il link: http://miosito.com/drupal613/?q=mymodule si apre la pagina caricata dal modulo. Il problema è che io vorrei che drupal caricasse i file mymodulo.css e mymodulo.js solo quando io chiamo la pagina http://miosito.com/drupal613/?q=mymodule e non per tutte le pagine del sito. E' possibile ottenere questo effetto?

dipende per cosa ti serve, io essendo più pratico di theming che di moduli, lo farei tramite tema.

Se per esempio mi serve solo su un determinato nodo, creo un fil page-node-[node-id].tpl.php e ci metto nell'head due righe di Meta Tag apposite per quella pagina. O se proprio voglio fare le cose in grande creo una funzione in template.php

Ripeto, dipende per che scopo ti serve, se è per puro uso "grafico", probabilmente il mio metodo non è poi così male. :D anche se rustico!

Slice2Theme Servizio per la conversione di Design in markup HTML e/o temi.

WeBrain Solution | Pillsofbits Of Bits

sicuramente la tua soluzione va bene, ma io preferirei farlo con il modulo. in modo che mi basta rimuovere la cartella mymodulo per avere tutto come prima; mi pare una soluzione migliore, poi non so...

bho, ripeto diepende per quale scopo ti serve fare questa cosa.

Slice2Theme Servizio per la conversione di Design in markup HTML e/o temi.

WeBrain Solution | Pillsofbits Of Bits

Se metti quel codice in hook_init, CSS e JS verranno inseriti in tutti i nodi.

Per metterlo solo in un certo nodo, puoi provare a metterlo in una funzione hook_nodeapi (quando op == 'view').

così non funziona...

/**
* Implementation of hook_nodeapi().
*/
function sewt_nodeapi(&$node, $op) {
  $path = drupal_get_path('module', 'sewt');
  if($op == 'view'){
  drupal_add_css($path . '/mymodule.css');
  drupal_add_js($path . '/mymodule.js');
  }
}

Non funziona nel senso che non lo aggiunge o lo fa vedere su tutti?

SpinoWeb wrote:
sicuramente la tua soluzione va bene, ma io preferirei farlo con il modulo. in modo che mi basta rimuovere la cartella mymodulo per avere tutto come prima; mi pare una soluzione migliore, poi non so...

Ma il modulo lo hai creato tu o cosa ?

Comunque nell'hook_init() potresti fare così:

/**
* Implementation of hook_init().
*/
function mymodule_init() {
  if ($_GET['q] == 'mymodule') {
      $path = drupal_get_path('module', 'mymodule');
       $path = drupal_get_path('module', 'mymodule');
       drupal_add_css($path . '/mymodule.css');
       drupal_add_js($path . '/mymodule.js');
    }
}

se il modulo lo hai creato tu, allora avrai un hook_menu dove definisci quale funzione chiamare quando ll'utente richiede la pagina "mymodule", e puoi mettere il tuo codice dentro a quella funzione.

M.

--
Michel 'ZioBudda' Morelli -- [email protected]
Sviluppo applicazioni CMS DRUPAL e web dinamiche -- Corsi Drupal -- Amministrazione Drupal -- Hosting Drupal

@ziobudda: imho pessima soluzione perchè fai la call dell'hook_init ogni volta che viene fatto il botstrap, molto melgio usare l'hook suggerito da pinolo, e IMHO aggiungerei la chiamata direttamente nella funzione che genera miapagina (se è un mio modulo a generarla), o andano a usare il hook_form_alter se la pagina è un form o ancora usando hook_nodeapi() nel caso di un singolo contenuto.

La soluzione dipende molto dal tipo di pagina. eviterei anche la suluzione del theming, per diversi motivi (e di certo non lo farei scrivendo il meta di base, ma almax aggiungendolo alla $variables del preprocess_node).

Ciao
Marco
--
My blog
Working at @agavee

mavimo wrote:
@ziobudda: imho pessima soluzione

Io non ho mai detto che è una buona soluzione. Infatti sotto ho detto

ziobudda wrote:

se il modulo lo hai creato tu, allora avrai un hook_menu dove definisci quale funzione chiamare quando ll'utente richiede la pagina "mymodule", e puoi mettere il tuo codice dentro a quella funzione.

M.

--
Michel 'ZioBudda' Morelli -- [email protected]
Sviluppo applicazioni CMS DRUPAL e web dinamiche -- Corsi Drupal -- Amministrazione Drupal -- Hosting Drupal

ziobudda wrote:

se il modulo lo hai creato tu, allora avrai un hook_menu dove definisci quale funzione chiamare quando ll'utente richiede la pagina "mymodule", e puoi mettere il tuo codice dentro a quella funzione.

Si il modulo l'ho creato io ed infatti ho un hook_menu:

/**
* Implementation of hook_menu().
*/
function mymodulo_menu() {
  $items['mymodulo'] = array(
    // 'title' => 'mymodulo',
    'page callback' => 'mymodulo_page_ui',
    'access arguments' => array('access content'),
    // 'type' => MENU_CALLBACK,
    'file' => 'mymodulo.pages.inc',
  );
  return $items;
}

la funzione mymodulo_page_ui è nel file mymodulo.pages.inc e mi serve semplicemente a stampare un pò di html, infatti ha un
return $output;
dove $output contiene l'html

Non ho capito come modificare la funzione hook_menu per caricare il css e il js solo quando entro nella pagina generata dal modulo

Non lo fai in hook_menu, ma nel callback da esso richiamato: mymodulo_page_ui

Pinolo wrote:
Non lo fai in hook_menu, ma nel callback da esso richiamato: mymodulo_page_ui
ok, perfetto!

grazie mille!