You are here

brilliant_gallery.module in Brilliant Gallery 7

File

brilliant_gallery.module
View source
<?php

/**
 * Default directory (path) within the /files dir for temp (cache) files.
 */
define('BRILLIANT_GALLERY_DEFAULT_CACHE_DIR', 'brilliant_gallery_temp');

// See http://api.drupal.org/api/drupal/includes--file.inc/function/file_directory_path/6#comment-12954
define('FILE_DIRECTORY_PATH', variable_get('file_public_path', conf_path() . '/files'));

// Patching a possible problem with i18n
if (function_exists('i18n_get_lang')) {
  define('BG_LANGCODE', i18n_get_lang());
}
else {
  define('BG_LANGCODE', '');
}
if (module_exists('views')) {
  module_load_include('inc', 'brilliant_gallery', 'views');
}
module_load_include('inc', 'brilliant_gallery', 'brilliant_gallery_menu');
module_load_include('inc', 'brilliant_gallery', 'brilliant_gallery_functions');
module_load_include('inc', 'brilliant_gallery', 'brilliant_gallery_manage');
module_load_include('inc', 'brilliant_gallery', 'brilliant_gallery_showtime');
module_load_include('inc', 'brilliant_gallery', 'brilliant_gallery_cron');
require_once 'brilliant_gallery_formatters.inc';

/**
 * Display help and module information
 *
 * @param section which section of the site we're displaying help
 *
 * @return help text for section
 */
function brilliant_gallery_help($path, $arg) {
  switch ($path) {
    case "admin/help#brilliant_gallery":
      return '<h3>' . t('About') . '</h3>' . '<p>' . t("Highly customizable Drupal module creating a table gallery of quality-scaled images from any number of folders.") . '</p>';
  }
}

/**
 * Valid permissions for this module
 *
 * @return array An array of valid permissions for the onthisdate module
 */
function brilliant_gallery_permission() {
  return array(
    'access brilliant_gallery' => array(
      'title' => t('Access Brilliant Gallery'),
      'description' => t('Allow access to Brilliant Gallery.'),
    ),
    'administer brilliant_gallery' => array(
      'title' => t('Administer Brilliant Gallery'),
      'description' => t('Set roles that may access the settings of Brilliant Gallery.'),
    ),
  );
}

/**
 * Implements hook_block_info().
 */
function brilliant_gallery_block_info() {
  $block = array();

  // if (TRUE) {
  $block[0]["info"] = t("Brilliant Gallery");
  return $block;

  // }
}

/**
 * Implements hook_block_view().
 */
function brilliant_gallery_block_view($delta) {
  $block_content = '';
  $block_content .= render_brilliant_gallery();
  $block = array();

  // set up the block
  $block['subject'] = 'Brilliant gallery';
  $block['content'] = $block_content;
  return $block;
}

/**
 * @todo Please document this function.
 * @see http://drupal.org/node/1354
 */
function brilliant_gallery_all($switch = '') {
  $page_content = '';
  if ($switch == '') {
    $page_content .= render_brilliant_gallery();
  }
  else {
    if ($switch == 'edit') {
      $page_content .= render_brilliant_gallery_edit();
    }
  }
  return $page_content;
}

/**
 * Function to load the settings of all the checkboxes on this node.
 * Note that checkboxes that have never been checked will not have an entry in the database.
 */
function brilliant_gallery_checklist_loadall($nid = '') {
  global $user;
  $GLOBALS['devel_shutdown'] = FALSE;
  $uid = $user->uid;
  $dcvals = array();

  // Any checkbox id that starts with user- we remember the current user's settings
  // Any other id is global and we use user=0
  // TODO Please convert this statement to the D7 database API syntax.
  $result = db_query("select qid,state from {brilliant_gallery_checklist} where nid=:nid1 and qid not like 'user-%' and user=0 " . " union " . "select qid,state from {brilliant_gallery_checklist} where nid=:nid2 and qid like 'user-%' and user=:uid ", array(
    ':nid1' => $nid,
    ':nid2' => $nid,
    ':uid' => $uid,
  ));
  $count = 0;
  foreach ($result as $data) {
    $dcvals[$count] = array(
      'qid' => $data->qid,
      'state' => $data->state,
    );
    $count++;
  }
  print drupal_json_encode($dcvals);
  exit;
}

/**
 * Function to save/update the state of a checkbox when toggled
 */
