You are here

socialfeed.block.inc in Social Feed 7.2

File include for Social Feed module.

File

socialfeed.block.inc
View source
<?php

/**
 * @file
 * File include for Social Feed module.
 */

/**
 * Return HTML with posts.
 *
 * @param string $provider
 *   Accepts string as value.
 *
 * @return string
 *   Returns string.
 *
 * @throws \Exception
 */
function socialfeed_posts_render($provider) {
  $fn = 'socialfeed_' . $provider . '_posts';
  $message_feed = call_user_func($fn);
  return theme('socialfeed_' . $provider, [
    $provider => $message_feed,
  ]);
}

/**
 * Rendering values from the Facebook feed.
 *
 * @param int $i
 *   Accepts int as value.
 * @param string $facebook_entry
 *   Accepts string as value.
 * @param bool $display_all_posts
 *   Accepts bool as value.
 * @param bool $display_time
 *   Accepts bool as value.
 * @param bool $display_pic
 *   Accepts bool as value.
 * @param bool $display_video
 *   Accepts bool as value.
 * @param string $teaser_text
 *   Accepts string as value.
 * @param string $facebook_hash_tag
 *   Accepts string as value.
 *
 * @return mixed
 *   Returns mixed.
 */
function socialfeed_facebook_data($i, $facebook_entry, $display_all_posts, $display_time, $display_pic, $display_video, $teaser_text, $facebook_hash_tag) {
  $trim_length = variable_get('socialfeed_facebook_trim_length');
  if (array_key_exists('message', $facebook_entry)) {
    if (isset($facebook_entry['full_picture']) && $display_all_posts == 0) {
      if ($display_pic == 1) {
        $message_feed['full_picture'] = $facebook_entry['full_picture'];
      }
    }
    if (isset($facebook_entry['source']) && $display_all_posts == 0) {
      if ($display_video == 1) {
        $message_feed['video'] = $facebook_entry['source'];
      }
    }
    if (isset($facebook_entry['message'])) {
      if (isset($trim_length) && !empty($trim_length)) {
        $trimmed_message = substr($facebook_entry['message'], 0, $trim_length);
        $message_feed['message'] = $trimmed_message;
      }
      else {
        $message_feed['message'] = substr($facebook_entry['message'], 0, 200);
      }
    }
    if (isset($teaser_text) && !empty($teaser_text) && isset($facebook_entry['permalink_url'])) {
      $message_feed['full_feed_link'] = l(t('@teaser_text', [
        '@teaser_text' => $teaser_text,
      ]), $facebook_entry['permalink_url'], [
        'attributes' => [
          'target' => '_blank',
        ],
      ]);
    }
    else {
      $message_feed['full_feed_link'] = t('@teaser_text', [
        '@teaser_text' => $teaser_text,
      ]);
    }
    if ($facebook_hash_tag == 1) {
      $message_feed['message'] = preg_replace_callback('/#(\\w+)/', function ($hash) {
        return l($hash[0], 'https:facebook.com/hashtag/' . $hash[1], [
          'attributes' => [
            'target' => '_blank',
          ],
        ]);
      }, $message_feed['message']);
    }
    if ($display_time == 1) {
      $formatted_date = new DateTime($facebook_entry['created_time']);
      $message_feed['created_stamp'] = $formatted_date
        ->format(variable_get('socialfeed_facebook_time_format'));
    }
  }
  else {
    if (isset($facebook_entry['full_picture']) && $display_all_posts == 0) {
      if ($display_pic == 1) {
        $message_feed['full_picture'] = $facebook_entry['full_picture'];
      }
    }
    if (isset($facebook_entry['source']) && $display_all_posts == 0) {
      if ($display_video == 1) {
        $message_feed['video'] = $facebook_entry['source'];
      }
    }
    if (isset($facebook_entry['message']) && !empty($facebook_entry['message'])) {
      $message_feed['message'] = substr($facebook_entry['message'], 0, variable_get('socialfeed_facebook_trim_length'));
    }
    if (isset($teaser_text) && !empty($teaser_text) && isset($facebook_entry['permalink_url'])) {
      $message_feed['full_feed_link'] = l(t('@teaser_text', [
        '@teaser_text' => $teaser_text,
      ]), $facebook_entry['permalink_url'], [
        'attributes' => [
          'target' => '_blank',
        ],
      ]);
    }
    else {
      $message_feed['full_feed_link'] = t('@teaser_text', [
        '@teaser_text' => $teaser_text,
      ]);
    }
  }
  return $message_feed;
}

