You are here

flickr.module in Flickr 5

Same filename and directory in other branches
  1. 8 flickr.module
  2. 6 flickr.module
  3. 7 flickr.module

File

flickr.module
View source
<?php

require_once drupal_get_path('module', 'flickr') . '/flickr.inc';

/**
 * Implementation of hook_help().
 */
function flickr_help($section) {
  switch ($section) {
    case 'admin/settings/flickr':
      return t("You will need a Flickr API key to use this module. You can apply for one at <a href='@link'>@link</a>", array(
        '@link' => url('http://www.flickr.com/services/api/keys/apply/'),
      ));
    case 'admin/help#flickr':
      return t('The flickr module uses XML-RPC to connect to Flickr\'s API and retreive photo information.');
  }
}

/**
 * Implementation of hook_perm().
 */
function flickr_perm() {
  return array(
    'view own flickr photos',
    'view all flickr photos',
    'administer flickr',
  );
}

/**
 * Implementation of hook_menu().
 */
function flickr_menu($may_cache) {
  global $user;
  $items = array();
  if ($may_cache) {
    $items[] = array(
      'path' => 'admin/settings/flickr',
      'title' => t('Flickr'),
      'callback' => 'drupal_get_form',
      'callback arguments' => array(
        'flickr_admin_settings',
      ),
      'access' => user_access('administer site configuration'),
      'type' => MENU_NORMAL_ITEM,
      'description' => t('Change settings for the flickr module.'),
    );
    $items[] = array(
      'path' => 'flickr',
      'title' => t('Flickr photos'),
      'access' => TRUE,
      'type' => MENU_CALLBACK,
      'callback' => 'flickr_photos',
      'description' => t('Flickr photos of default user id.'),
    );
    $items[] = array(
      'path' => 'flickr/auth',
      'access' => TRUE,
      'type' => MENU_CALLBACK,
      'callback' => 'flickr_auth_callback',
    );
  }
  else {
    if (arg(0) == 'flickr' && is_numeric(arg(1)) && arg(1) > 0) {
      $account = user_load(array(
        'uid' => arg(1),
      ));
      if ($account !== FALSE && isset($account->flickr['nsid'])) {
        $nsid = $account->flickr['nsid'];
        $admin_access = user_access('administer flickr');

        // let a user view their own account or all if they have permission
        $view_access |= user_access('view own flickr photos') && $user->uid == arg(1) || user_access('view all flickr photos');

        // Only admins can view blocked accounts
        $view_access &= $account->status || $admin_access;

        //main flickr user page(photos)
        $items[] = array(
          'path' => 'flickr/' . arg(1),
          'title' => t("@user's Flickr", array(
            '@user' => $account->name,
          )),
          'type' => MENU_CALLBACK,
          'callback' => 'flickr_photos',
          'callback arguments' => array(
            arg(1),
          ),
          'access' => $view_access,
        );
        $items[] = array(
          'path' => 'flickr/' . arg(1) . '/photos',
          'title' => t('Photos'),
          'type' => MENU_DEFAULT_LOCAL_TASK,
          'weight' => -10,
          'access' => $view_access,
        );
      }
      elseif ($account !== FALSE && !isset($account->flickr['nsid'])) {
        drupal_set_message(t('%user does not have a Flickr account', array(
          '%user' => $account->name,
        )), 'error');
      }
    }
  }
  return $items;
}

/**
 * Implementation of hook_settings
 */
