Skip to main content

Drupal: Custom module installation - hook_install() confusion

In Drupal, every module uses at least two files.
  • The .info file
  • The .module file
If you are developing a custom module, you might also need a .install file, if you want to create or alter tables in database. Most modules use just one table so it will be difficult to understand what is wrong, in case you do what I did. Drupal has its own functions for database management. In no way mysql or pgsql functions must be used in a module. Drupal functions are everything you might need. Even if you find a function you need that only exists in mysql, try to create a port using drupal functions and php. It's the Drupal way and it is something you might benefit from later. A .install file uses at least three(3) functions.
  1. hook_schema()
  2. hook_install
  3. hook_uninstall
It's absolutely certain that creating the schema array won't be something difficult. Drupal core modules are more than great examples for this. In contrast to the words above, hook_install() and hook_uninstall can be sometimes confusing. Let's take a case where you need two tables and your module is named example. The first table will be named example1 and the other example2. If you needed to create a mysql table you would possibly write:
$sql = "CREATE TABLE example1(id INT,...,...)";
mysql_query($sql) or die(mysql_error());
$sql = "CREATE TABLE example2(id INT,...,...)";
mysql_query($sql) or die(mysql_error());
I mean that since you have two tables to create, you will, most possibly, use two queries. I suppose the same goes for pgsql too. But not in Drupal. If you try to call drupal_install_schema('example1') or drupal_install_schema('example2') in hook_install all you will get(if you are lucky) is an error and it won't be very easy to discover what's really going on. The only thing sure is that no tables will be created in database. No! No need to start checking backward your changes to the .install file step by step! The solution is simple. drupal_install_schema() accepts as argument the name of the module and not the name we may want each table to have. To conclude:
CORRECTFALSE
/*
 * Implements hook_install()
 */
function example_install(){
  drupal_install_schema('example');
}
/*
 * Implements hook_install()
 */
function example_install(){
  drupal_install_schema('example1');
  drupal_install_schema('example2');
}

Comments

Popular posts from this blog

Drupal: Status report problem: HTTP request status fails

Some of you may have encountered this problem in some cases. In "Status Report" page, accidentally appears the error below:

HTTP request status   FailsYour system or network configuration does not allow Drupal to access web pages, resulting in reduced functionality. This could be due to your webserver configuration or PHP settings, and should be resolved in order to download information about available updates, fetch aggregator feeds, sign in via OpenID, or use other network-dependent services.
What I did, was to recheck that my webserver had access to internet. Of course it had! The problem exists mostly when there is no information to resolve the domain name used with the local ip address of the webserver. This means that an error occurs in the entries of the DNS server.

In cases where DNS server is not existant(ex. local testing environment) all you have to do is inform the /etc/hosts file. For example if you use the domain http://www.example.local/ and your local ip addr…

Drupal: Allow registrations through Invite or Referral modules only

The Invite module provides invitations from existing users to their contacts. The Referral module, in contrary, creates a special URL for each existing user, which can be found in each user's profile, and allows new user registration. Even though, these two modules seem to provide the same functionality, they don't (and they shouldn't). Invite module, provides a mechanism for a site administrator to limit new registrations to "Invitations only". Referral module doesn't provide any of this functionality. Some users have requested the Invite module and Referral module to join in one module. Until now, there isn't anything to that direction. Wouldn't it be great though if there was a solution to limit drupal registration to referral or invitation only? Copy the functions below to a refinvite.module file in your sites→all→modules→refinvite folder and enable the module. Then go to http://<your-address-here>/admin/user/settings and enable the new …

Override the default Opigno LMS navigation menu

I recently used Opigno LMS for a client's project. It's actually a LMS distribution of Drupal. It supports WebEx meetings, Lessons, even PDF Certificates after you complete a Course. In my case though I needed Lessons but no PDF Certificates. Disabling the proper apps/modules wasn't anything out of the ordinary Drupal procedure. What was lacking though was a way to override the main menu to not display the My Achievements item.My Achievements is enabled as long as the Opigno Quiz App (@see Lessons above) is enabled and no hook exists to override this functionality. To disable it I had to create a custom theme using the Platon theme as a base (Platon is the default theme of the Opigno LMS) and copy 3 functions of Platon's template.php file to my theme's template.php with the proper modifications to get what I wanted.See the code below...