You are here

custompage.module in Custom Page 6

Same filename and directory in other branches
  1. 7 custompage.module

Custom Page Module

File

custompage.module
View source
<?php

/**
* @file
* Custom Page Module
**/
function custompage_init() {
  $mpath = dirname(__FILE__);
  require_once $mpath . '/custompage_util.inc';
  if (module_exists('context')) {

    //Context module integration
    include_once $mpath . '/custompage.context.inc';
  }

  /*
     Load CSS. Since util functions are useful
     and can be called from non-custompage pages
     as well (e.g. a block), we need to always load
     css, not - just when we are on a custom page.
  */
  $mod_uri = drupal_get_path('module', 'custompage');
  drupal_add_css($mod_uri . '/custompage.css');

  //For Development Only. Do NOT un-comment in production

  //drupal_flush_all_caches();
}

/**
 * Implementation of hook_perm().
 */
function custompage_perm() {
  return array(
    'administer custompage',
    'edit custompage tiles',
  );
}

/**
 * Implementation of hook_menu().
 *
 * Register menu callbacks for all custom page URLs.
 */
function custompage_menu() {
  $items = array();
  $items['admin/build/custompage/flushcache'] = array(
    'title' => 'Flush Cache',
    'page callback' => 'custompage_flushcache',
    'access arguments' => array(
      'administer custompage',
    ),
    'type' => MENU_CALLBACK,
  );
  $items['admin/build/custompage/settings'] = array(
    'title' => 'Custom Page Settings',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'custompage_settings',
    ),
    'access arguments' => array(
      'administer custompage',
    ),
    'file' => 'custompage.admin.inc',
  );
  $styled_pathes = _custompage_get_mappings();
  foreach ($styled_pathes as $path) {

    // only create callbacks for page-type components
    if ($path->type == 'block') {
      continue;
    }
    if ($path->enabled) {
      $access = array(
        'access content',
      );
    }
    else {
      $access = array(
        'administer custompage',
      );
    }
    $items[$path->path] = array(
      'title' => t($path->title),
      'page callback' => 'custompage_delegate',
      'page arguments' => array(
        $path->key,
      ),
      'access arguments' => $access,
      'type' => MENU_NORMAL_ITEM,
    );
  }
  return $items;
}

/**
* Generate custom blocks
* @param op the operation from the URL
* @param delta offset
* @param edit edited values if a config or save
* @returns block HTML
*/
function custompage_block($op = 'list', $delta = 0, $edit = array()) {
  $styled_pathes = _custompage_get_mappings();
  if (!is_array($styled_pathes)) {
    $styled_pathes = array();
  }
  if ($op == "list") {
    $blocks = array();
    foreach ($styled_pathes as $path) {

      // only create callbacks for page-type components
      if ($path->type != 'block') {
        continue;
      }
      $blocks[$path->key] = array(
        'info' => $path->title,
      );
    }
    return $blocks;
  }
  else {
    if ($op == 'view') {
      $block = array();
      foreach ($styled_pathes as $path) {

        // only create callbacks for page-type components
        if ($path->type != 'block') {
          continue;
        }
        if ($delta == $path->key) {
          $block = array(
            'subject' => $path->title,
            'content' => theme(custompage_prefix($path->key), FALSE),
          );
        }
      }
      return $block;
    }
  }
}

/**
 * Flush caches.
 */
function custompage_flushcache() {
  drupal_flush_all_caches();
  drupal_set_message('Cache cleared.');
  drupal_goto($_SERVER['HTTP_REFERER']);
}

/**
 * Implementation of hook_theme().
 *
 * Register theme tpl/functions for each custompage URL.
 */
function custompage_theme() {
  $styled_pathes = _custompage_get_mappings();
  $themes = array();
  foreach ($styled_pathes as $path) {
    $key = custompage_prefix($path->key);
    $themes[$key] = array(
      'arguments' => array(
        'title' => '',
        'user' => '',
        'data' => '',
      ),
      'template' => $key,
    );
  }
  return $themes;
}

/**
 * @return
 *    The custompage key configured for theme prefix if necessary
 */
function custompage_prefix($key) {
  $prefix = variable_get('custompage_theme_prefix', '');
  if (!empty($prefix)) {
    return "{$prefix}_{$key}";
  }
  return $key;
}