function brilliant_gallery_checklist_save($nid = '', $qid = '', $state = '', $token = '') {
  global $user;
  $GLOBALS['devel_shutdown'] = FALSE;

  // Prevent possible damage from loading path bgchecklist/save directly.
  if (drupal_valid_token($token, 'render_brilliant_gallery_manage')) {

    // Token valid.
  }
  else {
    watchdog('Brilliant Gal', 'Invalid token submitted from bgchecklist/save', NULL, WATCHDOG_ALERT);
    return;
  }

  // First try to check whether we got here by an AJAX request. See https://drupal.stackexchange.com/questions/54296/how-can-i-detect-ajax-request-inside-drupal/54317#54317
  if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {

    // AJAX request.
  }
  else {
    watchdog('Brilliant Gal', 'Not an AJAX request from bgchecklist/save', NULL, WATCHDOG_ALERT);
    return;
  }

  // Verify that the submitted values are of expected type and range.
  if ($nid == 9999999 && $qid != '' && ($state == 0 || $state == 1)) {

    // Seems like a valid request.
    $qid = check_plain($qid);
  }
  else {
    watchdog('Brilliant Gal', 'Invalid request from bgchecklist/save', NULL, WATCHDOG_ALERT);
    return;
  }
  if (preg_match("/^user-/", $qid) == 1) {
    $uid = $user->uid;
  }
  else {
    $uid = 0;
  }

  // TODO Please convert this statement to the D7 database API syntax.
  $existing = db_query("select count(state) from {brilliant_gallery_checklist} " . "where nid=:nid and user=:uid and qid=:qid", array(
    ':nid' => $nid,
    ':uid' => $uid,
    ':qid' => $qid,
  ))
    ->fetchField();
  if ($existing == 0) {

    // TODO Please convert this statement to the D7 database API syntax.
    db_query("insert into {brilliant_gallery_checklist} (nid,user,qid,state) " . "values (:nid,:uid,:qid,:state)", array(
      ':nid' => $nid,
      ':uid' => $uid,
      ':qid' => $qid,
      ':state' => $state,
    ));
  }
  else {

    // TODO Please convert this statement to the D7 database API syntax.
    $current = db_query("select state from {brilliant_gallery_checklist} " . " where nid=:nid and user=:uid and qid=:qid", array(
      ':nid' => $nid,
      ':uid' => $uid,
      ':qid' => $qid,
    ))
      ->fetchField();
    if ($current != $state) {

      // TODO Please convert this statement to the D7 database API syntax.
      db_query("update {brilliant_gallery_checklist} " . "set state=:state where nid=:nid and user=:uid and qid=:qid", array(
        ':state' => $state,
        ':nid' => $nid,
        ':uid' => $uid,
        ':qid' => $qid,
      ));
    }
  }
  print drupal_json_encode("1");
  exit;
}

/**
 * Helper function for preg_replace_callback to generate the html for each checkbox
 * Form API not used as that would float all the checkboxes to the top/bottom of the page.
 */
function brilliant_gallery_checklist_docheckbox($matches) {
  global $brilliant_gallery_checklist_matchcount;
  $brilliant_gallery_checklist_matchcount++;
  $name = check_plain($matches[1]);
  $label = filter_xss($matches[2]);
  $output = <<<OUTPUT
    <div class="bgchecklist"> <div class="form-item"> <input name="{<span class="php-variable">$name</span>}" id="{<span class="php-variable">$name</span>}" value="1" class="form-brilliant_gallery_checklist-checkbox" type="checkbox"> <label class="option"> {<span class="php-variable">$label</span>} </label> </div></div>
OUTPUT;
  return $output;
}

/**
 * @todo Please document this function.
 * @see http://drupal.org/node/1354
 */
