function xbbcode_rebuild_handlers in Extensible BBCode 7
Same name and namespace in other branches
- 8 xbbcode.module \xbbcode_rebuild_handlers()
- 6 xbbcode.module \xbbcode_rebuild_handlers()
4 calls to xbbcode_rebuild_handlers()
- xbbcode_custom_tags_delete_submit in ./
xbbcode.admin.inc - Delete a custom tag.
- xbbcode_custom_tags_save_submit in ./
xbbcode.admin.inc - Save (create or update) a custom tag.
- xbbcode_modules_disabled in ./
xbbcode.module - Implements hook_modules_disabled().
- xbbcode_modules_enabled in ./
xbbcode.module - Implements hook_modules_enabled().
File
- ./
xbbcode.module, line 246 - The main module file containing hook implementations.
Code
function xbbcode_rebuild_handlers($hooks = array()) {
// Load the database interface and discovery functions.
module_load_include('inc', 'xbbcode', 'xbbcode.crud');
module_load_include('inc', 'xbbcode');
// Load the old global settings, and the settings for each specific format.
$old_settings[XBBCODE_GLOBAL] = xbbcode_handlers_load(XBBCODE_GLOBAL, TRUE);
foreach (array_keys(xbbcode_formats('specific')) as $format) {
$old_settings[$format] = xbbcode_handlers_load($format, TRUE);
}
// Find out which modules currently provide the tags that were already registered.
$current_handlers = _xbbcode_build_handlers();
// Remove or replace missing handlers.
$deleted_tags = $changed_tags = array();
foreach ($old_settings as $format => $old_handlers) {
foreach ($old_handlers as $tag_name => $old_handler) {
// If no module provides a particular tag, delete it.
if (!isset($current_handlers[$tag_name])) {
$deleted_tags[$tag_name] = $tag_name;
}
elseif (!isset($current_handlers[$tag_name]['modules'][$old_handler->module])) {
$changed_tags[$format][$tag_name] = key($current_handlers[$tag_name]['modules']);
}
}
}
// Add new handlers.
$new_tags = $discovered = array();
foreach ($current_handlers as $tag_name => $tag_handlers) {
foreach ($old_settings as $format => $registered_tags) {
if (!isset($registered_tags[$tag_name])) {
// If the module has no handler set for this tag, add one of the providers.
$new_tags[$format][$tag_name] = key($tag_handlers['modules']);
}
}
foreach ($tag_handlers['modules'] as $module => $module_name) {
if (in_array($module, $hooks)) {
$discovered[$module][$tag_name] = $tag_name;
}
}
}
if ($deleted_tags) {
xbbcode_handlers_delete_tags($deleted_tags);
drupal_set_message(format_plural(count($deleted_tags), '1 BBCode tag was deleted because it is no longer provided: %tags', '@count tags were deleted because they are no longer provided: %tags', array(
'%tags' => '[' . implode('], [', $deleted_tags) . ']',
)), 'warning');
}
$changed_result = array();
foreach ($changed_tags as $format => $changed) {
foreach ($changed as $tag => $module) {
$changed_result[$tag] = xbbcode_handler_update($format, $tag, $module);
}
}
if ($changed_result) {
drupal_set_message(format_plural(count($changed_result), '1 BBCode tag was reassigned because its current module no longer provides it: %tags', '@count tags were reassigned because their current modules no longer provide them: %tags', array(
'%tags' => '[' . implode('], [', array_keys($changed_result)) . ']',
)), 'warning');
}
foreach ($new_tags as $format => $new) {
foreach ($new as $name => $module) {
$tag = (object) array(
'module' => $module,
'name' => $name,
'enabled' => 1,
);
xbbcode_handler_save($tag, $format);
}
}
$module_names = _xbbcode_module_names();
foreach ($discovered as $module => $new) {
drupal_set_message(format_plural(count($new), 'Module %module provides 1 new BBCode tag: %tags', 'Module %module provides @count new BBCode tags: %tags', array(
'%module' => $module_names[$module],
'%tags' => '[' . implode('], [', array_keys($new)) . ']',
)));
}
if ($deleted_tags || $changed_tags || $new_tags) {
xbbcode_rebuild_tags();
}
}