spaces_customtext.module in Spaces 7
Same filename and directory in other branches
Spaces Custom Text.
Because of an unclearable static cache in t(), spaces_customtext must implement a rather unusual sequence of events to allow the custom strings variable to take effect for a given space. In particular, t() can be called very early in the Drupal bootstrap, potentially before the initialization of the active space for a given page. If this occurs, t() will static cache the locale_custom_text_[langcode] strings before spaces can override them.
To get around this problem, spaces_customtext does the following:
- Ensures that it has the lowest weight possible in the {system} table. This means that barring a call to t() in hook_boot(), spaces_customtext_init() will run *before* any calls to t().
- In spaces_customtext_init(), the global language langcode is switched to a temporary placeholder.
- **WARNING: Any calls to t() that occur between spaces_customtext_init() and the initialization of a space will not be properly translated or customized.**
- When a space is inited, variable overrides are loaded and the global language langcode is restored to its initial value. If no space is activated by spaces_init(), spaces will return the langcode to its initial value.
- Any subsequent calls to t() will use any custom overrides that exist for the active space.
File
spaces_customtext/spaces_customtext.moduleView source
<?php
/**
* @file
*
* Spaces Custom Text.
*
* Because of an unclearable static cache in t(), spaces_customtext must
* implement a rather unusual sequence of events to allow the custom strings
* variable to take effect for a given space. In particular, t() can be called
* very early in the Drupal bootstrap, potentially before the initialization
* of the active space for a given page. If this occurs, t() will static cache
* the locale_custom_text_[langcode] strings before spaces can override them.
*
* To get around this problem, spaces_customtext does the following:
*
* - Ensures that it has the lowest weight possible in the {system} table. This
* means that barring a call to t() in hook_boot(), spaces_customtext_init()
* will run *before* any calls to t().
*
* - In spaces_customtext_init(), the global language langcode is switched
* to a temporary placeholder.
*
* - **WARNING: Any calls to t() that occur between spaces_customtext_init()
* and the initialization of a space will not be properly translated or
* customized.**
*
* - When a space is inited, variable overrides are loaded and the global
* language langcode is restored to its initial value. If no space is
* activated by spaces_init(), spaces will return the langcode to its
* initial value.
*
* - Any subsequent calls to t() will use any custom overrides that exist for
* the active space.
*/
/**
* Implements hook_requirements().
*/
function spaces_customtext_requirements($phase) {
$requirements = array();
$t = get_t();
if ($phase == 'runtime') {
if (module_exists('locale')) {
$requirements['spaces_customtext'] = array(
'title' => $t('Spaces Custom Text compatibility'),
'description' => $t('Spaces Custom Text is not compatible with the Locale module. Either Spaces Custom Text or Locale must be disabled.'),
'severity' => REQUIREMENT_ERROR,
'value' => $t('Incompatible'),
);
}
}
return $requirements;
}
/**
* Implements hook_enable().
* Weight spaces_customtext as the lowest possible module.
*/
function spaces_customtext_enable() {
$min = db_query("SELECT weight FROM {system} WHERE type = :type ORDER BY weight ASC LIMIT 1", array(
':type' => 'module',
))
->fetchField();
$weight = $min < -10000 ? $min - 1 : -10000;
db_update('system')
->fields(array(
'weight' => $weight,
))
->condition('name', 'spaces_customtext')
->condition('type', 'module')
->execute();
}
/**
* Implements hook_init().
*/
function spaces_customtext_init() {
global $language;
spaces_customtext_cache($language->language);
$language->language = 'spaces_customtext';
}
/**
* Simple static cache for storing the actual language code for the current
* page request.
*/
function spaces_customtext_cache($langcode = NULL, $reset = FALSE) {
static $cache;
if ($reset) {
unset($cache);
}
$cache = isset($langcode) ? $langcode : $cache;
return isset($cache) ? $cache : NULL;
}
/**
* Implements hook_spaces_plugins().
*/
function spaces_customtext_spaces_plugins() {
return array(
'spaces_controller_customtext' => array(
'handler' => array(
'path' => drupal_get_path('module', 'spaces_customtext') . '/plugins',
'file' => 'spaces_controller_customtext.inc',
'class' => 'spaces_controller_customtext',
'parent' => 'spaces_controller_variable',
),
),
);
}
/**
* Implements hook_menu().
*/
function spaces_customtext_menu() {
return array(
'features/customtext/%' => array(
'access callback' => 'spaces_customtext_menu_access',
'access arguments' => array(),
'file' => 'spaces_customtext.admin.inc',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'spaces_customtext_settings_form',
2,
),
'title' => 'Settings',
'type' => MENU_CALLBACK,
),
);
}
/**
* Access callback for custom text.
*/
function spaces_customtext_menu_access() {
return spaces_access_admin() && user_access('administer string overrides');
}
/**
* Implements hook_form_alter() for spaces_features_form().
*/
function spaces_customtext_form_spaces_features_form_alter(&$form, &$form_state) {
$parent = menu_get_item();
foreach (element_children($form['settings']) as $feature) {
$link = l(t('Customize text'), "{$parent['href']}/customtext/{$feature}");
$link = !empty($form['settings'][$feature]['#value']) ? " | {$link}" : $link;
$form['settings'][$feature]['#value'] .= $link;
}
}
/**
* Implements hook_theme().
*/
function spaces_customtext_theme() {
return array(
'spaces_customtext_settings_form' => array(
'variables' => array(),
),
);
}
/**
* Implements hook_permission().
* Note that this is the same perm provided by the stringoverrides module.
*/
function spaces_customtext_permission() {
return array(
'administer string overrides' => array(
'title' => t('administer string overrides'),
'description' => t('TODO Add a description for \'administer string overrides\''),
),
);
}
Functions
Name | Description |
---|---|
spaces_customtext_cache | Simple static cache for storing the actual language code for the current page request. |
spaces_customtext_enable | Implements hook_enable(). Weight spaces_customtext as the lowest possible module. |
spaces_customtext_form_spaces_features_form_alter | Implements hook_form_alter() for spaces_features_form(). |
spaces_customtext_init | Implements hook_init(). |
spaces_customtext_menu | Implements hook_menu(). |
spaces_customtext_menu_access | Access callback for custom text. |
spaces_customtext_permission | Implements hook_permission(). Note that this is the same perm provided by the stringoverrides module. |
spaces_customtext_requirements | Implements hook_requirements(). |
spaces_customtext_spaces_plugins | Implements hook_spaces_plugins(). |
spaces_customtext_theme | Implements hook_theme(). |