function brilliant_gallery_admin($form, &$form_state) {
  $form['brilliant_gallery_folder'] = array(
    '#type' => 'textfield',
    '#title' => t('Main gallery folder used for local galleries (not for Picasa)'),
    '#default_value' => variable_get('brilliant_gallery_folder', ''),
    '#size' => 77,
    '#maxlength' => 333,
    '#description' => t("Enter the name of the main folder in which you plan to store all your future gallery folders.\n        This base folder must be located under your default file system folder (see your file system path in /admin/settings/file-system/settings).\n        If this main folder does not exist under the file system folder, create it first. Do not use trailing slashes.\n        Enter, for example, <i>albums</i> or <i>myimages/albums</i>. If you leave this field empty your gallery will show only images that reside\n        directly in the root of your file system folder."),
  );
  $form['brilliant_gallery_pcache'] = array(
    '#type' => 'textfield',
    '#title' => t('Custom path for a cache folder'),
    '#default_value' => variable_get('brilliant_gallery_pcache', BRILLIANT_GALLERY_DEFAULT_CACHE_DIR),
    '#size' => 77,
    '#maxlength' => 333,
    '#description' => t("Temporary storage (cache) for resized local images and for images fetched from Picasa.\n        <br />It is OK to leave this field empty. If such case, a directory called 'brilliant_gallery_temp' will automatically be created in your /files directory.\n        (FYI: your /files directory is defined at /admin/settings/file-system)\n        <br />Otherwise, you can set here a custom path to a caching directory within your /files directory. Exclude trailing slashes. Example: <i>my_brilliant_gallery_temp</i>.\n        If this directory does not exist, the module will attempt to create it automatically. Note that only single directories (e.g. <i>my_brilliant_gallery_temp</i>)\n        can be created automatically. Paths such as e.g. <i>allmycaches/my_brilliant_gallery_temp</i> are valid as well but you have to create them manually."),
  );
  $form['brilliant_gallery_cache_duration'] = array(
    // Cache expiration - both DB cache and the Picasa file cache.
    '#type' => 'textfield',
    '#title' => t('Expiration time of the gallery cache (in days)'),
    '#default_value' => variable_get('brilliant_gallery_cache_duration', '90'),
    '#size' => 5,
    '#maxlength' => 5,
    '#description' => t("Images and other gallery structures are cached to improve speed of serving. Here you can set how long time they should be cached."),
  );
  $form['brilliant_gallery_maxcol'] = array(
    '#type' => 'textfield',
    '#title' => t('Maximum number of table columns'),
    '#default_value' => variable_get('brilliant_gallery_maxcol', 5),
    '#size' => 2,
    '#maxlength' => 2,
    '#description' => t("The maximum number of columns displayed in the table. If this is zero, the images will fill the row and continue on a next one."),
  );
  $form['brilliant_gallery_maximagewidth'] = array(
    '#type' => 'textfield',
    '#title' => t('Maximum width of table images'),
    '#default_value' => variable_get('brilliant_gallery_maximagewidth', 150),
    '#size' => 3,
    '#maxlength' => 4,
    '#description' => t("The maximum width of thumbnails in the table (height calculated automatically)."),
  );
  $form['brilliant_gallery_crop'] = array(
    '#type' => 'select',
    '#title' => t('Crop thumbnails to square shape'),
    '#required' => FALSE,
    '#options' => array(
      'yes' => t('yes'),
      'no' => t('no'),
    ),
    '#default_value' => variable_get('brilliant_gallery_crop', 'no'),
    '#description' => t("If selected, all image thumbnails will have the same square shape."),
  );
  $color_field_type = (function_exists('colorpicker_2_or_later') ? 'colorpicker_' : '') . 'textfield';
  $form['brilliant_gallery_bcgcolour_textfield'] = array(
    '#type' => $color_field_type,
    '#title' => t('Background colour'),
    '#description' => t('Please enter a color value in the form #RRGGBB'),
    '#default_value' => variable_get('brilliant_gallery_bcgcolour_textfield', '#000000'),
  );
  $form['brilliant_gallery_padding'] = array(
    '#type' => 'textfield',
    '#title' => t('Table cell padding'),
    '#default_value' => variable_get('brilliant_gallery_padding', 3),
    '#size' => 3,
    '#maxlength' => 3,
    '#description' => t("Cell padding (around each image) in pixels."),
  );
  $form['brilliant_gallery_overbrowser'] = array(
    '#type' => 'select',
    '#title' => t('Overlay browser'),
    '#required' => FALSE,
    '#options' => array(
      'colorbox' => t('Colorbox'),
      'lightbox' => t('Lightbox'),
      'none' => t('None'),
    ),
    '#default_value' => variable_get('brilliant_gallery_overbrowser', 'colorbox'),
    '#description' => t('Select the overlay image browser (the relevant module must be installed, of course).'),
  );
  $form['brilliant_gallery_maxwidth'] = array(
    '#type' => 'textfield',
    '#title' => t('Maximum width of full image'),
    '#default_value' => variable_get('brilliant_gallery_maxwidth', '1920'),
    '#size' => 5,
    '#maxlength' => 5,
    '#description' => t("Very large images will be scaled down to this width (in pixels) for display before they get displayed by the overlay browser."),
  );
  $form['brilliant_gallery_caption'] = array(
    '#type' => 'checkbox',
    '#title' => t('Display file name as caption'),
    '#default_value' => variable_get('brilliant_gallery_caption', ''),
    #'#size' => 5,

    #'#maxlength' => 5,
    '#description' => t("Check this if you want the overlay browser to display a caption based on the image file name (dots and underscores are automatically replaced by spaces)."),
  );
  $form['brilliant_gallery_sort'] = array(
    '#type' => 'radios',
    '#title' => t('Sort or randomize image order'),
    '#default_value' => variable_get('brilliant_gallery_sort', '1'),
    '#options' => array(
      '1' => t('Sort images by their file names alphabetically.'),
      '' => t('The order of your gallery images will always be randomized (on each page load or cache refresh).'),
    ),
  );
  return system_settings_form($form);
}