function flickr_admin_settings() {
  $form['#validate'] = array(
    'flickr_admin_settings_validate' => array(),
  );
  $form['flickr_api_key'] = array(
    '#type' => 'textfield',
    '#title' => t('API Key'),
    '#required' => TRUE,
    '#default_value' => variable_get('flickr_api_key', ''),
    '#description' => t('API Key from Flickr'),
  );
  $form['flickr_api_secret'] = array(
    '#type' => 'textfield',
    '#title' => t('API Shared Secret'),
    '#required' => TRUE,
    '#default_value' => variable_get('flickr_api_secret', ''),
    '#description' => t("API key's secret from Flickr."),
  );
  $form['flickr_default_userid'] = array(
    '#type' => 'textfield',
    '#title' => t('Default Flickr User Id'),
    '#default_value' => variable_get('flickr_default_userid', ''),
    '#description' => t("An, optional, default Flickr username or user id. This will be used when no user is specified."),
  );
  $times = array(
    900,
    1800,
    2700,
    3600,
    7200,
    10800,
    14400,
    18000,
    21600,
    43200,
    86400,
  );
  $ageoptions = drupal_map_assoc($times, 'format_interval');
  $form['flickr_cache_duration'] = array(
    '#type' => 'select',
    '#title' => t('Update interval'),
    '#options' => $ageoptions,
    '#default_value' => variable_get('flickr_cache_duration', 3600),
    '#description' => t("The refresh interval indicating how often you want to check cached Flickr API calls are up to date."),
  );

  // we need an api key before we can verify usernames
  if (!$form['flickr_api_key']['#default_value']) {
    $form['flickr_default_userid']['#disabled'] = TRUE;
    $form['flickr_default_userid']['#description'] .= t(" Disabled until a valid API Key is set.");
  }
  return system_settings_form($form);
}
function flickr_admin_settings_validate($form_id, $form) {
  $key = trim($form['flickr_api_key']);
  $sec = trim($form['flickr_api_secret']);
  $uid = trim($form['flickr_default_userid']);
  if ($key && preg_match('/^[A-Fa-f\\d]{32}$/', $key) != 1) {
    form_set_error('flickr_api_key', t('This does not appear to be a Flickr API key.'));
  }
  if ($sec && preg_match('/^[A-Fa-f\\d]{16}$/', $sec) != 1) {
    form_set_error('flickr_api_secret', t('This does not appear to be a Flickr API secret.'));
  }
  if ($uid) {
    if (flickr_is_nsid($uid)) {

      // it's already a uid
    }
    else {
      $user = flickr_user_find_by_username($uid);
      if (!$user) {
        form_set_error('flickr_default_userid', t('%uid is not a Flickr user id and it does not appear to be a valid user name.', array(
          '%uid' => $uid,
        )));
      }
    }
  }
}
function flickr_admin_settings_submit($form_id, $form) {

  // clean up the data ...
  $form['flickr_api_key'] = trim($form['flickr_api_key']);
  $form['flickr_api_secret'] = trim($form['flickr_api_secret']);
  $form['flickr_default_userid'] = trim($form['flickr_default_userid']);

  // ... replace the usernames with a user id ...
  if (!flickr_is_nsid($form['flickr_default_userid'])) {
    $username = $form['flickr_default_userid'];
    if ($user = flickr_user_find_by_username($username)) {
      drupal_set_message(t("The Flickr username %username has been replaced with the corresponding user id %uid.", array(
        '%username' => $form['flickr_default_userid'],
        '%uid' => $user['id'],
      )));
      $form['flickr_default_userid'] = $user['id'];
    }
  }

  // ... and save the settings
  system_settings_form_submit($form_id, $form);
}
function theme_flickr_photo($p, $size = NULL, $format = NULL, $attribs = NULL) {
  $img = flickr_img($p, $size, $attribs);
  $photo_url = flickr_photo_page_url($p['owner'], $p['id']);
  $title = is_array($p['title']) ? $p['title']['_content'] : $p['title'];
  return l($img, $photo_url, array(
    'title' => $title,
  ), NULL, NULL, TRUE, TRUE);
}
function theme_flickr_photo_box($p, $size = NULL, $format = NULL, $attribs = NULL) {
  $img = flickr_img($p, $size, $attribs);
  $title = is_array($p['title']) ? $p['title']['_content'] : $p['title'];
  $photo_url = flickr_photo_page_url($p['owner'], $p['id']);
  $output .= "<div class='flickr-photo-box'>\n";
  $output .= "<a href='{$photo_url}'>{$img}</a>";
  $output .= "<a href='{$photo_url}'>";
  $output .= '<div class="flickr-photo-title">' . check_plain($title) . "</div>\n";
  $output .= "</a>";
  $output .= "</div>\n";
  return $output;
}

/**
 * Implimentation of the hook_user()
 * Add an extra field for the user to enter his flickr identifier.
 */