/**
 * Returns HTML with feeds in required format.
 *
 * @param string $page_name
 *   Accepts string as value.
 *
 * @return array
 *   Returns Facebook Feed.
 *
 * @throws \Exception
 */
function socialfeed_facebook_feeds($page_name = '') {
  global $user;
  $selected_type_value = $config = $message_feed = [];
  $display_time = $display_pic = $display_video = $display_all_posts = $teaser_text = $facebook_hash_tag = $selected_type = $selected_type_key = $fb_type = $selected_type_value = $url = $request = '';
  $config['app_id'] = variable_get('socialfeed_facebook_app_id');
  $config['secret'] = variable_get('socialfeed_facebook_secret_key');
  $config['page_name'] = variable_get('socialfeed_facebook_page_name');
  $config['user_token'] = variable_get('socialfeed_facebook_user_token');
  if (isset($config['app_id']) && !empty($config['app_id']) && isset($config['secret']) && !empty($config['secret'])) {
    $uri = "https://graph.facebook.com/v4.0/oauth/access_token?grant_type=fb_exchange_token&client_id={$config['app_id']}&client_secret={$config['secret']}&fb_exchange_token={$config['user_token']}";
    $response = drupal_http_request($uri);
    $json_decode = json_decode($response->data);
    $long_token = $json_decode->access_token;
    $uri = "https://graph.facebook.com/v4.0/me?access_token={$long_token}";
    $response = drupal_http_request($uri);
    $json_decode = json_decode($response->data);
    $account_id = $json_decode->id;
    $uri = "https://graph.facebook.com/v4.0/{$config['page_name']}?fields=id&access_token={$long_token}";
    $response = drupal_http_request($uri);
    $json_decode = json_decode($response->data);
    $page_id = $json_decode->id;
    $uri = "https://graph.facebook.com/v4.0/{$account_id}/accounts?access_token={$long_token}";
    $response = drupal_http_request($uri);
    $json_decode = json_decode($response->data);
    foreach ($json_decode->data as $response_data) {
      if ($response_data->id == $page_id) {
        variable_set('page_permanent_token', $response_data->access_token);
      }
    }
    $page_permanent_token = variable_get('page_permanent_token');
    $uri = "https://graph.facebook.com/v4.0/{$page_id}/feed?access_token={$page_permanent_token}&fields=permalink_url,message,created_time,picture,status_type";
    $response = drupal_http_request($uri);
    if ($response->status_message && $response->status_message == "OK") {
      $display_time = variable_get('socialfeed_facebook_time_stamp');
      $display_pic = variable_get('socialfeed_facebook_display_pic');
      $display_video = variable_get('socialfeed_facebook_display_video');
      $display_all_posts = variable_get('socialfeed_facebook_all_types');
      $teaser_text = variable_get('socialfeed_facebook_teaser_text');
      $facebook_hash_tag = variable_get('socialfeed_facebook_hashtag');
      $selected_type = variable_get('socialfeed_facebook_post_type');

      // @TODO: Check why this is used?
      $selected_type_key = $selected_type;
      $fb_type = [
        'permalink_url',
        'photo',
        'status',
        'video',
      ];
      if (isset($selected_type_key)) {
        $selected_type_value = $fb_type[$selected_type_key];
      }
      $i = 0;
      $post_type_filter = $next_post_type_filter = [];
      $json_response = drupal_json_decode($response->data);
      if (isset($json_response['data']) && !empty($json_response['data'])) {
        foreach ($json_response['data'] as $facebook_value) {

          // If specific post type is selected.
          if ($display_all_posts == 0 && isset($facebook_value['type']) && $facebook_value['type'] == $selected_type_value) {
            $post_type_filter[$facebook_value['type']][] = $facebook_value;
          }
          elseif ($display_all_posts == 1) {
            $message_feed[] = socialfeed_facebook_data($i, $facebook_value, $display_all_posts, $display_time, $display_pic, $display_video, $teaser_text, $facebook_hash_tag);
            $i++;
            if ($i == variable_get('socialfeed_facebook_no_feeds')) {
              break;
            }
          }
        }
      }

      // Showcase of array of specific post type feeds.
      if (array_key_exists($selected_type_value, $post_type_filter)) {
        foreach ($post_type_filter[$selected_type_value] as $facebook_entry) {
          $message_feed[] = socialfeed_facebook_data($i, $facebook_entry, $display_all_posts, $display_time, $display_pic, $display_video, $teaser_text, $facebook_hash_tag);
          $i++;
          if ($i == variable_get('socialfeed_facebook_no_feeds')) {
            break;
          }
        }
        $existing_feeds = count($post_type_filter[$selected_type_value]);
        $remaining = variable_get('socialfeed_facebook_no_feeds') - $existing_feeds;
        if ($existing_feeds < variable_get('socialfeed_facebook_no_feeds')) {
          $i = 0;
          $pager_next = $json_response['paging']['next'];
          $next_page_json = file_get_contents($pager_next);
          $next_page = json_decode($next_page_json);
          foreach ($next_page->data as $next_facebook_value) {
            if ($display_all_posts == 0 && $next_facebook_value->type == $selected_type_value) {
              $next_post_type_filter[$next_facebook_value->type][] = $next_facebook_value;
            }
          }
          if (array_key_exists($selected_type_value, $next_post_type_filter)) {
            foreach ($next_post_type_filter[$selected_type_value] as $facebook_entry) {
              $message_feed[] = socialfeed_facebook_data($i, $facebook_entry, $display_all_posts, $display_time, $display_pic, $display_video, $teaser_text, $facebook_hash_tag);
              $i++;
              if ($i == $remaining) {
                break;
              }
            }
          }
        }
      }
      else {
        if (empty($message_feed)) {
          drupal_set_message(t('No related posts'), 'error');
        }
      }
      return $message_feed;
    }
    else {
      drupal_set_message(t('The access_token provided is invalid.'), 'error');
    }
  }
  else {
    if (in_array('administrator', array_values($user->roles))) {
      drupal_set_message(t('Please provide your Facebook credentials <a href="@facebook">here</a>.', [
        '@facebook' => url('admin/config/services/socialfeed'),
      ]), 'warning');
    }
    else {
      drupal_set_message(t('Please login to provide Facebook App values <a href="@facebook">here</a>.', [
        '@facebook' => url('user'),
      ]), 'error');
    }
  }
}

