Thursday, October 13, 2011

Writing .install files (Drupal 6.x)

 Writing .install files (Drupal 6.x):

A .install file is run the first time a module is enabled, and is used to run setup procedures as required by the module. The most common task is creating database tables and fields. The .install file does not have any special syntax. It is merely a PHP file with a different extension.
.install files are also used to perform updates when a new version of a module needs it.

Instructions

Install instructions are enclosed in a _install() function. This hook will be called when the module is first enabled. Any number of functions can reside here, but the most typical use is to create the necessary tables for your module.
As of Drupal 6.x the database tables are created using the Schema API .
The Schema API allows modules to declare their database tables in a structured array (similar to the Form API) and provides API functions for creating, dropping, and changing tables, columns, keys, and indexes.

A sample schema data structure (taken from the Schema Api Documentation)

As an example, here is an excerpt of the schema definition for Drupal's 'node' table:

<?php
$schema
['node'] = array(
   
'description' => t('The base table for nodes.'),
   
'fields' => array(
     
'nid' => array(
       
'description' => t('The primary identifier for a node.'),
       
'type' => 'serial',
       
'unsigned' => TRUE,
       
'not null' => TRUE),
     
'vid' => array(
       
'description' => t('The current {node_revisions}.vid version identifier.'),
       
'type' => 'int',
       
'unsigned' => TRUE,
       
'not null' => TRUE,
       
'default' => 0),
     
'type' => array(
       
'description' => t('The {node_type} of this node.'),
       
'type' => 'varchar',
       
'length' => 32,
       
'not null' => TRUE,
       
'default' => ''),
     
'title' => array(
       
'description' => t('The title of this node, always treated a non-markup plain text.'),
       
'type' => 'varchar',
       
'length' => 255,
       
'not null' => TRUE,
       
'default' => ''),
      ),
   
'indexes' => array(
     
'node_changed'        => array('changed'),
     
'node_created'        => array('created'),
      ),
   
'unique keys' => array(
     
'nid_vid' => array('nid', 'vid'),
     
'vid'     => array('vid')
      ),
   
'primary key' => array('nid'),
    );
?>
 
In this excerpt, the table 'node' has four fields (table columns) named 'nid', 'vid', 'type', and 'title'. Each field specifies its type ('serial', 'int', or 'varchar' in this example) and some additional optional parameters, including a description.
The table's primary key is the single field 'nid'. There are two unique keys: first named 'vid' on the field 'vid' and second called 'nid_vid' on fields 'nid' and 'vid'. Two indexes, one named 'node_changed' on field 'changed' and one named 'node_created' on the field 'created'.

Creating tables: hook_schema and .install files

For the Schema API to manage a module's tables, the module must have a .install file that implements hook_schema() (note: in a pre-release version, hook_schema() was in a .schema file but that is no longer used.) For example, mymodule's mymodule.install file might contain:

<?phpfunction mymodule_schema() {
 
$schema['mytable1'] = array(
    
// specification for mytable1
 
);
 
$schema['mytable2'] = array(
    
// specification for mytable2
 
);
  return
$schema;
}

function
mymodule_install() {
 
// Create my tables.
 
drupal_install_schema('mymodule');
}

function
mymodule_uninstall() {
 
// Drop my tables.
 
drupal_uninstall_schema('mymodule');
}
?>
 
Updating your schema for new versions works just as it has since Drupal 4.7, using a hook_update_n() function. Suppose you add a new column called 'newcol' to mytable1. First, be sure to update your schema structure in mymodule_schema() so that newly created tables get the new column. Then, add an update function to mymodule.install:

<?phpfunction mymodule_update_1() {
 
$ret = array();
 
db_add_field($ret, 'mytable1', 'newcol', array('type' => 'int'));
  return
$ret;?>
 
There is also a module available called as Schema Module which provides additional Schema-related functionality not provided by the core Schema API that is useful for module developers. Currently, this includes:
  • Schema documentation: hyperlinked display of the schema's embedded documentation explaining what each table and field is for.
  • Schema structure generation: the module examines the live database and creates Schema API data structures for all tables that match the live database.
  • Schema comparison: the module compares the live database structure with the schema structure declared by all enabled modules, reporting on any missing or incorrect tables.

No comments:

Post a Comment