You are here

front_page.module in Front Page 5

File

front_page.module
View source
<?php

/** 
 *  
 * This module allows the site admin to set advanced front page
 * settings.
 * 
 * This version works with Drupal 5.0 and will not work with earlier versions of Drupal
 *
 * This module was developed by Dublin Drupaller and various members of the drupal community
 * 
 * If you have any ideas/patches or requests, please post them on the drupal.org
 * site or email us at gus(at)modernmediamuse.com
 *
 * Updated September 18th with a front page by role type option by Dublin Drupaller
 *
 *   
 */

/** 
 * Implementation of hook_help(). 
 * 
 */
function front_page_help($section) {
  switch ($section) {
    case 'admin/modules#description':

      // This description is shown in the listing at admin/modules.
      return t('Allows you to setup custom front pages for your site.');
    case 'admin/settings/front':
      $roles = "";
      $roles = user_roles();
      if (count($roles) >= 3) {
        krsort($roles);
        $special_note .= "<fieldset><legend>front page by role usage</legend><p><strong>Note:</strong>When using the front pages by role option, please note that if a user has multiple roles the first role match will determine which front page they see. Here is the order that the roles will be checked (from left to right).</p><p>";
        foreach ($roles as $role_id => $role_name) {
          $special_note .= "<strong>" . $role_id . "</strong> " . $role_name . " |  ";
        }
        $special_note .= '</fieldset>';
      }
      return t('<p>Setup custom front pages for your site. Click on the option to expand the form and customise your settings.</p><P><em>Anonymous User</em> = visitor not logged in  | <em>Authenticated User</em> = visitor who is logged in</p>!special_note</p>', array(
        '!special_note' => $special_note,
      ));
  }
}

/** 
 * this function sets the necessary paths etc. so drupal
 * knows where to find the front_page
 */
function front_page_menu($may_cache) {
  $items = array();
  if ($may_cache) {
    $items[] = array(
      'path' => 'admin/settings/front',
      'title' => t('advanced front page settings'),
      'description' => t('Specify a unique layout or splash page based on role type - override your HOME and breadcrumb links - display a custom mission style notice for users who haven\'t visited in a while - disable site and display a \'temporarily offline\' message.'),
      'callback' => 'drupal_get_form',
      'callback arguments' => 'front_page_admin',
      'access' => user_access('administer menu'),
    );
    $items[] = array(
      'path' => 'front_page',
      'title' => t(''),
      'callback' => 'front_page',
      'access' => TRUE,
      'type' => MENU_SUGGESTED_ITEM,
    );
    $items[] = array(
      'path' => 'admin/settings/front/uninstall',
      'description' => t('This will uninstall the front page module.'),
      'callback' => 'uninstall_front_page',
      'type' => MENU_CALLBACK,
      'access' => user_access('administer menu'),
    );
  }
  return $items;
}

/** 
 * this function sets up the admin/build/front_page settings page
 * 
 */