/**
 * Uses socialfeed_facebook_posts() for fetching Facebook feeds.
 */
function socialfeed_facebook_posts() {
  $facebook_latest = socialfeed_facebook_feeds(variable_get('socialfeed_facebook_page_name'));
  return $facebook_latest;
}

/**
 * Uses socialfeed_twitter_posts() for fetching Twitter tweets.
 *
 * @return array
 *   Returns Twitter Feed.
 *
 * @throws \Exception
 */
function socialfeed_twitter_posts() {
  $twitter_tweets = [];
  $tweets_count = variable_get('socialfeed_twitter_tweets_count');
  $twitter_username = variable_get('socialfeed_twitter_username');
  $display_time = variable_get('socialfeed_twitter_time_stamp');
  $display_date_twitter_style = variable_get('socialfeed_twitter_time_ago');
  $twitter_hash_tag = variable_get('socialfeed_twitter_hashtag');
  $teaser_text = variable_get('socialfeed_twitter_teaser_text');
  $twitter_consumer_key = variable_get('socialfeed_twitter_consumer_key');
  $twitter_consumer_secrete = variable_get('socialfeed_twitter_consumer_secret');

  // Authentication Parameters.
  $api_key = urlencode($twitter_consumer_key);
  $api_secret = urlencode($twitter_consumer_secrete);
  $auth_url = 'https://api.twitter.com/oauth2/token';
  if (!empty($api_key) && !empty($api_secret)) {

    // What we want?
    $data_username = $twitter_username;
    $data_count = $tweets_count;
    $data_url = 'https://api.twitter.com/1.1/statuses/user_timeline.json';

    // Get API Access Token.
    $api_credentials = base64_encode($api_key . ':' . $api_secret);
    $auth_headers = 'Authorization: Basic ' . $api_credentials . "\r\n" . 'Content-Type: application/x-www-form-urlencoded;charset=UTF-8' . "\r\n";
    $auth_context = stream_context_create([
      'http' => [
        'header' => $auth_headers,
        'method' => 'POST',
        'content' => http_build_query([
          'grant_type' => 'client_credentials',
        ]),
      ],
    ]);
    $auth_response = json_decode(file_get_contents($auth_url, 0, $auth_context), TRUE);
    $auth_token = $auth_response['access_token'];

    // Get Tweets.
    $data_context = stream_context_create([
      'http' => [
        'header' => 'Authorization: Bearer ' . $auth_token . "\r\n",
      ],
    ]);
    $twitter_values = json_decode(file_get_contents($data_url . '?count=' . $data_count . '&tweet_mode=extended&screen_name=' . urlencode($data_username), 0, $data_context), TRUE);

    // Results - Do what you want!
    foreach ($twitter_values as $key => $twitter_value) {
      $twitter_tweets[$key]['username'] = $twitter_value['user']['screen_name'];
      $twitter_tweets[$key]['full_username'] = 'http://twitter.com/' . $twitter_value['user']['screen_name'];
      preg_match_all('#\\bhttps?://[^\\s()<>]+(?:\\([\\w\\d]+\\)|([^[:punct:]\\s]|/))#', $twitter_value['full_text'], $extra_links);
      foreach ($extra_links[0] as $extra_link) {
        $twitter_tweets[$key]['extra_links'][] = $extra_link;
      }
      if (isset($twitter_value['full_text'])) {
        if (!empty($extra_link)) {
          $twitter_tweets[$key]['tweet'] = substr(rtrim($twitter_value['full_text'], $extra_link), 0, variable_get('socialfeed_twitter_trim_length'));
        }
        else {
          $twitter_tweets[$key]['tweet'] = substr(rtrim($twitter_value['full_text']), 0, variable_get('socialfeed_twitter_trim_length'));
        }
      }
      if (isset($teaser_text) && !empty($teaser_text)) {
        if (array_key_exists('media', $twitter_value['entities'])) {
          $twitter_tweets[$key]['tweet_url'] = l(t('@teaser_text', [
            '@teaser_text' => $teaser_text,
          ]), $twitter_value['entities']['media'][0]['url'], [
            'attributes' => [
              'target' => '_blank',
            ],
          ]);
        }
      }
      if (!empty($twitter_value['entities']['media'])) {
        $twitter_tweets[$key]['media'] = $twitter_value['entities']['media'];
      }
      if ($display_time == 1) {
        $formatted_twitter_date = new DateTime($twitter_value['created_at']);
        $reflection_object = new ReflectionObject($formatted_twitter_date
          ->setTimezone(new DateTimeZone(drupal_get_user_timezone())));
        $get_property = $reflection_object
          ->getProperty('date');
        $date = $get_property
          ->getValue($formatted_twitter_date);
        if ($display_date_twitter_style == 1) {
          $twitter_tweets[$key]['twitter_date'] = socialfeed_time_elapsed_string($date);
        }
        else {
          $twitter_tweets[$key]['twitter_date'] = $formatted_twitter_date
            ->format(variable_get('socialfeed_twitter_time_format'));
        }
      }
      if ($twitter_hash_tag == 1) {
        $twitter_tweets[$key]['tweet'] = preg_replace_callback('/#(\\w+)|@(\\w+)/', function ($hash) {
          if ($hash[0][0] == '#') {
            return l($hash[0], '//twitter.com/hashtag/' . $hash[1], [
              'attributes' => [
                'target' => '_blank',
              ],
            ]);
          }
          if ($hash[0][0] == '@') {
            return l($hash[0], '//twitter.com/' . $hash[2], [
              'attributes' => [
                'target' => '_blank',
              ],
            ]);
          }
        }, $twitter_tweets[$key]['tweet']);
      }
    }
    return $twitter_tweets;
  }
  drupal_set_message(t('Please provide your Twitter credentials <a href="@twitter">here</a>.', [
    '@twitter' => url('admin/config/services/socialfeed/twitter'),
  ]), 'warning');
  return [];
}