function flickr_user($op, &$edit, &$account, $category = NULL) {
  if ($op == 'form') {
    if ($category == 'account') {
      $user = user_load(array(
        'uid' => $account->uid,
      ));
      $form['flickr'] = array(
        '#type' => 'fieldset',
        '#title' => t('Flickr settings'),
        '#collapsible' => FALSE,
        '#weight' => 4,
        '#tree' => FALSE,
      );
      $form['flickr']['flickr_identifier'] = array(
        '#type' => 'textfield',
        '#title' => t('Flickr identifier'),
        '#default_value' => $user->flickr['identifier'],
        '#description' => t('Enter either your Flickr username, the email address associated with your Flickr account, or your Flickr NSID. Leave this box empty to delete your Flickr page on this site.'),
        '#maxlength' => 64,
      );
      return $form;
    }
  }
  elseif ($op == 'validate') {
    if (!empty($edit['flickr_identifier'])) {
      if (!flickr_user_find_by_identifier($edit['flickr_identifier'])) {
        form_set_error('flickr_identifier', t('%ident is not a valid Flickr username, email, or NSID.', array(
          '%ident' => $edit['flickr_identifier'],
        )));
      }
    }
  }
  elseif ($op == 'insert' || $op == 'update') {
    if (isset($edit['flickr_identifier'])) {
      db_query('DELETE FROM {flickr_users} WHERE uid=%d', $account->uid);
      $user_affected = db_affected_rows();
      if (!empty($edit['flickr_identifier'])) {
        db_query("INSERT INTO {flickr_users} (uid, nsid, identifier) VALUES (%d, '%s', '%s')", $account->uid, flickr_user_find_by_identifier($edit['flickr_identifier']), $edit['flickr_identifier']);
      }
      else {
        if ($user_affected) {

          //flickr account deleted
          drupal_set_message(t("%username's Flickr page has been deleted.", array(
            '%username' => $account->name,
          )));
        }
      }
    }
    $edit['flickr_identifier'] = NULL;
  }
  elseif ($op == 'load') {
    $result = db_query('SELECT * FROM {flickr_users} WHERE uid=%d', $account->uid);
    if (db_num_rows($result) > 0) {
      $flickr_info = db_fetch_object($result);
      $account->flickr['identifier'] = $flickr_info->identifier;
      $account->flickr['nsid'] = $flickr_info->nsid;
    }
  }
  elseif ($op == 'delete') {
    db_query('DELETE FROM {flickr_users} WHERE uid=%d', $account->uid);
  }
}
function flickr_photos($uid = NULL) {
  drupal_add_css(drupal_get_path('module', 'flickr') . '/flickr.css');
  global $pager_page_array, $pager_total, $pager_total_items;

  //set this to something else if you want multiple pagers
  $element = 0;
  $pager_page_array[$element] = empty($_GET['page']) ? 0 : (int) $_GET['page'];
  if ($uid === NULL) {
    $nsid = variable_get('flickr_default_userid', '');
    if (!$nsid) {
      drupal_set_message(t('No default Flickr user id has been set.'));
      return FALSE;
    }
  }
  else {
    $account = user_load(array(
      'uid' => $uid,
    ));
    if ($account->flickr['nsid']) {
      $nsid = $account->flickr['nsid'];
    }
    else {
      drupal_set_message(t('%user does not have a Flickr account', array(
        '%user' => $account->name,
      )), 'error');
      return FALSE;
    }
  }
  $photos = flickr_photos_search($nsid, $pager_page_array[$element] + 1);
  if (!$photos) {
    drupal_set_message(t('No accessible photos found for Flickr %userid', array(
      '%userid' => $nsid,
    )));
    return FALSE;
  }

  //set pager information we just acquired
  $pager_total[$element] = $photos['pages'];
  $pager_total_items[$element] = $photos['total'];
  return theme('flickr_photos', $uid, $photos);
}
function theme_flickr_photos($uid, $photos) {
  $output = theme('pager', NULL, variable_get('flickr_photos_per_page', 20));
  $output .= "<div class='fickr-photoset'>\n";
  foreach ($photos['photo'] as $photo) {
    $output .= theme('flickr_photo_box', $photo, 'm');
  }
  $output .= '</div>';
  $output .= theme('pager', NULL, variable_get('flickr_photos_per_page', 20));
  return $output;
}
function theme_flickr_photoset($ps, $owner, $size, $attribs = NULL) {
  $img = flickr_img($ps, $size, $attribs);
  $photo_url = flickr_photoset_page_url($owner, $ps['id']);
  $title = is_array($ps['title']) ? $ps['title']['_content'] : $ps['title'];
  return l($img, $photo_url, array(
    'title' => $title,
  ), NULL, NULL, TRUE, TRUE);
}

Functions

Namesort descending Description
flickr_admin_settings Implementation of hook_settings
flickr_admin_settings_submit
flickr_admin_settings_validate
flickr_help Implementation of hook_help().
flickr_menu Implementation of hook_menu().
flickr_perm Implementation of hook_perm().
flickr_photos
flickr_user Implimentation of the hook_user() Add an extra field for the user to enter his flickr identifier.
theme_flickr_photo
theme_flickr_photos
theme_flickr_photoset
theme_flickr_photo_box