function front_page_admin() {

  // Load any existing settings and build the by redirect by role form
  $form['byrole'] = array(
    '#type' => 'fieldset',
    '#title' => t('Home pages'),
    '#description' => t('Designate a home page for each role. "Splash" pages will be used only when users are connecting from external sites. Spash pages must be in the form "node/x" where x is the id of a node, e.g., "node/21" (without the quotes). Only the body of the node will be displayed. Home pages are displayed when users follow internal home links, or for external links where there is no splash page designated, and may point to any page on the site.'),
    '#theme' => 'front_page_roles',
    '#collapsible' => TRUE,
    '#tree' => TRUE,
  );

  // build the form for roles
  $roles = user_roles();
  foreach (element_children($roles) as $role) {
    $rolename = $roles[$role];
    $form[$role] = array(
      '#type' => 'fieldset',
      '#collapsible' => TRUE,
      '#collapsed' => TRUE,
      '#title' => t('Front Page for %rolename', array(
        '%rolename' => $rolename,
      )),
    );
    $form[$role]['front_' . $role . '_text'] = array(
      '#type' => 'textarea',
      '#title' => t('Body'),
      '#default_value' => variable_get('front_' . $role . '_text', ''),
      '#cols' => 60,
      '#rows' => 20,
      '#description' => t('Paste your HTML or TEXT here for visitors to your site who are already logged in. <br><br>You can paste in the full HTML code for a complete page and include a different style sheet in the HEAD of the document if you want a completely different layout and style to the rest of your site.'),
    );
    if ($role == 2) {
      $form[$role]['front_' . $role . '_type'] = array(
        '#type' => 'select',
        '#title' => t('Select type'),
        '#default_value' => variable_get('front_' . $role . '_type', 'themed'),
        '#options' => array(
          'themed' => t('themed'),
          'full' => t('full'),
          'redirect' => t('redirect'),
          'same' => t('same'),
        ),
        '#description' => t('<P><strong>THEMED</strong> means your default layout, theme and stylesheet will be loaded with your custom front_page. <br><strong>FULL</strong> allows you to have a completely different layout, style sheet etc.<br><strong>REDIRECT</strong> will automatically redirect visitors already logged in to a specific page specified in the REDIRECT TO box.<br><strong>SAME</strong> will display the same content as for Anonymous (not logged in) users.</p>'),
      );
    }
    else {
      $form[$role]['front_' . $role . '_type'] = array(
        '#type' => 'select',
        '#title' => t('Select type'),
        '#default_value' => variable_get('front_' . $role . '_type', 'themed'),
        '#options' => array(
          'themed' => t('themed'),
          'full' => t('full'),
          'redirect' => t('redirect'),
        ),
        '#description' => t('<P><strong>THEMED</strong> means your default layout, theme and stylesheet will be loaded with your custom front_page. <br><strong>FULL</strong> allows you to have a completely different layout, style sheet etc.<br><strong>REDIRECT</strong> will automatically redirect visitors already logged in to a specific page specified in the REDIRECT TO box.</p>'),
      );
    }
    $form[$role]['front_' . $role . '_redirect'] = array(
      '#type' => 'textfield',
      '#title' => t('Redirect to'),
      '#default_value' => variable_get('front_' . $role . '_redirect', 'node'),
      '#cols' => 20,
      '#rows' => 1,
      '#description' => t('If you have selected <strong>REDIRECT</strong> you need to specify where the user should be pointed to.  If you are not using clean URLs, specify the part after "?q=".  If unsure, specify "node".'),
    );
    $form[$role]['front_' . $role . '_php'] = array(
      '#type' => 'checkbox',
      '#title' => t('Allow embedded PHP code in front page for authenticated users'),
      '#return_value' => 1,
      '#default_value' => variable_get('front_' . $role . '_php', 0),
      '#description' => t('If this option is enabled, the body text can have embedded &lt;?php...?&gt; tags with PHP code inside. Click on the special Handbook pages for tips on <a href="http://drupal.org/node/23220">Using PHP snippets in your front_page</a>.'),
    );
  }
  $form['front_offline'] = array(
    '#type' => 'fieldset',
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
    '#title' => t('Custom "Temporarily Offline" message and disable site for all except admins'),
  );
  $form['front_offline']['site_offline'] = array(
    '#type' => 'radios',
    '#title' => t('Site maintenance'),
    '#default_value' => variable_get('site_offline', 0),
    '#options' => array(
      t('Online'),
      t('Off-line'),
    ),
    '#description' => t('When set to "Online", all visitors will be able to browse your site normally. When set to "Off-line", only users with the "administer site configuration" permission will be able to access your site to perform maintenance; all other visitors will see the site off-line message configured below. Authorized users can log in during "Off-line" mode directly via the <a href="@user-login">user login</a> page.', array(
      '@user-login' => url('user'),
    )),
  );
  $form['front_offline']['site_offline_message'] = array(
    '#type' => 'textarea',
    '#title' => t('Site off-line message'),
    '#default_value' => variable_get('site_offline_message', t('@site is currently under maintenance. We should be back shortly. Thank you for your patience.', array(
      '@site' => variable_get('site_name', t('This Drupal site')),
    ))),
    '#description' => t('Message to show visitors when the site is in off-line mode.'),
  );
  $form['special_notice'] = array(
    '#type' => 'fieldset',
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
    '#title' => t('Custom mission for Authenticated Users who haven\'t visited the site for a set period'),
  );
  $form['special_notice']['special_notice_time'] = array(
    '#type' => 'select',
    '#title' => t('Been away for'),
    '#default_value' => variable_get('special_notice_time', ''),
    '#options' => array(
      'one day' => t('one day'),
      'one week' => t('one week'),
      'one month' => t('one month'),
      'three months' => t('three months'),
      'six months' => t('six months'),
      'one year' => t('one year'),
    ),
    '#description' => t('<p>The length of time to check for when users see the special notice which will be displayed as a <em>mission</em> style notice on the front page.<p> '),
  );
  $form['special_notice']['special_notice_text'] = array(
    '#type' => 'textarea',
    '#title' => t('Body'),
    '#default_value' => variable_get('special_notice_text', ''),
    '#cols' => 60,
    '#rows' => 10,
    '#description' => t('Paste your HTML or TEXT here. It will be displayed as a <em>mission</em> style notice on the front page.'),
  );
  $form['override'] = array(
    '#type' => 'fieldset',
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
    '#title' => t('Override your HOME breadcrumb links'),
  );
  $form['override']['front_page_breadcrumb'] = array(
    '#type' => 'checkbox',
    '#title' => t('Redirect your site HOME links'),
    '#return_value' => 1,
    '#default_value' => variable_get('front_page_breadcrumb', 0),
    '#description' => t('Check this box if you want to redirect users who click on any HOME links (including the HOME breadcrumb link). Useful if you have a splash page you don\'t want users brought back to when they click on HOME links from within your site.'),
  );
  $form['override']['front_page_breadcrumb_redirect'] = array(
    '#type' => 'textfield',
    '#title' => t('Redirect your site HOME links to'),
    '#default_value' => variable_get('front_page_breadcrumb_redirect', ''),
    '#cols' => 20,
    '#rows' => 1,
    '#description' => t('Specify where the user should be redirected to. An example would be <em>node/12</em>. Leave blank when you\'re not using HOME redirect.'),
    '#field_prefix' => url(NULL, NULL, NULL, TRUE) . (variable_get('clean_url', 0) ? '' : '?q='),
  );
  $form['site'] = array(
    '#type' => 'fieldset',
    '#collapsible' => TRUE,
    '#collapsed' => FALSE,
    '#title' => t('Activate your front_page settings'),
  );
  $form['site']['site_frontpage'] = array(
    '#type' => 'textfield',
    '#title' => t('Default front page'),
    '#default_value' => variable_get('site_frontpage', 'node'),
    '#size' => 40,
    '#description' => t('Change this setting to <em>front_page</em> to activate your front page settings.'),
    '#field_prefix' => url(NULL, NULL, NULL, TRUE) . (variable_get('clean_url', 0) ? '' : '?q='),
  );
  $form['uninstall_front_page'] = array(
    '#type' => 'fieldset',
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
    '#title' => t('Deactivate and uninstall the Front Page module'),
  );
  $form['uninstall_front_page']['#description'] = t('<p>Follow the steps below to deactivate and remove the front_page.module from your Drupal installation.</p><p><STRONG>STEP 1: </STRONG>!remove', array(
    '!remove' => '<a href ="' . base_path() . 'admin/settings/front/uninstall" title="Click to remove all front page settings from your database">' . t('Remove all front_page settings from the database') . '</a></p><P><small>PLEASE NOTE: REMOVING THE FRONT PAGE SETTINGS FROM YOUR DATABASE CANNOT BE UNDONE<br>YOUR DEFAULT SITE FRONT PAGE WILL REVERT BACK TO THE SYSTEM DEFAULT (NODE)</small></p><P><STRONG>STEP 2:</strong> Once you have removed the front page settings from your database, you may safely delete the <strong>front_page.module</strong> and <strong>front_page.info</strong> files from your Drupal folder.</p>',
  ));
  return system_settings_form($form);
}