/**
 * Displays date in Twitter format.
 *
 * @param string $datetime
 *   Accepts string as value.
 * @param bool $full
 *   Accepts bool as value.
 *
 * @return string
 *   Returns string.
 */
function socialfeed_time_elapsed_string($datetime, $full = FALSE) {
  $now = new DateTime();
  $ago = new DateTime($datetime);
  $diff = $now
    ->diff($ago);
  $diff->w = floor($diff->d / 7);
  $diff->d -= $diff->w * 7;
  $string = [
    'y' => 'year',
    'm' => 'month',
    'w' => 'week',
    'd' => 'day',
    'h' => 'hour',
    'i' => 'minute',
    's' => 'second',
  ];
  foreach ($string as $k => &$v) {
    if ($diff->{$k}) {
      $v = $diff->{$k} . ' ' . t($v . ($diff->{$k} > 1 ? 's' : ''));
    }
    else {
      unset($string[$k]);
    }
  }
  if (!$full) {
    $string = array_slice($string, 0, 1);
  }
  return $string ? t("@time ago", [
    '@time' => implode(', ', $string),
  ]) : t('just now');
}

/**
 * Uses socialfeed_instagram_posts() for fetching instagram pictures.
 *
 * @return array
 *   Returns Instagram Feed.
 *
 * @throws \Exception
 */
