'['. (empty($id) ? $i : $id) .']')) : t('Gallery Navigation'); $blocks['block-'. $i]['cache'] = variable_get('gallery_block_'. $i .'_cache', BLOCK_NO_CACHE); } return $blocks; case 'view': if (user_access('access gallery') && _gallery_init(TRUE) && $_GET['q'] != 'admin/settings/gallery/install') { if ($delta) { $block = _gallery_block_block($delta); } else if ((arg(0) == variable_get('gallery_base', 'gallery')) && !empty($GLOBALS['gallery_sidebar'])) { $block['subject'] = t('Gallery Navigation'); $block['content'] = '
'. implode('', $GLOBALS['gallery_sidebar']) .'
'; } GalleryEmbed::done(); return isset($block) ? $block : FALSE; } break; case 'configure': require_once(drupal_get_path('module', 'gallery') .'/gallery_block_admin.inc'); return $delta ? _gallery_block_admin_block($delta) : _gallery_block_admin_navigation(); case 'save': require_once(drupal_get_path('module', 'gallery') .'/gallery_block_admin.inc'); _gallery_block_admin_save($edit); break; } } /** * Function _gallery_block_map(). */ function _gallery_block_map($refresh = FALSE) { // Get block map from cache (or rebuild map) $cache = cache_get('gallery:blockmap', 'cache'); if (!$cache || $refresh) { // Rebuild block map $block_map = array(); $g2_blocks = gallery_list_blocks(); foreach ($g2_blocks as $plugin => $blocks) { foreach (array_keys($blocks) as $block) { switch ($block) { // Blocks with no required parameter case 'AlbumSelect': case 'AlbumTree': case 'ShowCart': case 'LanguageSelector': case 'MembersSummary': case 'QuotasSummary': case 'RssBlock': $params = array(); break; // Parameter defaults to 'item' // (required by 'ViewComments', 'AddComment', 'ItemInfo', 'ItemLinks', // 'PeerList', 'CustomFields', 'ExifInfo', 'KeywordLinks', 'Rating', ...) default: $params = array('item'); } // $block_map[strtolower($block)] = array( 'plugin' => $plugin, 'block' => $block, 'params' => $params ); } } cache_set('gallery:blockmap', $block_map, 'cache', CACHE_PERMANENT); } else { $block_map = $cache->data; } return $block_map; } /** * Function _gallery_block_options(). */ function _gallery_block_options(&$type_map, &$param_map) { $g2_blocks = gallery_list_blocks(); $type_map = $g2_blocks['imageblock']['ImageBlock']['vars']['blocks']['choices']; $param_map = array( 'heading' => t('Heading'), 'title' => t('Title'), 'date' => t('Date'), 'views' => t('View Count'), 'owner' => t('Item owner') ); } /** * Function _gallery_block_block(). */ function _gallery_block_block($delta) { $block_map = _gallery_block_map(); $block_type = variable_get('gallery_block_'. $delta .'_type', 'imageblock'); $plugin = $block_map[$block_type]['plugin']; $plugin_block = $block_map[$block_type]['block']; $params = $block_map[$block_type]['params']; // ImageBlock needs special handling if ($plugin_block == 'ImageBlock') { return _gallery_block_image_block($delta, $plugin, $plugin_block); } // Check for required parameters if (!gallery_context($params)) { return FALSE; } // Add custom parameters $g2_blocks = gallery_list_blocks(); if (isset($g2_blocks[$plugin][$plugin_block]['vars'])) { foreach ($g2_blocks[$plugin][$plugin_block]['vars'] as $parameter => $options) { $block = strtolower($plugin_block .'_'. $parameter); $element = 'gallery_block_'. $delta .'_'. $block; $params[$parameter] = variable_get($element, $options['default']); } } return _gallery_block_get_block($plugin, $plugin_block, $params); } /** * Function _gallery_block_image_block(). */ function _gallery_block_image_block($delta, $plugin, $plugin_block) { $element = 'gallery_block_'. $delta .'_'. strtolower($plugin_block); $num_cols = variable_get($element .'_num_cols', 2); $num_rows = variable_get($element .'_num_rows', 2); $num_images = $num_cols * $num_rows; $param_blocks_array = array_filter(variable_get($element .'_block_block', array('randomImage'))); // Ensure $param_blocks_array contains $num_images elements (auto-append if necessary) $count = count($param_blocks_array); if (($num = $num_images - $count) > 0) { $param_blocks_array += array_fill($count, $num, end($param_blocks_array)); } $params['blocks'] = implode('|', $param_blocks_array); $params['itemId'] = variable_get($element .'_item_id', ''); $param_show_array = variable_get($element .'_block_show', array()); $params['show'] = empty($param_show_array) ? 'none' : implode('|', $param_show_array); if (variable_get($element .'_size_method', GALLERY_IMAGEBLOCK_SIZE_METHOD_DEFAULT) == 'maxsize') { $params['maxSize'] = variable_get($element .'_size', GALLERY_IMAGEBLOCK_SIZE_DEFAULT); } else { $params['exactSize'] = variable_get($element .'_size', GALLERY_IMAGEBLOCK_SIZE_DEFAULT); } $params['albumFrame'] = variable_get($element .'_album_frame', 'none'); $params['itemFrame'] = variable_get($element .'_item_frame', 'none'); $params['linkTarget'] = variable_get($element .'_link_target', ''); $params['link'] = variable_get($element .'_link', ''); $extra = ($num_cols > 1) ? array('num_cols' => $num_cols) : array(); return _gallery_block_get_block($plugin, $plugin_block, $params, $extra); } /** * Function _gallery_block_get_block(). */ function _gallery_block_get_block($plugin, $plugin_block, $params, $extra = array()) { // Handle useralbum feature (for ImageBlocks) if ($plugin_block == 'ImageBlock') { if (preg_match('/user(:([\d]+))?/i', $params['itemId'], $param_uid)) { require_once(drupal_get_path('module', 'gallery') .'/gallery_user.inc'); $params['itemId'] = gallery_user_useralbum(isset($param_uid[2]) ? $param_uid[2] : NULL, FALSE); } if (empty($params['itemId']) || $params['itemId'] === FALSE) { unset($params['itemId']); } } gallery_debug($params, t('Block parameters')); // Get the block from G2 list($ret, $content, $head) = GalleryEmbed::getBlock($plugin, $plugin_block, $params); if ($ret) { gallery_error(t('Error trying to get block.'), $ret); return array(); } $content = trim($content); // Allow other modules to alter the block output drupal_alter('gallery_block', $content, array('params' => $params, 'extra' => $extra)); // Format the block content $block = array(); if (!empty($content)) { $block['subject'] = t('Gallery'); $block['content'] = $content; // if ($plugin_block == 'ImageBlock') { if (isset($extra['num_cols'])) { $class = isset($extra['class']) ? $extra['class'] : 'gallery-grid-block'; $block['content'] = theme('gallery_block_grid_block', $content, $extra['num_cols'], $class); } else { $class = isset($extra['class']) ? $extra['class'] : 'g2image_centered'; $block['content'] = theme('gallery_block_image_block', $content, $class); } } // Add css/js to the page if ($head) { gallery_set_head($head); } } return $block; } /** * Function _gallery_block_split_imageblock(). * (split an image block result into individual images) */ function _gallery_block_split_imageblock($html) { // 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); $images = array(); $image_html = ''; $ndx = $open_divs = 0; $found_image_block_class = FALSE; $imageblock_class = '
')) { // Found the opening
for the image $open_divs = 0; } elseif (!strncmp($value, ' but not the main image one (eg a frame) $open_divs++; } elseif (!strcmp($value, '
')) { // Found a
but check if it's for the main image or a subcomponent (eg frame) if ($open_divs > 0) { $open_divs--; } else { // This must be the closing div for "one-image" so move to next image $images[] = $image_html; $image_html = ''; } } } // If using G2.3 there is a final
from imageblock that must be removed. if ($found_image_block_class) { unset($images[count($images)-1]); } return $images; } /** * Template function : template_preprocess_gallery_block_image_block(). */ function template_preprocess_gallery_block_image_block(&$variables) { $variables['class'] = check_plain($variables['class']); $variables['content'] = filter_xss_admin($variables['content']); } /** * Template function : template_preprocess_gallery_block_grid_block(). */ function template_preprocess_gallery_block_grid_block(&$variables) { $images = _gallery_block_split_imageblock($variables['content']); // Filter the images (and split columns) array_walk($images, 'filter_xss_admin'); $images = array_chunk($images, $variables['num_cols']); // Leave the whole content in in case themes want to do more formatting $variables['content'] = filter_xss_admin($variables['content']); $variables['images'] = array(); $row = 0; foreach ($images as $image_row) { $variables['images'][] = array( 'data' => $image_row, 'zebra' => ($row % 2 == 0) ? 'odd' : 'even' ); $row++; } $variables['class'] = check_plain($variables['class']); $variables['num_cols'] = check_plain($variables['num_cols']); }