/** 
 * this function uninstalls the front page module 
 *
 */
function uninstall_front_page() {
  $roles = "";
  $roles = user_roles();
  foreach (element_children($roles) as $role) {
    $rolename = $roles[$role];
    variable_del('front_' . $role . '_text');

    // text settings
    variable_del('front_' . $role . '_type');

    // type
    variable_del('front_' . $role . '_redirect');

    //redirect
    variable_del('front_' . $role . '_php');

    // php filter
  }
  variable_del('front_page_breadcrumb', '');

  // home breadcrumb override switch
  variable_del('front_page_breadcrumb_redirect', '');

  // home override redirect
  variable_del('special_notice_time', '');

  // special notice time
  variable_del('special_notice_text', '');

  // special notice text

  //reset some important site variables
  variable_set('site_frontpage', 'node');

  //reset the default front page for the site back to node
  variable_set('uninstall_front_setting', '0');
  drupal_set_message(t('All front page settings have been removed from your database. You may now disable the module below and then delete the front page files from your server.'));
  $module = 'front_page';
  $status = '0';
  module_disable($module);
  db_query("UPDATE {system} SET status = 0 WHERE name = '%s'", $module);
  drupal_set_installed_schema_version($module, SCHEMA_UNINSTALLED);
  drupal_goto('admin/settings/modules');
}
function front_page() {

  /* Set a default value for landing zone if no front_page variables are filled. If the module is turned on
  *  but empty in certain areas then a redirection loop will occur. This default prevents this
  */
  $output = 'node';

  /* Set the time to check against the last access of the user by the variable set in settings.*/
  switch (variable_get('front_special_notice_time', '')) {
    case 'one day':
      $check_time = time() - 24 * 60 * 60;
      break;
    case 'one week':
      $check_time = time() - 7 * 24 * 60 * 60;
      break;
    case 'one month':
      $check_time = time() - 30 * 24 * 60 * 60;
      break;
    case 'three months':
      $check_time = time() - 90 * 24 * 60 * 60;
      break;
    case 'six months':
      $check_time = time() - 180 * 24 * 60 * 60;
      break;
    case 'one year':
      $check_time = time() - 360 * 24 * 60 * 60;
      break;
  }

  //this checks to see if you are overriding HOME links on the site
  if (variable_get('front_page_breadcrumb', 0)) {

    // This checks to see if the referer is an internal HOME link or not.
    $newhome = variable_get('front_page_breadcrumb_redirect', 'node');
    $ref = $_SERVER["HTTP_REFERER"];
    global $user, $base_url;
    $parsed_url = parse_url($base_url);
    $domain = $parsed_url['host'];
    if (stristr($ref, $domain)) {
      drupal_goto($path = $newhome, $query = NULL, $fragment = NULL);
    }
  }

  // the following is the code that loads the front_page settings
  global $user;

  /*
   * show this if the user is not logged in or if the authenticated user is to get the same output as
   * anonymous users
   */
  $authenticated_user_text_setting = variable_get("front_2_text", "");
  if (!$user->uid || variable_get("front_2_type", "same") == "same" || empty($authenticated_user_text_setting)) {
    $output = variable_get("front_1_text", "drupal");

    /* if PHP code execution is allowed then use eval */
    if (variable_get('front_1_php', 0)) {
      $output = drupal_eval($output);
    }
    $fptype = variable_get("front_1_type", "drupal");
    switch ($fptype) {
      case "themed":
        print theme('page', $output);
        return;
      case "full":
        print $output;
        return;
      case "redirect":
        $output = variable_get("front_1_redirect", "drupal");
        break;
    }
  }
  else {
    if ($user->uid) {
      $roles = "";

      //make sure the roles variable is clear
      $roles = user_roles();

      //load up the user roles for the site
      krsort($roles);

      //reverse the order of role types so it checks the highest or more recent role type first.
      foreach ($roles as $role_id => $role_name) {

        // run through each role type starting at the most recent working backwards
        if (array_key_exists($role_id, $user->roles) && trim(variable_get("front_" . $role_id . "_text", "")) != "") {

          // if the current visitor has a role type that matches and if the front page setting for that role type is not empty.
          if (variable_get("special_notice_text", "") != "" && $user->access < $check_time) {
            $output = '<div id="mission">';
            $output .= variable_get("special_notice_text", "");
            $output .= '</div>';
            $output .= variable_get("front_" . $role_id . "_text", "");
          }
          else {
            $output = variable_get("front_" . $role_id . "_text", "");
          }

          /* if PHP code execution is allowed then use eval */
          if (variable_get('front_". $role_id ."_php', 0)) {
            $output = drupal_eval($output);
          }
          $fptype = variable_get("front_" . $role_id . "_type", "drupal");

          //check whether it is a themed or full front page.
          switch ($fptype) {
            case "themed":
              print theme('page', $output);
              return;
            case "full":
              print $output;
              return;
            case "redirect":
              $output = variable_get("front_" . $role_id . "_redirect", "drupal");
              drupal_goto($path = $output, $query = NULL, $fragment = NULL);
              break;
          }
        }
      }
    }
  }
}

Functions

Namesort descending Description
front_page
front_page_admin this function sets up the admin/build/front_page settings page
front_page_help Implementation of hook_help().
front_page_menu this function sets the necessary paths etc. so drupal knows where to find the front_page
uninstall_front_page this function uninstalls the front page module