View source
<?php
define('FOLLOW_NAME', 0);
define('FOLLOW_ME', 1);
define('FOLLOW_US', 2);
function follow_help($path) {
switch ($path) {
case 'follow':
case 'admin/settings/follow':
return t('Please copy and paste the url for your public profile or page for each service you would like to display in the block. Links need to match the domain of the service in question.');
}
}
function follow_menu($may_cache) {
$items = array();
if ($may_cache) {
$items[] = array(
'path' => 'admin/settings/follow',
'title' => t('Site follow links'),
'description' => t('Add sitewide follow links'),
'callback' => 'drupal_get_form',
'callback arguments' => array(
'follow_links_form',
),
'access' => user_access('edit site follow links'),
);
}
else {
$items[] = array(
'path' => 'user/' . arg(1) . '/follow',
'title' => 'My follow links',
'description' => 'edit follow links',
'callback' => 'drupal_get_form',
'callback arguments' => array(
'follow_links_form',
1,
),
'access' => user_access('follow_links_user_access'),
'type' => MENU_LOCAL_TASK,
);
drupal_add_css(drupal_get_path('module', 'follow') . '/follow.css');
}
return $items;
}
function follow_links_user_access($uid) {
return ($GLOBALS['user']->uid == $uid && user_access('edit own follow links') || user_access('edit any user follow links')) && $uid > 0;
}
function follow_perm() {
return array(
'edit own follow links',
'edit site follow links',
'edit any user follow links',
'administer follow',
'change follow link titles',
);
}
function follow_block($op = 'list', $delta = 0, $edit = array()) {
$function = 'follow_block_' . $op;
if (function_exists($function)) {
return $function($delta, $edit);
}
}
function follow_block_list($delta = 0, $edit = array()) {
$blocks['site'] = array(
'info' => t('Follow Site'),
'cache' => BLOCK_CACHE_PER_ROLE,
);
$blocks['user'] = array(
'info' => t('Follow User'),
'cache' => BLOCK_CACHE_PER_USER,
);
return $blocks;
}
function follow_block_configure($delta = '', $edit = array()) {
switch ($delta) {
case 'site':
$form['follow_title'] = array(
'#type' => 'radios',
'#title' => t('Default block title'),
'#default_value' => variable_get('follow_site_block_title', FOLLOW_NAME),
'#options' => array(
FOLLOW_NAME => t('Follow @name on', array(
'@name' => variable_get('site_name', 'Drupal'),
)),
FOLLOW_ME => t('Follow me on'),
FOLLOW_US => t('Follow us on'),
),
);
$form['follow_user'] = array(
'#type' => 'checkbox',
'#title' => t('User pages'),
'#description' => t('Should this block display on user profile pages?'),
'#default_value' => variable_get('follow_site_block_user', TRUE),
);
return $form;
case 'user':
$form['follow_title'] = array(
'#type' => 'radios',
'#title' => t('Default block title'),
'#default_value' => variable_get('follow_user_block_title', FOLLOW_NAME),
'#options' => array(
FOLLOW_NAME => t('Follow [username] on'),
FOLLOW_ME => t('Follow me on'),
),
);
return $form;
}
}
function follow_block_save($delta = '', $edit = array()) {
variable_set('follow_' . $delta . '_block_title', $edit['follow_title']);
if ($delta == 'site') {
variable_set('follow_site_block_user', $edit['follow_user']);
}
}
function follow_block_view($delta = '', $edit = array()) {
switch ($delta) {
case 'site':
if (($content = _follow_block_content()) && (variable_get('follow_site_block_user', TRUE) || !(arg(0) == 'user' && is_numeric(arg(1))))) {
return array(
'subject' => _follow_block_subject(),
'content' => $content,
);
}
break;
case 'user':
$uid = arg(1);
if (arg(0) == 'user' && is_numeric($uid) && ($content = _follow_block_content($uid))) {
return array(
'subject' => _follow_block_subject($uid),
'content' => $content,
);
}
break;
}
}
function _follow_block_subject($uid = 0) {
return follow_link_title($uid) . ':';
}
function follow_link_title($uid = 0) {
if ($uid) {
$setting = variable_get('follow_user_block_title', FOLLOW_NAME);
if ($setting == FOLLOW_NAME) {
$account = user_load(array(
'uid' => $uid,
));
return t('Follow !name on', array(
'!name' => theme('username', $account),
));
}
return t('Follow me on');
}
switch (variable_get('follow_site_block_title', FOLLOW_NAME)) {
case FOLLOW_NAME:
return t('Follow @name on', array(
'@name' => variable_get('site_name', 'Drupal'),
));
case FOLLOW_ME:
return t('Follow me on');
case FOLLOW_US:
return t('Follow us on');
}
}
function _follow_block_content($uid = 0) {
$output = '';
if ($links = follow_links_load($uid)) {
$output = theme('follow_links', array(
'links' => $links,
'networks' => follow_networks_load($uid),
));
$output .= _follow_block_config_links($uid);
}
return $output;
}
function theme_follow_links($variables) {
$links = $variables['links'];
$networks = $variables['networks'];
$output = '<div class="follow-links clearfix">';
foreach ($links as $link) {
$title = isset($link->title) ? $link->title : '';
if (empty($title)) {
$title = $networks[$link->name]['title'];
}
$output .= theme('follow_link', array(
'link' => $link,
'title' => $title,
));
}
$output .= '</div>';
return $output;
}
function theme_follow_link($variables) {
$link = $variables['link'];
$title = $variables['title'];
$classes = array();
$classes[] = 'follow-link';
$classes[] = "follow-link-{$link->name}";
$classes[] = $link->uid ? 'follow-link-user' : 'follow-link-site';
$attributes = array(
'class' => implode(' ', $classes),
'title' => follow_link_title($link->uid) . ' ' . $title,
);
return l($title, $link->path, $attributes) . "\n";
}
function _follow_block_config_links($uid) {
$links = array();
if ($uid == 0 && user_access('edit site follow links')) {
$links['follow_edit'] = array(
'title' => t('Edit'),
'href' => 'admin/settings/follow',
'query' => drupal_get_destination(),
);
}
elseif (follow_links_user_access($uid)) {
$links['follow_edit'] = array(
'title' => t('Edit'),
'href' => 'user/' . $uid . '/follow',
'query' => drupal_get_destination(),
);
}
if (user_access('administer blocks')) {
$links['follow_configure'] = array(
'title' => t('Configure'),
'href' => $uid ? 'admin/build/block/configure/follow/user' : 'admin/build/block/configure/follow/site',
'query' => drupal_get_destination(),
);
}
return theme('links', $links, array(
'class' => 'links inline',
));
}
function follow_links_form($uid = 0) {
$form = array();
$form['uid'] = array(
'#type' => 'hidden',
'#value' => $uid,
);
$form['follow_links']['#tree'] = TRUE;
$form['follow_links']['#theme'] = 'follow_links_form';
$links = follow_links_load($uid);
$networks = follow_networks_load($uid, TRUE);
if (is_array($links)) {
foreach ($links as $name => $link) {
$title = $networks[$name]['title'];
$form['follow_links'][$name] = _follow_links_form_link($link, $title, $uid);
unset($networks[$name]);
}
}
foreach ($networks as $name => $info) {
$link = new stdClass();
$link->name = $name;
$form['follow_links'][$name] = _follow_links_form_link($link, $info['title'], $uid);
}
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
return $form;
}
function _follow_links_form_link($link, $title, $uid) {
$elements = array(
'#tree' => TRUE,
);
$elements['name'] = array(
'#value' => $title,
);
if (isset($link->lid)) {
$elements['lid'] = array(
'#type' => 'hidden',
'#value' => $link->lid,
);
$elements['weight'] = array(
'#type' => 'weight',
'#default_value' => $link->weight,
);
}
$elements['url'] = array(
'#type' => 'textfield',
'#follow_network' => $link->name,
'#follow_uid' => $uid,
'#default_value' => isset($link->url) ? $link->url : '',
'#element_validate' => array(
'follow_url_validate',
),
);
$elements['title'] = array(
'#type' => 'textfield',
'#default_value' => isset($link->title) ? $link->title : '',
'#size' => 15,
'#access' => user_access('change follow link titles') && !empty($link->url),
);
return $elements;
}
function follow_build_query(array $query, $parent = '') {
$params = array();
foreach ($query as $key => $value) {
$key = $parent ? $parent . '[' . $key . ']' : $key;
if (is_array($value)) {
$params[] = follow_build_query($value, $key);
}
elseif (!isset($value)) {
$params[] = $key;
}
else {
$params[] = $key . '=' . $value;
}
}
return implode('&', $params);
}
function follow_build_url($path, $options) {
$url = $path;
if (!empty($options['query'])) {
$url .= (strpos($path, '?') !== FALSE ? '&' : '?') . follow_build_query($options['query']);
}
if (!empty($options['fragment'])) {
$url .= '#' . $options['fragment'];
}
return $url;
}
function follow_parse_url($url) {
$parsed_url = parse_url($url);
$defaults = array(
'scheme' => '',
'host' => '',
'port' => '',
'path' => '/',
'query' => '',
'fragment' => '',
);
$parsed_url += $defaults;
$options = array(
'query' => array(),
'fragment' => $parsed_url['fragment'],
);
parse_str($parsed_url['query'], $options['query']);
if ($parsed_url['scheme']) {
$parsed_url['scheme'] .= '://';
}
$path = $parsed_url['scheme'] . $parsed_url['host'] . $parsed_url['path'];
return array(
'path' => $path,
'options' => $options,
);
}
function follow_build_url_regex($network_info) {
if (!empty($network_info['domain'])) {
return '@^https?://([a-z0-9\\-_.]+\\.|)' . str_replace('.', '\\.', $network_info['domain']) . '/@i';
}
return '@^[^:]+$@';
}
function follow_links_form_submit($form_id, $form_state) {
$links = $form_state['follow_links'];
foreach ($links as $name => $link) {
$link = (object) $link;
$link->url = trim($link->url);
if (empty($link->url)) {
if (isset($link->lid)) {
follow_link_delete($link->lid);
}
continue;
}
else {
$link->uid = $form_state['uid'];
$link->name = $name;
follow_link_save($link);
}
}
}
function theme_follow_links_form($form) {
$rows = array();
$disabled_rows = array();
foreach (element_children($form['follow_links']) as $key) {
$row = array();
if (isset($form['follow_links'][$key]['weight'])) {
$row[] = drupal_render($form['follow_links'][$key]['lid']) . drupal_render($form['follow_links'][$key]['name']);
$row[] = drupal_render($form['follow_links'][$key]['url']);
if (user_access('change follow link titles')) {
$row[] = drupal_render($form['follow_links'][$key]['title']);
}
$form['follow_links'][$key]['weight']['#attributes']['class'][] = 'follow-links-weight';
$row[] = drupal_render($form['follow_links'][$key]['weight']);
$rows[] = array(
'data' => $row,
'class' => array(
'draggable',
),
);
}
else {
$disabled_rows[] = array(
drupal_render($form['follow_links'][$key]['name']),
drupal_render($form['follow_links'][$key]['url']),
);
}
}
$header = array(
t('Name'),
t('URL'),
);
if (user_access('change follow link titles')) {
$header[] = t('Customized Name');
}
$header[] = t('Weight');
$disabled_header = array(
t('Name'),
t('URL'),
);
$output = '';
if (count($rows)) {
$output .= theme('table', $header, $rows, array(
'id' => 'follow-links-weighted-form',
));
}
if (count($disabled_rows)) {
$output .= theme('table', $disabled_header, $disabled_rows);
}
$output .= drupal_render($form);
return $output;
}
function follow_links_load($uid = 0) {
$links = array();
$sql = "SELECT * FROM {follow_links} WHERE uid = %d ORDER BY weight ASC";
$result = db_query($sql, $uid);
while ($link = db_fetch_object($result)) {
$link->options = unserialize($link->options);
$link->url = follow_build_url($link->path, $link->options);
$links[$link->name] = $link;
}
return $links;
}
function follow_link_save($link) {
$parsed = follow_parse_url($link->url);
$link->path = $parsed['path'];
$link->options = $parsed['options'];
$name = isset($link->name) ? $link->name : '';
$uid = isset($link->uid) ? $link->uid : 0;
$path = isset($link->path) ? $link->path : '';
$options = serialize(isset($link->options) ? $link->options : array());
$title = isset($link->title) ? $link->title : '';
$weight = isset($link->weight) ? $link->weight : 0;
if (isset($link->lid)) {
db_query("UPDATE {follow_links} set name = '%s', uid = %d, path = '%s', options = '%s', weight = %d, title = '%s' WHERE lid = %d", $name, $uid, $path, $options, $weight, $title, $link->lid);
}
else {
db_query("INSERT INTO {follow_links} (name, uid, path, options, weight, title) VALUES ('%s', %d, '%s', '%s', %d, '%s')", $name, $uid, $path, $options, $weight, $title);
}
return $link;
}
function follow_link_delete($lid) {
db_query('DELETE FROM {follow_links} WHERE lid = %d', $lid);
}
function follow_networks_load($uid, $reset = FALSE) {
static $networks = array();
if ($reset) {
$networks = array();
}
if (empty($networks[$uid])) {
$networks[$uid] = follow_default_networks($uid);
module_invoke_all('follow_networks_alter', $networks);
}
return $networks[$uid];
}
function follow_default_networks($uid) {
$networks = array(
'facebook' => array(
'title' => t('Facebook'),
'domain' => 'facebook.com',
),
'virb' => array(
'title' => t('Virb'),
'domain' => 'virb.com',
),
'myspace' => array(
'title' => t('MySpace'),
'domain' => 'myspace.com',
),
'twitter' => array(
'title' => t('Twitter'),
'domain' => 'twitter.com',
),
'picasa' => array(
'title' => t('Picasa'),
'domain' => 'picasaweb.google.com',
),
'flickr' => array(
'title' => t('Flickr'),
'domain' => 'flickr.com',
),
'youtube' => array(
'title' => t('YouTube'),
'domain' => 'youtube.com',
),
'vimeo' => array(
'title' => t('Vimeo'),
'domain' => 'vimeo.com',
),
'bliptv' => array(
'title' => t('blip.tv'),
'domain' => 'blip.tv',
),
'lastfm' => array(
'title' => t('last.fm'),
'domain' => 'last.fm',
),
'linkedin' => array(
'title' => t('LinkedIn'),
'domain' => 'linkedin.com',
),
'delicious' => array(
'title' => t('Delicious'),
'domain' => 'delicious.com',
),
'tumblr' => array(
'title' => t('Tumblr'),
'domain' => 'tumblr.com',
),
);
if ($uid == 0) {
$networks['this-site'] = array(
'title' => t('This site (RSS)'),
'domain' => '',
);
}
return $networks;
}