function socialfeed_instagram_posts() {
  $i = 0;
  $images = $pic = [];
  $instagram_post_link = variable_get('socialfeed_instagram_post_link');
  $access_token = variable_get('socialfeed_instagram_access_token');
  $limit = variable_get('socialfeed_instagram_picture_count');
  $url = SOCIALFEED_INSTAGRAM_GRAPH_URL . '&limit=' . $limit . '&access_token=' . $access_token;
  $request = drupal_http_request($url);
  $status = strtoupper($request->status_message);
  if ($status == 'OK') {
    if (isset($access_token) && !empty($access_token)) {
      $json_response = drupal_json_decode($request->data);
      foreach ($json_response['data'] as $key => $response_data) {
        if ($instagram_post_link == 1) {
          $images[$key]['media_url'] = $response_data['media_url'];
          $images[$key]['permalink'] = $response_data['permalink'];
        }
        $pic[] = $response_data['media_url'];
        $i++;
        if ($i == $limit) {
          break;
        }
      }
      return $images;
    }
    else {
      drupal_set_message(t('The access_token provided is invalid.'), 'error');
    }
  }
  else {
    drupal_set_message(t('Please provide your Instagram credentials <a href="@instagram">here</a>.', [
      '@instagram' => url('admin/config/services/socialfeed/instagram'),
    ]), 'warning');
  }
}

Functions

Namesort descending Description
socialfeed_facebook_data Rendering values from the Facebook feed.
socialfeed_facebook_feeds Returns HTML with feeds in required format.
socialfeed_facebook_posts Uses socialfeed_facebook_posts() for fetching Facebook feeds.
socialfeed_instagram_posts Uses socialfeed_instagram_posts() for fetching instagram pictures.
socialfeed_posts_render Return HTML with posts.
socialfeed_time_elapsed_string Displays date in Twitter format.
socialfeed_twitter_posts Uses socialfeed_twitter_posts() for fetching Twitter tweets.