Jump to:

10928 Posts in 2612 Topics by 1809 members

All other Modules

SilverStripe Forums » All other Modules » Recent Tweets + Blog function - already working

Discuss all other Modules here.

Moderators: martimiz, Sean, biapar, Willr, Ingo, swaiba, simon_w

Page: 1
Go to End
Author Topic: 417 Views
  • borriej
    Avatar
    Community Member
    267 Posts

    Recent Tweets + Blog function - already working Link to this post

    If someone wants this code, or wants to build a nice module with it.. go ahead.
    I wanted a function that shows the the most recent blog-entry's + latest tweets. Sort them on date and limit them to 5.

    class Homepage_Controller extends Page_Controller {
          
       function twitterStatusUrlConverter($status,$targetBlank=true,$linkMaxLen=250){
        // The target
        $target=$targetBlank ? " target=\"_blank\" " : "";
          // convert link to url
          $status = preg_replace("/((http:\/\/|https:\/\/)[^ )
       ]+)/e", "'<a href=\"$1\" title=\"$1\" $target >'. ((strlen('$1')>=$linkMaxLen ? substr('$1',0,$linkMaxLen).'...':'$1')).'</a>'", $status);
          // convert @ to follow
          $status = preg_replace("/(@([_a-z0-9\-]+))/i","<a href=\"http://twitter.com/$2\" title=\"Follow $2\" $target >$1</a>",$status);
          // convert # to search
          $status = preg_replace("/(#([_a-z0-9\-]+))/i","<a href=\"http://search.twitter.com/search?q=%23$2\" title=\"Search $1\" $target >$1</a>",$status);
          // return the status
          return $status;
       }

       function NewsTwitter(){
          /* twitter */
          $username = 'lancearmstrong';
          $tweet_count = '5';
          $url = 'https://api.twitter.com/1/statuses/user_timeline.json?screen_name=' . $username . '&count=' . $tweet_count . '&include_entities=1&include_rts=1';
          //https://api.twitter.com/1/statuses/user_timeline.json?screen_name=robvaneckdesign&count=10&include_entities=1&include_rts=1
          $server = $_SERVER["SERVER_NAME"];
          $cache_path = "/public/sites/$server/silverstripe-cache/twitter/twitter";
          $cache_time = filemtime($cache_path);
          $cache_time_plus = $cache_time+300;
          $now = time();
          /*
          var_dump($server);
          var_dump($cache_path);
          var_dump($cache_time);
          var_dump($cache_time_plus);
          var_dump($now);
          */
          if ($now < $cache_time_plus){
             $data = file_get_contents($cache_path);
             //var_dump('difference < 5 min - use cache file');
          }else{
             $ch = curl_init();//Initialise CURL
             curl_setopt($ch, CURLOPT_HEADER, 0);
             curl_setopt($ch, CURLOPT_URL, $url);//Set the url
             curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);//We want the data to return
             curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 10);//Of course, we don't want your script to run forever, so set a timeout
             $data = curl_exec($ch);//Execute and get the page
             curl_close($ch);//Close curl connection
             $cachefile = fopen($cache_path, 'wb');
             fwrite($cachefile, $data);
             fclose($cachefile);
             //var_dump('difference > 5 min - update cache file');
          }
          $json = json_decode($data); //Decode the json   
          /*
          var_dump ($url);      
          var_dump ($data);
          var_dump ($json);
          */
          $twitterOutput = new DataObjectSet();
          foreach($json as $tweet){
             $datetime = $tweet->created_at;
             //$date = date('M d, Y', strtotime($datetime));
             //$time = date('g:ia', strtotime($datetime));
             $ss_datetime = date('Y-m-d H:i:s', strtotime($datetime));;
             $date = date('d M', strtotime($datetime));
             $tweet_text = $tweet->text;
             $tweet_text = $this->twitterStatusUrlConverter($tweet_text);
             $tweet_link = "http://twitter.com/".$tweet->user->id."/status/".$tweet->id_str;
             
             $twitterOutput->push(
                new ArrayData(
                   array(
                      'Title' => $tweet_text,
                      'Date' => $ss_datetime,
                      'Tweet' => true,
                      'Posted' => $date,
                      'Link' => $tweet_link,
                   )
                )
             );
          }

          /* news */
          $newsOutput = new DataObjectSet();
          $blogentrys = DataObject::get('BlogEntry');
          $newsOutput->merge($blogentrys);
          
          /* merge twitter + news */
          $Output = new DataObjectSet();
          $Output->merge($twitterOutput);
          $Output->merge($newsOutput);
          $Output->sort('Date', 'DESC');
          $OutputLimited = $Output->getRange(0, 5);
          return $OutputLimited;
       }

    in your template you can use:

    <% if NewsTwitter %>
    <ul id="NewsTwitter">
    <% control NewsTwitter %>
    <% if Tweet %>
    <li class="newsItem clickable tweet <% if Last %>last<% end_if %>" data-url="$Link">
    <span class="date">$Posted | </span><span class="msg">$Title</span><span class="arrow"></span>
    <noscript><br /><a href="$Link" class="arrow" ><small>Lees meer</small></a></noscript>
    </li>
    <% else %>
    <li class="newsItem clickable web <% if Last %>last<% end_if %>" data-url="$Link" data>
    <span class="date">$Date.FormatI18N(%e %b) | </span> <span class="msg">$Title</span><span class="arrow"></span>
    <noscript><br /><a href="$Link" class="arrow" ><small>Lees meer</small></a></noscript>
    </li>
    <% end_if %>
    <% end_control %>
    </ul>
    <% end_if %>

    417 Views
Page: 1
Go to Top

Want to know more about the company that brought you SilverStripe? Then check out SilverStripe.com

Comments on this website? Please give feedback.