Useful TextMate Snippets for Drupal

Posted by Jeff Beeman on Wed, 01/16/2008 - 01:38

I took a few minutes this evening to whip up some TextMate snippets that I think will be useful for Drupal development. They're nothing fancy, and certainly not as ambitious as Steven Witten's kitchen sink approach, but I think it'll simplify one of the most repetitive tasks I usually find myself in when writing a new module.

These snippets all use TextMate's built-in tab stop handling, which allows you to quickly insert the snippet and then just tab through all the relevant places where you'd need to change something. Give it a try - especially with the .module file snippet.

Initial setup

  1. Open up TextMate
  2. Go to the Bundle Editor (Bundles -> Bundle Editor -> Show Bundle Editor, or ctrl+option+cmd+b)
  3. Add a new bundle and call it "Drupal"
  4. From here out, each snippet can be added by choosing "New Snippet"

The .info file

I called this one "Module info file" and gave it the tab trigger drupmod_info. I haven't figured out how to get this one to actually render via a tab trigger, but it's easy enough to just navigate to the Drupal bundle and choose the snippet.


; \$Id\$
name = "${1:Example module}"
description = "${2:Example module description}"
dependencies = $0

The .module file

This snippet uses TextMate's variable mirroring to let you quickly rename all the hooks in the snippet with the first tab stop. I used the hooks below because most of my modules implement these hooks. Just follow the pattern for naming, etc. to add your preferred hooks.

I called this one "Module general hooks" and assigned it the tab trigger drupmod_m.


// \$Id\$

/**
* Implementation of hook_perm
*/
function ${1:example}_perm() {
return array(
'${2:example permission}',
);
}

/**
* Implementation of hook_menu
*/
function ${1:example}_menu($may_cache) {
$items = array();

if ($may_cache) {
$items[] = array(
'path' => 'admin/settings/${1:example}',
'title' => t('${3:Example}'),
'callback' => 'drupal_get_form',
'callback arguments' => array('${1:example}_admin_form'),
'access' => user_access('administer site configuration'),
);
}

return $items;
}

/**
* Menu callback - Admin settings form.
*/
function ${1:example}_admin_form() {
$form = array();
return system_settings_form($form);
}

/**
* Implementation of hook_form_alter
*/
function ${1:example}_form_alter($form_id, &$form) {
switch ($form_id) {
// Alter node edit form
case $form['type']['#value'] .'_node_form':
break;
}
}

/**
* Implementation of hook_nodeapi
*/
function ${1:example}_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
switch ($op) {
case 'delete':
break;

case 'insert':
break;

case 'load':
break;

case 'submit':
break;

case 'update':
break;

case 'view':
break;
}
}

The .install file

This one is pretty similar to the .module file, but I tried to make sure it handled some common uninstall tasks I usually forget to tackle until I absolutely have to.

I called this one "Module install hooks" and assigned it the tab trigger drupmod_i.


// \$Id\$

/**
* Implementation of hook_install
*/
function ${1:example}_install() {
switch ($GLOBALS['db_type']) {
case 'mysqli':
case 'mysql':
db_query("CREATE TABLE IF NOT EXISTS {${1:example}} (
id int unsigned NOT NULL auto_increment,
field varchar(128) NOT NULL default ''
PRIMARY KEY (id),
) /*!40100 DEFAULT CHARACTER SET utf8 */;");
break;
}
}

/**
* Implementation of hook_uninstall
*/
function ${1:example}_uninstall() {
db_query("DROP TABLE {${1:example}}");
$variables = db_query("SELECT name FROM {variable} WHERE name LIKE '${1:example}%%'");
while ($variable = db_fetch_object($variables)) {
variable_del($variable->name);
}
}