Sviluppatori: documentazione

Questa raccolta di documenti sono rivolti a chi si sviluppa per Drupal.

Argomenti:

Come creare un modulo 'custom' (senza sapere molto di PHP)

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

Ricorda la regola #1! Cambia 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.
*/

Si, si, manca un ?> alla fine, non è una distrazione ma il delimitatore di chiusura del linguaggio PHP è stato volutamente omesso.
Nella coding standard page vengono elencate le tre motivazioni principali:

  • Togliendo il ?> 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.
  • Il delimitatore di chiusura alla fine del file è opzionale.
  • Lo stesso PHP.net rimuove il delimitatore di chiusura dalla fine dei suoi files (esempio: prepend.inc), questa prassi viene identificata come il modo migliore di scrivere codice PHP per Drupal.

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;
}

Ricorda la regola #1! Cambia 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.

AllegatoDimensione
Plain text icon drupalitalia.info_.txt127 byte
Plain text icon drupalitalia.module.txt1.27 KB

Argomenti:

Aggiungere un bottone 'Salva e continua' nella pagina di edit per i contenuti

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;
  }
}

Ed in più, aggingere il codice per gestire il botton (in fondo al file):
/**
* 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';
}

Ricorda la regola #1! Cambia custom per il nome del tuo modulo!

Semplice, no?

Argomenti:

Creazione di un modulo

Introduzione (EN): http://drupal.org/node/292

Maggiori info per i moduli (EN): http://drupal.org/node/231276

Argomenti:

Il meccanismo degli hook

Drupal è un framework per cms che mette a disposizione il meccanismo degli hook per interagire con core e con altri eventuali moduli.

Il meccanismo è basato sul nome delle funzioni dichiarate all'interno del codice del modulo e il nome del modulo stesso.

Ad esempio hook_menu permette di registrare un path e associargli un comportamento/contenuto da restituire nel brower. Per definire l'interazione del vostro modulo, chiamiamolo moduloprova, si dovrà definire la funzione moduloprova_menu.

Drupal utilizza la funzione module_invoke per eseguire uno specifico hook per uno specifico modulo, cioè ad esempio module_invoke('moduloprova','menu') invocherà moduloprova_menu(). Drupal fa un ciclo sulla lista dei moduli attivi per eseguirli tutti.

L'interazione avviene o tramite un valore o struttura restituito (solitamente un array associativo), o tramite la modifica di parametri passati per riferimento (o entrambe). Per le modalità di interazione e i parametri di con i quali vengono chiamati i vari hook, vedere http://api.drupal.org/ e in particolare http://api.drupal.org/api/drupal/includes--module.inc/group/hooks/7 per la lista di hook disponibili.

Naturalmente è possibile sviluppare un modulo che mette a disposizione l'interazione con esso usando lo stesso meccanismo (module_invoke), ne è un esempio complesso ubercart

Argomenti:

Il file *.info

Drupal riconosce la presenza di un modulo dalla posizione della cartella che contiene il codice (ad esempio se si trova in /modules o /sites/all/modules) e dall'esistenza di un file [nomemodulo].info che definisce:

  • il nome del modulo
  • la descrizione
  • il pacchetto
  • la versione
  • la compatibilità con il core
  • le dipendenze
  • l'elenco dei file

esempio, forumcontcheck.info :

name = forumcontcheck
description = Interagisce con forum aggiungendo un controllo sui contenuti
package = Forum Addons
version = "7.x-1.0-alpha4"
core = 7.x
dependencies[] = forum
files[] = forumcontcheck.module
files[] = forumcontcheck.inc.php

alcune informazioni sono opzionali, come dependencies e files (fine normalmente controllata la presenza di un file nomemodulo.module). Il core deve essere specificato: 6.x, 7.x, 8.x, etc.

Argomenti:

Il file *.install

Argomenti:

Il file *.module

Argomenti:

I principali hook

  1. hook_block
  2. hook_menu
  3. hook_perm
  4. hook_theme
  5. hook_nodeapi
  6. hook_form (load, view, insert, update, validate, ...)
  7. hook_form_alter

Argomenti:

Introduzione a jQuery

Argomenti: