Stato documento: Alfa
Vedi anche Creazione di un modulo (incompleto), e Creazione di un modulo Drupal (Tutorial) (più esteso).
Qualche volta vediamo piccoli pezzi di codice utile, con il consiglio di metterlo nel nostro modulo custom. Ma come si fa a creare un modulo custom? E che cos'è un modulo custom?
Un modulo custom è un modulo scritto appositamente per un singolo sito. Non si trova su http://drupal.org, e semplicamente qualcosa che è tutto nostro - e quindi anche di nostra responsibilità.
Moduli esterno al core di Drupal vengono inseriti in sites/all/modules
, ma niente ci vieta a mettere un modulo in un sotto indirizzario di questo. Da "Pro Drupal Development", viene suggerito di mettere moduli custom in sites/all/modules/custom
, per tenerlo 'distante' dai moduli scaricati da http://drupal.org.
Come minimo dovremo creare due file, ma prima bisogna 'inventare' un nome per il nostro modulo custom. Il nome del sito può andare bene, ma ricorda che il nome può contenere solo lettere non accentati, e che viene usato come prefisso per tanti funzioni - quindi la brevità aiuta. Se il sito forse http://drupalitalia.org, possiamo usare drupalitalia
o forse di
come nome più breve. Basta che è sufficientemente originale da non fare conflitto con nomi di moduli già esistente.
Metteremo questi due file in un indirizzario sites/all/modules/drupalitalia
, per esempio.
Regola #1 A questo punto in poi dove vedi custom
in questo documento bisogna sostituire il nome che hai scelto - drupalitalia
per esempio.
Il primo file viene letto da Drupal per capire cosa fa il modulo, senza caricare codice, e si chiama custom.info
. Il suo contenuto minimo è molto semplice:
name = "Un nome breve: Specifico per drupalitalia"
description = "Una breve descrizione del modulo: Codice specifico per drupalitalia.org."
project = "custom"
core = 6.x
custom
per il nome del tuo modulo - anche il nome del file!
Il secondo file contiene il codice che aggiungiamo dopo, e si chiama custom.module
. Il suo contenuto minimo è ancora più semplice:
<?php
/**
* @file
* Una breve descrizione del modulo: Codice specifico per drupalitalia.org.
*/
?>
alla fine, non è una distrazione ma il delimitatore di chiusura del linguaggio PHP è stato volutamente omesso.?>
si elimina la possibilità di indesiderati spazi bianchi alla fine dei files che posso causare gli errori di "header already sent", problemi di validazione XHTML/XML, e altri problemi.A questo punto possiamo attivarlo. Nota: il modulo si trova sotto 'Altro'. Per il momento non sta faccendo niente. Ma quanto lo fa bene - e senza errori!
Adesso aggiungiamo un pò di codice. Questi pocchi righe fanno che non si può disattivare il modulo dalla pagina admin/build/modules/list
- una precauzione che trovo utile. In custom.module
, aggiungiamo in fondo:
/**
* Modifica dei form Drupal tramite hook.
* 1. Modificare il form dei moduli per <strong>non</strong> consentire la disattivazione del modulo.
* Docs: http://api.drupal.org/api/function/hook_form_alter/6
*
* @param &$form il form da modificare.
* @param $form_state non usato.
* @param $form_id l'identificatore del form.
*/
function custom_form_alter(&$form, $form_state, $form_id) {
switch ($form_id) {
case 'system_modules': // form della lista dei moduli
// Bloccare la disattivazione
$form['disabled_modules']['#value']['custom'] = true;
$form['status']['#disabled_modules'][] = 'custom';
// Non permette throttling
if (isset($form['throttle']) && isset($form['throttle']['#process'])) {
$form['throttle']['#process'][] = 'custom_throttle_checkbox_disable';
}
return;
}
}
/**
* Funzione di process form 'callback' per disabilitare il check box throttle di questo modulo.
*
* @param $form la struttura del form.
* @param $edit non usato.
* @return la struttura del form modificato.
*/
function custom_throttle_checkbox_disable($form, $edit) {
$form['custom']['#attributes']['disabled'] = 'disabled';
return $form;
}
custom
per il nome del tuo modulo - anche il nome del file!
Ma dobbiamo anche fare sapere a Drupal di questi modifiche, prima che viene eseguito questo nuovo codice (da "Letting Drupal know about the new function"): vai in admin/settings/performance
, in fondo alla pagina clicca 'Eliminare i dati della cache'.
Se adesso torni a admin/build/modules/list
troverai che il nostro modulo custom non può essere disattivato.
Nota: Se vuoi aggiungere altre codice alla funzione custom_form_alter
bisogna aggiungerlo dentro la funzione stesso - non puoi avere due funzioni chiamati custom_form_alter
, pena un bel messaggio in rosso di errore da PHP.
Nota: I file allegati finiscono con .txt
o _.txt
, se voi provarli sul tuo sistema bisogna rimuovere quest'ultimi. I nomi giusti sono drupalitalia.info
e drupalitalia.module
.
Allegato | Dimensione |
---|---|
![]() | 127 byte |
![]() | 1.27 KB |
Stato documento: Alfa
In fondo alla pagina ci sono tre bottoni 'Salva' 'Antiprima' ed 'Elimina'. Quando clicciamo su 'Salva' viene si, salvato il contenuto modificato, ma poi ci troviamo sulla pagina di elenco contenuti, o la pagina del contenuto stesso. Quando clicciamo su 'Antiprima' vediamo (più o meno) come verrà visualizzato la pagina. Ma se abbiamo altri browser aperto (per controllare la visualizzazione) non viene viste le modifiche in antiprima - e se salviamo il contenuto dobbiamo poi cliccare il link per tornare al'editor.
La pagina di edit dei Prodotti in Ubercart però ha una quarta bottone: 'Salva e continua', il che salva il contenuto ma ripresenta la pagina di edit. E' se vogliamo aggiungere questa funzionalità per tutti i tipi di contenuto (o se non interessa installare Ubercart)? Ormai anche se non siamo maestri di PHP abbiamo imparato a creare un modulo custom per conto nostro, quindi possiamo aggiungere questo quarto bottone proprio in quel modulo.
Il hook per modificare i form ha già del codice dentro, e dobbiamo solo aggiungere in quel funzione altro codice per il bottone (nuovo codice in grassetto):
function custom_form_alter(&$form, $form_state, $form_id) {
switch ($form_id) {
case 'system_modules': // form della lista dei moduli
// Bloccare la disattivazione
$form['disabled_modules']['#value']['custom'] = true;
$form['status']['#disabled_modules'][] = 'custom';
// Non permette throttling
if (isset($form['throttle']) && isset($form['throttle']['#process'])) {
$form['throttle']['#process'][] = 'custom_throttle_checkbox_disable';
}
return;
case 'page_node_form':
$form['buttons']['save_continue'] = array(
'#type' => 'submit',
'#value' => t('Save and continue'),
'#weight' => 7,
'#submit' => array('node_form_submit', 'custom_save_continue_submit'),
);
return;
}
}
/**
* Dopo aver salvato il node, fai un redirect alla pagina edit.
*/
function custom_save_continue_submit($form, &$form_state) {
$form_state['redirect'] = 'node/'. $form_state['nid'] .'/edit';
}
custom
per il nome del tuo modulo!
Semplice, no?