View source
<?php
require_once drupal_get_path('module', 'flickr') . '/flickr.inc';
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.');
}
}
function flickr_perm() {
return array(
'view own flickr photos',
'view all flickr photos',
'administer flickr',
);
}
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');
$view_access |= user_access('view own flickr photos') && $user->uid == arg(1) || user_access('view all flickr photos');
$view_access &= $account->status || $admin_access;
$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;
}
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."),
);
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)) {
}
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) {
$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']);
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'];
}
}
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;
}
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) {
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;
$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;
}
$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);
}