/**
 * @todo Please document this function.
 * @see http://drupal.org/node/1354
 */
function brilliant_gallery_admin_validate($form, &$form_state) {
  $brilliant_gallery_folder = $form_state['values']['brilliant_gallery_folder'];
  if (substr($brilliant_gallery_folder, 0, 1) == "/" or substr($brilliant_gallery_folder, -1, 1) == "/") {
    form_set_error('brilliant_gallery_folder', 'The path should not start or end with a slash.');
  }
  $dir = realpath(FILE_DIRECTORY_PATH) . '/' . $brilliant_gallery_folder;
  if (!file_exists($dir) or !is_dir($dir)) {

    // If the dir does not exist, attempt to create it or throw an error.
    if (!mkdir($dir)) {
      form_set_error('brilliant_gallery_folder', 'Directory ' . $brilliant_gallery_folder . ' does not exist in ' . FILE_DIRECTORY_PATH . '/ and it was not possible to create it automatically.');
    }
  }
  $brilliant_gallery_pcache = $form_state['values']['brilliant_gallery_pcache'];
  if (trim($brilliant_gallery_pcache) == '') {
    $brilliant_gallery_pcache = BRILLIANT_GALLERY_DEFAULT_CACHE_DIR;
  }
  if (substr($brilliant_gallery_pcache, 0, 1) == "/" or substr($brilliant_gallery_pcache, -1, 1) == "/") {
    form_set_error('brilliant_gallery_pcache', 'The path should not start or end with a slash.');
  }
  else {

    // The directory either exists or we attempt to create it now.
    $path = FILE_DIRECTORY_PATH . "/" . $brilliant_gallery_pcache;
    if (file_prepare_directory($path, FILE_CREATE_DIRECTORY)) {

      // All OK, the directory exists or was just created.
      $form_state['values']['brilliant_gallery_pcache'] = $brilliant_gallery_pcache;

      // Why not set it as well.
    }
    else {
      form_set_error('brilliant_gallery_pcache', "Directory " . $brilliant_gallery_pcache . " in your /files folder either could not be created or is not writable.");
    }
  }
}

/**
 * @todo Please document this function.
 * @see http://drupal.org/node/1354
 */
function brilliant_gallery_perms() {
  drupal_goto('admin/people/permissions', array(
    'fragment' => 'module-brilliant_gallery',
  ));
}
function bg_iterative_recurse_dir($from = '.') {
  if (!is_dir($from)) {
    return FALSE;
  }
  $files = array();
  $dirs = array(
    $from,
  );
  while (NULL !== ($dir = array_pop($dirs))) {
    if ($dh = opendir($dir)) {
      while (FALSE !== ($file = readdir($dh))) {
        if ($file == '.' || $file == '..') {
          continue;
        }
        $path = $dir . '/' . $file;
        if (is_dir($path)) {
          $dirs[] = $path;
        }
        else {
          $files[] = $path;
        }
      }
      closedir($dh);
    }
  }
  return $files;
}

/**
 * Implements hook_filter_info().
 */
function brilliant_gallery_filter_info() {
  $filters = array();
  $filters['filter_brilliant_gallery'] = array(
    'title' => t('Brilliant Gallery tag'),
    'description' => t('Substitutes a special Brilliant Gallery tag [bg|...] with the actual gallery table.'),
    'prepare callback' => 'brilliant_gallery_filter_brilliant_gallery_prepare',
    'process callback' => 'brilliant_gallery_filter_brilliant_gallery_process',
  );
  return $filters;
}
function brilliant_gallery_filter_brilliant_gallery_prepare($text, $filter) {
  return $text;
}
function brilliant_gallery_filter_brilliant_gallery_process($text, $filter) {
  $text = replace_brilliant_gallery_tags($text);
  return $text;
}

