Newer
Older
<?php
// $Id$
/**
* gallery.module : gallery_base.inc
* Base functions
*/
define(GALLERY_ERROR_WATCHDOG, 1);
define(GALLERY_ERROR_BROWSER, 2);
define(GALLERY_ERROR_VERBOSE, 3);
define(GALLERY_SEVERITY_ERROR, -1);
define(GALLERY_SEVERITY_WARNING, -2);
define(GALLERY_SEVERITY_ADVISE, -3);
define(GALLERY_SEVERITY_UNKNOWN, -4);
define(GALLERY_PLUGIN_ENABLED, 1);
define(GALLERY_PLUGIN_DISABLED, 0);
define(GALLERY_PLUGIN_STATUS_UNKNOWN, -1);
define(GALLERY_PLUGIN_NOT_ACTIVE, -2);
define(GALLERY_PLUGIN_NOT_INSTALLED, -3);
define(GALLERY_PLUGIN_MISSING, -4);
define(GALLERY_DEBUGTRACE, TRUE);
* Function gallery_login().
* (login user into embedded gallery)
*/
function gallery_login() {
_gallery_init();
}
/**
* Function gallery_logout().
* (end user session)
function gallery_logout() {
if (variable_get('gallery_valid', FALSE)) {
require_once(variable_get('gallery_dir', './gallery2/') .'embed.php');
GalleryEmbed::logout();
}
}
* Function _gallery_init().
* (initialize embedded gallery)
function _gallery_init($full = FALSE, $vars = NULL, $report_error = TRUE) {
Thilo Viereck
committed
static $ready = array('half' => FALSE, 'full' => FALSE);
Thilo Viereck
committed
if ($ready[$full ? 'full' : 'half']) {
return TRUE;
$embed_path = variable_get('gallery_dir', './gallery2/') .'embed.php';
$g2_uri = variable_get('gallery_uri', '/gallery2/');
$embed_uri = variable_get('gallery_embed_uri', '?q=gallery');
$gallery_valid = variable_get('gallery_valid', 0);
$uid = ($user->uid > 0) ? $user->uid : '';
}
else {
$embed_path = $vars['gallery_dir'] .'embed.php';
$g2_uri = $vars['gallery_uri'];
$embed_uri = $vars['gallery_embed_uri'];
$gallery_valid = $vars['gallery_valid'];
$uid = '';
$init_err_msg = t('Unable to initialize embedded Gallery. You need to <a href="@link"> configure your embedded Gallery</a>.',
array('@link' => url('admin/settings/gallery/install')));
if ((!$gallery_valid) || (!is_readable($embed_path))) {
Thilo Viereck
committed
return FALSE;
include_once($embed_path);
$params = array('embedUri' => $embed_uri,
'g2Uri' => $g2_uri,
'loginRedirect' => url('user/login', drupal_get_destination(), NULL, TRUE),
'activeUserId' => $uid,
'activeLanguage' => gallery_get_language($user),
'fullInit' => $full,
'apiVersion' => array(1, 2));
$ret = GalleryEmbed::init($params);
if ($ret) {
if ($ret->getErrorCode() & ERROR_PLUGIN_VERSION_MISMATCH) {
if ($report_error) {
gallery_error($vars ? t('Embedding API version is incompatible.') : $init_err_msg, $ret, TRUE);
}
Thilo Viereck
committed
return FALSE;
else {
if ($report_error) {
gallery_error($init_err_msg, $ret, TRUE);
}
Thilo Viereck
committed
return FALSE;
Thilo Viereck
committed
if (!class_exists('GalleryEmbed') || !class_exists('GalleryCoreApi')) {
if ($report_error) {
gallery_error(t('Classes \'GalleryEmbed\' and/or \'GalleryCoreApi\' are not available,
although initialization seemed successful.'));
Thilo Viereck
committed
}
return FALSE;
}
$ready['half'] = $full ? ($ready['full'] = TRUE) : TRUE;
}
/**
* Function gallery_handle_request().
* (handleRequest extension with error handling)
*/
function gallery_handle_request() {
ob_start();
$result = GalleryEmbed::handleRequest();
$output = ob_get_contents();
ob_end_clean();
if ($output) {
if (!preg_match('%<h2>\sError\s</h2>%', $output)) {
// If $output does not contain '<h2>Error</h2>', this is an AJAX/Image callback
print $output;
exit();
}
else {
// Otherwise (on regular pages) $output means that an error occured
preg_match('%<div id="giStackTrace" [^>]*>(.*?)</div>%is', $output, $matches);
if (variable_get('gallery_error_redirect', 0) && user_access('search content')) {
drupal_set_message('The requested Gallery URL does not exist. It may have been moved or deleted.
You can search for the item below.', 'notice');
drupal_goto('search/gallery');
}
gallery_error(t('Error handling request (invalid request)<br />or the requested Gallery URL does not exist.'), $matches[1], TRUE);
return $result;
}
/**
* Function gallery_get_language().
* (get the language for $user)
*/
function gallery_get_language($user) {
$language = $user->language;
if ($user->uid == 0 || empty($language)) {
if (module_exists('i18n')) {
elseif (module_exists('locale')) {
$result = db_query('SELECT locale FROM {locales_meta} WHERE isdefault = 1');
$row = db_fetch_object($result);
// Convert certain lang codes, e.g. 'esl/spa es' => 'es' or 'fr-ca' => 'fr'
return preg_replace(array('/([\w\/]+) ([a-z]{2,3})/i', '/([a-z]{2,3})-(\w+)/i'), array('${2}', '${1}'), $language);
* Function gallery_get_image_frames().
* (retrieve all image frames from Gallery2)
*/
function gallery_get_image_frames() {
_gallery_init();
list($ret, $imageframe) = GalleryCoreApi::newFactoryInstance('ImageFrameInterface_1_1');
if ($ret || !isset($imageframe)) {
return array('none' => t('None'));
}
list($ret, $list) = $imageframe->getImageFrameList();
if ($ret) {
return array('none' => t('None'));
}
return $list;
*/
function gallery_generate_url($params, $html = TRUE, $full = TRUE) {
$options = array();
$options['forceFullUrl'] = $full;
$options['htmlEntities'] = $html;
$url_generator =& $GLOBALS['gallery']->getUrlGenerator();
if (!$url_generator) {
gallery_error(t('Error: UrlGenerator not available'));
return '';
}
return $url_generator->generateUrl($params, $options);
}
/**
*/
function gallery_item_details($id, $verbose = FALSE) {
$details = array();
list($ret, $entity) = GalleryCoreApi::loadEntitiesById($id);
if ($ret) {
gallery_error(t('Error fetching album details (entityId: :id)',
array(':id' => $id)), $ret);
return $details;
}
$details['g2type'] = $entity->entityType;
$details['g2owner'] = $entity->ownerId;
$details['g2parent'] = $entity->parentId;
// Drupal node properties (no g2 prefix)
Thilo Viereck
committed
$details['title'] = strtr($entity->title, array_flip(get_html_translation_table(HTML_SPECIALCHARS)));
$details['created'] = $entity->creationTimestamp;
if ($verbose) {
$details['g2description'] = $entity->description;
$details['g2summary'] = $entity->summary;
$details['g2keywords'] = $entity->keywords;
$details['g2theme'] = $entity->theme;
}
return $details;
* Function gallery_flush_entity_cache().
*/
function gallery_flush_entity_cache() {
$platform =& $GLOBALS['gallery']->getPlatform();
$cache_basedir = $GLOBALS['gallery']->getConfig('data.gallery.cache');
$cache_dir = $cache_basedir .'entity';
if ($platform->file_exists($cache_dir)) {
if (!$platform->recursiveRmDir($cache_dir)) {
return FALSE;
}
}
return TRUE;
}
*/
function gallery_set_head($html, $settitle = FALSE) {
if (!empty($html)) {
list($title, $css, $javascript) = GalleryEmbed::parseHead($html);
if ($settitle) {
drupal_set_title($title);
}
gallery_set_css($css);
gallery_set_javascript($javascript);
}
}
/**
*/
function gallery_set_css($css) {
global $base_url;
static $css_memory = array();
if (count($css)) {
$css = preg_replace('/<link(.*?)href="([^"]*)"(.*?)\/>/i', '${2}', $css);
$css = preg_replace(array('#^'. $base_url .'#', '#^'. base_path() .'#', '#^/#'), '', $css);
foreach ($css as $include) {
if (!in_array(($md5 = md5($include)), $css_memory)) {
$css_memory[] = $md5;
// Workaround for urls containing '&' with @import directive (#157978)
$include = str_replace('&g2_frames', '&g2_frames', $include);
if (substr($include, 0, 6) == '<style') {
// drupal_add_css() does not support inline styles
drupal_set_html_head($include);
}
elseif (substr($include, 0, 4) == 'http' || variable_get('gallery_outside', 0)) {
// drupal_add_css() does not support external paths
drupal_set_html_head('<style type="text/css" media="all">@import "'. $include .'";</style>'."\n");
}
else {
// Gallery's css must always be added first to allow overriding from the module(s)
drupal_add_css($include, 'module', 'all', FALSE);
}
}
}
}
}
/**
* Function gallery_set_javascript().
* (druapl_add_js() ensures proper cascading of included G2 javascript)
*/
function gallery_set_javascript($javascript) {
global $base_url;
static $js_memory = array();
if (!empty($javascript)) {
$files = preg_grep('/<script(.*?)src=/i', $javascript);
$inline = array_diff($javascript, $files);
$inline = preg_replace('/<script([^>]*)>(.*?)<\/script>/is', '\2', $inline);
drupal_add_js(implode("\n", $inline), 'inline');
$files = preg_replace('/<script(.*?)src="([^"]*)"([^>]*)>(.*?)<\/script>/i', '${2}', $files);
$files = preg_replace(array('#^'. $base_url .'#', '#^'. base_path() .'#', '#^/#'), '', $files);
foreach ($files as $include) {
if (!in_array(($md5 = md5($include)), $js_memory)) {
$js_memory[] = $md5;
if (substr($include, 0, 4) == 'http' || variable_get('gallery_outside', 0)) {
// drupal_add_js() does not support external paths
drupal_set_html_head('<script type="text/javascript" src="'. $include .'"></script>'."\n");
}
else {
drupal_add_js($include);
}
}
}
}
}
* Function _gallery_split_imageblock().
* (split an image block result into individual images)
// From http://uk.php.net/manual/en/function.preg-split.php
// Split the html from image block into <...> parts
$pattern = '/(<(?:[^<>]+(?:"[^"]*"|\'[^\']*\')?)+>)/';
$html_array = preg_split($pattern, trim($html), -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
$ndx = 0;
$images = array();
$image_html = '';
// Iterate through this array and combine again, but on a per-image basis
foreach ($html_array as $value) {
$value = trim($value);
$image_html .= $value;
if (!strcmp($value, '<div class="one-image">')) {
// Found the opening <div> for the image
elseif (!strncmp($value, '<div', 4)) {
// Found a <div> but not the main image one (eg a frame)
elseif (!strcmp($value, '</div>')) {
// Found a </div> but check if it's for the main image or a subcomponent (eg frame)
// This must be the closing div for "one-image" so move to next image
$images[] = $image_html;
$image_html = '';
}
}
}
/*
* --------------------------------------------------------------------------
* Error, Debug and Status Functions
* --------------------------------------------------------------------------
*/
/**
* Function gallery_error().
*/
function gallery_error($msg, $ret = NULL, $serious = FALSE) {
$error_mode = variable_get('gallery_error_mode', array(GALLERY_ERROR_WATCHDOG));
$admin = user_access('administer site configuration');
$report = $admin && variable_get('gallery_report', 1);
$debug_info = array();
if (in_array(GALLERY_ERROR_VERBOSE, $error_mode) || variable_get('gallery_debug', 0) || $admin) {
$msg = $ret ? (is_object($ret) ? ($msg .'<br />'. $ret->getAsHtml()) : $ret) : $msg;
if (GALLERY_DEBUGTRACE && function_exists('debug_backtrace')) {
$trace = debug_backtrace();
$source = t('Error in function \':func()\' (:file::line):<br />',
array(':func' => $trace[1]['function'], ':file' => basename($trace[0]['file']), ':line' => $trace[0]['line']));
$message = $source .'<ul><li>'. $msg .'</li></ul>';
$debug_info = array('Debug Trace' => $trace);
}
}
$message = !empty($message) ? $message : $msg;
if (variable_get('gallery_debug', 0) && $admin) {
if ($report) {
_gallery_report_error($debug_info);
}
drupal_set_message($message, 'error');
return;
}
if (in_array(GALLERY_ERROR_BROWSER, $error_mode)) {
if ($report) {
_gallery_report_error($debug_info);
}
drupal_set_message($message, 'error');
}
elseif ($serious) {
if ($report) {
_gallery_report_error($debug_info);
}
drupal_set_message($admin ? $message : t('Embedded Gallery2 is not available or requested Gallery URL does not exist.'), 'error');
if (in_array(GALLERY_ERROR_WATCHDOG, $error_mode)) {
watchdog('gallery', $message, WATCHDOG_ERROR);
/**
* Function _gallery_report_error().
*/
function _gallery_report_error($report = array()) {
require_once(drupal_get_path('module', 'gallery') .'/gallery_help.inc');
require_once(drupal_get_path('module', 'gallery') .'/gallery_report.inc');
drupal_set_message(_gallery_report_help(), 'error');
_gallery_report(FALSE, $report, TRUE);
}
/**
* Function gallery_debug().
*/
function gallery_debug($array, $label = 'Gallery Debug') {
if (variable_get('gallery_debug', 0) && user_access('administer site configuration')) {
drupal_set_message('<strong>'. $label .':</strong><br />'. nl2br(htmlspecialchars(print_r($array, TRUE))), 'error');
}
}
/**
* Function gallery_plugin_status().
*/
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
function gallery_plugin_status($plugin_names) {
static $all_plugins_status = array();
$plugins_status = array();
if (!_gallery_init(FALSE)) {
gallery_error(t('Unable to initialize Gallery2.'), $ret);
foreach ($plugin_names as $plugin) {
$plugins_status[$plugin] = GALLERY_PLUGIN_STATUS_UNKNOWN;
}
return $plugins_status;
}
// Fetch status of G2 modules
if (empty($plugins_status_cache)) {
list($ret, $plugins_status_cache) = GalleryCoreApi::fetchPluginStatus('module');
if ($ret) {
gallery_error(t('Unable to get Gallery2 module status.'), $ret);
foreach ($plugin_names as $plugin) {
$plugins_status[$plugin] = GALLERY_PLUGIN_STATUS_UNKNOWN;
}
return $plugins_status;
}
}
// Generate array containing module status
foreach ($plugin_names as $plugin) {
if (isset($plugins_status_cache[$plugin])) {
if ($plugins_status_cache[$plugin]['active'] && $plugins_status_cache[$plugin]['available']) {
$plugins_status[$plugin] = GALLERY_PLUGIN_ENABLED;
}
elseif (!isset($plugins_status_cache[$plugin]['active']) && $plugins_status_cache[$plugin]['available']) {
$plugins_status[$plugin] = GALLERY_PLUGIN_NOT_INSTALLED;
}
elseif (($plugins_status_cache[$plugin]['active'] == 0) && $plugins_status_cache[$plugin]['available']) {
$plugins_status[$plugin] = GALLERY_PLUGIN_NOT_ACTIVE;
}
else {
$plugins_status[$plugin] = GALLERY_PLUGIN_DISABLED;
}
}
else {
$plugins_status[$plugin] = GALLERY_PLUGIN_MISSING;
}
}
return $plugins_status;
}
/**
* Function gallery_single_plugin_status().
*/
function gallery_single_plugin_status($plugin_name) {
$status = gallery_plugin_status(array($plugin_name));
return $status[$plugin_name];
}
/**
* Function gallery_set_status().
*/
function gallery_set_status($status = array(), $reset = FALSE) {
$status_array = $status;
if (!$reset) {
$status_array = unserialize(variable_get('gallery_status', serialize(array())));
foreach ($status as $key => $value) {
if (!empty($value)) {
$status_array[$key] = $value;
}
elseif (isset($status_array[$key])) {
unset($status_array[$key]);
}
}
}
variable_set('gallery_status', serialize($status_array));
}
/**
* Function gallery_get_status().
*/
function gallery_get_status() {
return unserialize(variable_get('gallery_status', serialize(array())));
}
/**
* Function gallery_version().
*/
function gallery_version() {
if (!_gallery_init(FALSE)) {
list($core_major, $core_minor) = GalleryCoreApi::getApiVersion();
list($embed_major, $embed_minor) = GalleryEmbed::getApiVersion();
$version = array(
'core' => array('major' => $core_major, 'minor' => $core_minor),
'embed' => array('major' => $embed_major, 'minor' => $embed_minor)
);
// Update version in status messages
$status = array('version' => array(
'title' => t('Gallery2 API version'),
'info' => "$core_major.$core_minor / $embed_major.$embed_minor")
);
gallery_set_status($status);
return $version;