Distributing modules with install scripts
So you've created the next great Drupal module that change the world, it works, and you're all set to go. But then you consider what it takes to get the module running, and realize it's nontrivial for an ordinary user to get things up and running. Most of the contrib modules that you can pull from Drupal.org don't have this problem; normally one plugs them in, enables them, and away you go (with the occasional exeption of a module which needs external code added by hand due to license restrictions).
I've run into this problem a couple of times, and yesterday I figured out how to set things up for installation. Modules are allowed to have modulename.install scripts which export implementations of hook_install() and hook_uninstall(), which are invoked on a module being installed for the first time, and being uninstalled.
In my case, I want to enable a new CCK type upon my module being installed. This means that the module requires both the Content (CCK) module and Content Copy (which is distributed as part of CCK). To make a note of this, I added both modules to my dependency list in my modulename.info.
dependencies = content content_copy
Now that we have the dependencies being enforced by the system, let's fill out our install hook, shall we? In this case, we are going to import a CCK type that I had previously created upon module installation. I grabbed the code for doing this import from Snipplr.
Here's the contents of my modulename.install file:
/**
* Implementation of hook_install().
*/
function modulename_install() {
include_once('./' . drupal_get_path('module', 'node') . '/content_types.inc');
include_once('./' . drupal_get_path('module', 'content') . '/content_admin.inc');
$cck_definition_file = './' . drupal_get_path('module', 'modulename') . '/ccktype_export.txt';
watchdog('modulename', "loading CCK type from $cck_definition_file");
$values = array();
$values['type_name'] = '';
$values['macro'] = file_get_contents($cck_definition_file);
drupal_execute("content_copy_import_form", $values);
}
My uninstall hook is empty for the moment, but I would imagine I should remove or disable my custom CCK type on uninstall.
Also, note that disabling a module does not uninstall it (nor run the uninstall hook). To uninstall a module you disable it, then go to the 'Uninstall' tab on the page and from there select the module for deletion. It turns out that even then, the module is not completely cleaned out from the system. To completely remove the module (and, it turns out, to get the install hook to fire on module enable), you have to go into the database and remove the module reference from the system table. I haven't had the chance yet to see if removing the line from the system table is an action commonly taken by modules in their uninstall hooks.
Interesting Post about modules
I too would be interested to know, if only for best practice, whether a module being uninstalled also removes it from the db. Tell me what you find. I would imagine you wouldn't want to remove the reference in db first or ugly errors in the modules page would start making you feel yucky.
Happy New Year!!!
:)
Hey Cal, I need to update this post, I've learned a few more things since writing it. The module is not completely removed from the database unless the developer specifically removes all references to the module in the uninstall() hook. I haven't been able to get a good gauge on the established best practices for what should be removed in the uninstall hook yet. Note that if you're too ambitious with what you remove, you may end up not just orphaning data, but removing it completely from the database (for example, on removing your Widget module, deleting all nodes of type 'widget'.
Also, modules are always disabled before being removed, which should get rid of the yucky warnings-on-removal issues.
Cool
NIce thing
ok
china cafe houston amoco merger body image journal big wet asses 10 rapidshare grow an apple tree credit card with 0 apr on balance transfers plus size modeling agencies in new york
legal credit report valais ch american rag fashion island display picture frames cheap stingy deals eastman dental clinic rochester design bath 46 hardware
waynes world monroe mi 48161 what are the lyrics to glamorous by fergie outcall escorts cartoon drawing easy bake oven cake recipes commercial property for lease
software sdlc city of sports kiss my ass bitch inventory billing good food guide decoro leather sofa batch resize images free
free interior design program christian music artists commercial real estate management modern bathroom vanities citi bank credit card india robert redford and jennifer lopez movie downloading dvds
white house address tennessee football camps new car buying incentives beach girls get my free credit report fashion designer career quick silver clothing
ohio newspaper new car sticker prices first usa bank credit card firm design kiss my ass com diet foods list juniors designer clothes
cherry creek denver music together total body image credit report 46 credit score photo plus expo new york elbow bone fly poles
song lyrics for all because of you metal guitar tabs metal refinishing evanescence win98 nic
Post new comment