/**
 * @todo Please document this function.
 * @see http://drupal.org/node/1354
 */
function brilliant_gallery_filter_XXX($op, $delta = 0, $format = -1, $text = '') {
}

/**
 * @todo Please document this function.
 * @see http://drupal.org/node/1354
 */
function brilliant_gallery_get_allowed_params() {
  $allowed_params = array(
    // path/to/your/gallery/folder/without/wrapping/slashes|
    // or Picasa RSS URI
    // If not set, the value set at /admin/settings/brilliant_gallery is used.
    1 => 'location',
    // Columns to show. Zero (0) means there will be as many columns as the width of the page permits.
    // If not set, the value set at /admin/settings/brilliant_gallery is used.
    2 => 'thumbcolumns',
    // Width of individual thumbs. Height is calculated automatically, except in the case of square thumbs, where this will also be the height of the thumbs.
    // If not set, the value set at /admin/settings/brilliant_gallery is used.
    3 => 'thumbwidth',
    // 'sort' means images in the gallery will be sorted by their file names alphabetically, in ascending order. Set it to 'random' to shuffle the images in a gallery.
    // If not set, the value set at /admin/settings/brilliant_gallery is used.
    4 => 'thumbsort',
    // Maximum number of images to show in a gallery.
    5 => 'thumbmaxshow',
    // Background colour in format #000000.
    // If not set, the value set at /admin/settings/brilliant_gallery is used.
    6 => 'thumbbackcolour',
    // Sequential number of the image in the gallery that should appear as the first one.
    7 => 'thumbstartfrom',
    // Show captions in the overlay browser (based on the image file name (based on the image file name; dots and underscores are automatically replaced by spaces).
    // Can be 'yes', 'no', or you can specify text that will override the file name (useful when showing a single image).
    // If not set, the value set at /admin/settings/brilliant_gallery is used.
    8 => 'fullcaption',
    // Maximum width of images in full view (in the overlay browser).
    9 => 'fullwidth',
    // Squared - thumbnails are squared (both portrait and landscape images are cropped around their geometric centers).
    // If not set, the value set at /admin/settings/brilliant_gallery is used.
    // Either 'yes' or 'no'.
    10 => 'thumbsquared',
    // Table cell padding, in pixels.
    11 => 'thumbpadding',
    // Don't show a grid of images, but a slide show.
    // Currently only working for images fetched from Picasa.
    // 'yes' or 'no'. Default is on 'no'.
    12 => 'thumbslideshow',
    // Show only one or several images specified by file name(s), separated by commas. E.g.: imageone.jpg, imagetwo.png, imagethree.gif
    13 => 'thumbshowbyname',
    // Cache the HTML code of the generated gallery.
    14 => 'thumbhtmlcache',
    // Align images within cells of the galleries. Defaults to 'center'.
    15 => 'thumbalignincell',
  );
  return $allowed_params;
}

Functions

Namesort descending Description
bg_iterative_recurse_dir
brilliant_gallery_admin @todo Please document this function.
brilliant_gallery_admin_validate @todo Please document this function.
brilliant_gallery_all @todo Please document this function.
brilliant_gallery_block_info Implements hook_block_info().
brilliant_gallery_block_view Implements hook_block_view().
brilliant_gallery_checklist_docheckbox Helper function for preg_replace_callback to generate the html for each checkbox Form API not used as that would float all the checkboxes to the top/bottom of the page.
brilliant_gallery_checklist_loadall Function to load the settings of all the checkboxes on this node. Note that checkboxes that have never been checked will not have an entry in the database.
brilliant_gallery_checklist_save Function to save/update the state of a checkbox when toggled
brilliant_gallery_filter_brilliant_gallery_prepare
brilliant_gallery_filter_brilliant_gallery_process
brilliant_gallery_filter_info Implements hook_filter_info().
brilliant_gallery_filter_XXX @todo Please document this function.
brilliant_gallery_get_allowed_params @todo Please document this function.
brilliant_gallery_help Display help and module information
brilliant_gallery_permission Valid permissions for this module
brilliant_gallery_perms @todo Please document this function.

Constants

Namesort descending Description
BRILLIANT_GALLERY_DEFAULT_CACHE_DIR Default directory (path) within the /files dir for temp (cache) files.
FILE_DIRECTORY_PATH