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:

Ciao a tutti,
scusate se mi intrometto in questa discussione ma ho bisogno di aiuto, dovrei riprendere un vecchio sito e riorganizzarlo con drupal 7, ho delle specifiche richieste (è un lavoro di tesi), mi occorre un modulo per interagire con un database esterno ( prima richiesta) e poi un modulo un qualcosa per pagine in php, nel senso io successivamente devo dialogare con il database, interrogarlo ecc
come posso fare, non sono espertissima ho bisogno di linee giuda chiare in italiano
Vi ringrazio