Question

I have a multi-site; each site has its own database but they all share the same codebase. I would like to know if there is a way to define hook_menu() paths at specific base URLs.

Being it a multisite, I have created a common module used by all the sites. I wanted something like this in hook_menu().

 if (base_url == 'wmc.en') {
   $items['wmc/contact-us'] = array('hook menu stuffs');   
 }
 if (base_url == 'gmc.es') {
   $items['gmc/contact-us'] = array('hook menu stuffs');   
 }

I tried this type of code, but hook_menu() doesn't seem to recognize base_url or $_SERVER['SERVER_NAME'].

Is it possible to achieve what I am trying to do?

Was it helpful?

Solution

In hook_menu() you can access $base_url (not base_url), if you first define it as global (i.e. putting global $base_url as first line of the function) or you access it as $GLOBALS['base_url'].

Keep in mind that $base_url doesn't just contain the domain name, but its content is similar to 'http://example.com/directory_where_drupal_is_installed/'. If you want the domain name you get it with parse_url($GLOBALS['base_url'], PHP_URL_HOST).

That said, I would not use wmc.en/wmc/contact-us and gmc.es/gmc/contact-us as routes, since the domain name makes already the difference between a route and the other one. I would rather use the domain name to execute different code.

if (parse_url($GLOBALS['base_url'], PHP_URL_HOST) == 'wmc.en') {
  // Show the contact form for this domain.
}
elseif (parse_url($GLOBALS['base_url'], PHP_URL_HOST) == 'gmc.es') {
  // Show the contact form for this domain.
}

OTHER TIPS

If you want to use base url, you should first declare it as a global variable and then use it as $base_url. You should also note that $base_url will include the url scheme (i.e) http or https.

If you have a development or staging environment setup, your base url will probably differ between dev, stg and prod environments. In most of the cases, the production environment will be SSL enabled. So you may have to consider this as well while writing code.

In my opinion, as you have mentioned, you may use a different module and enable it only for the specific site. Or if you deliberately want it to be in a common module, consider using access arguments and define hook_permissions.

Licensed under: CC-BY-SA with attribution
Not affiliated with drupal.stackexchange
scroll top