/**
* Find a theme function and/or template file and return content
*/
function custompage_delegate($arg) {
  global $user;

  //Context integration
  if (module_exists('context')) {

    // context 2
    if (function_exists('context_set_by_condition')) {
      context_set_by_condition('custompage', $arg);
    }
    else {
      if ($plugin = context_get_plugin('condition', 'custompage')) {
        $plugin
          ->execute($arg);
      }
    }
  }

  // Let's prepare some data for this baby.
  $data = module_invoke_all('customdata_' . $arg);
  $key = custompage_prefix($arg);
  $themed = theme($key, drupal_get_title(), $user, $data);

  //Remove ANNOYING errors about not finding functions that are optional anyway
  $messages = drupal_get_messages('error', TRUE);
  if (is_array($messages) & is_array($messages['error'])) {
    foreach ($messages['error'] as $msg) {
      $pattern = '/warning: call_user_func_array.+?First argument is expected to be a valid callback.+?/ims';
      if (preg_match($pattern, $msg)) {
        continue;
      }
      drupal_set_message($msg, 'error');
    }
  }
  if (trim($themed) == "") {
    drupal_set_message("custompage could not find an appropriate theming function or template file for this path [{$arg}]. \n    <br /><b>The viable options (in ascending priority) are:</b>\n    <ul>  \n      <li>'phptemplate_{$arg}' in any module\n      <li>'THEMENAME_{$arg}' in a theme with the name THEMENAME\n      <li> " . custompage_prefix($arg) . ".tpl.php template file in a current theme      \n    </ul>\n    Please make sure at least one of these exist and returns a non-empty output" . custompage_clearcache_message(), 'error');
    return "&nbsp;";

    //Returning empty leads to undesired effect of getting a blank page
  }
  else {
    return $themed;
  }
}
function custompage_clearcache_message() {
  return "<div style=\"border-top: 1px solid silver;\"><b>ATTENTION:</b> Theme engine is strongly cached in Drupal versions 6 and up and\n  if/when you add a new tpl.php or a theming function, you need to " . l(t('clear cache'), 'admin/build/custompage/flushcache') . " before you can see any changes.</div>";
}
function custompage_uri_load($id) {
  return TRUE;
}
function _custompage_get_mappings() {
  static $mappings;
  if (is_array($mappings)) {

    //performance optimization
    return $mappings;
  }
  $mappings = module_invoke_all('custompages');

  /*** Structure:
    $obj = new stdClass();

    $obj->uri = 'homepage';
    $obj->title = 'Home Page';
    $obj->key = 'homepage';

    $mappings[] = $obj;
    **/
  return $mappings;
}

/**
 * Make module compatible with context 3
 * implement hook_ctools_plugin_api().
 */
function custompage_ctools_plugin_api($module, $api) {

  // site using context 2, but using ctools
  if (function_exists('context_set_by_condition')) {
    return;
  }
  if ($module == 'context' && $api == 'plugins') {
    return array(
      'version' => 3,
    );
  }
}

/**
 * Make module compatible with context 3
 * Implement hook_context_plugins().
 */
function custompage_context_plugins() {
  $plugins = array();
  $plugins['custompage_context_condition_alias'] = array(
    'handler' => array(
      'path' => drupal_get_path('module', 'custompage') . '/plugins',
      'file' => 'custompage_context_condition_alias.inc',
      'class' => 'custompage_context_condition_alias',
      'parent' => 'context_condition',
    ),
  );
  return $plugins;
}

/**
 * Make module compatible with context 3
 * Implement hook_context_registry().
 */
function custompage_context_registry() {
  $registry['conditions'] = array(
    'custompage' => array(
      'title' => t('Custompage'),
      'description' => t('Set condition on visiting a custom page URL.'),
      'plugin' => 'custompage_context_condition_alias',
    ),
  );
  return $registry;
}

Functions

Namesort descending Description
custompage_block Generate custom blocks
custompage_clearcache_message
custompage_context_plugins Make module compatible with context 3 Implement hook_context_plugins().
custompage_context_registry Make module compatible with context 3 Implement hook_context_registry().
custompage_ctools_plugin_api Make module compatible with context 3 implement hook_ctools_plugin_api().
custompage_delegate Find a theme function and/or template file and return content
custompage_flushcache Flush caches.
custompage_init @file Custom Page Module
custompage_menu Implementation of hook_menu().
custompage_perm Implementation of hook_perm().
custompage_prefix
custompage_theme Implementation of hook_theme().
custompage_uri_load
_custompage_get_mappings