Jump to content

Twitter Feed (MarkupTwitterFeed)


ryan

Recommended Posts

About handling the display of images from a twitter feed, I did this today by adding code inside MarkupTwitterFeed.module. I post it here in case it could help other pw users having the same needs.

// To be added in public function renderItem, before: $out = $options['listItemOpen']; 

	if (isset($item['entities']['media'])) {
	    $mediaUrlField = wire('config')->https ? 'media_url_https' : 'media_url';
	    
	    foreach($item['entities']['media'] as $m) {
		if($options['listItemPhoto']) {
		    $photoHtml = str_replace(array('{src}', '{title}'), 
					     array(wire('sanitizer')->entities($m[$mediaUrlField]), 
                                                   wire('sanitizer')->entities($m['display_url'])), 
					     $options['listItemPhoto']); 
		    $text = preg_replace('!' . preg_quote($m['url'], '!') . '(\b|$)!i', $photoHtml, $text); 
		} else {
		    // Hide the media reference in the text
		    $text = preg_replace('!' . preg_quote($m['url'], '!') . '(\b|$)!i', '', $text); 
		}	
	    }
	}

where $options['listItemPhoto'] contains the html for a Twitter photo. For example, if you simply want to display the image, you can set it to:

$options['listItemPhoto'] = "<img src='{src}' title='{title}'>";

This will be rendered like in this screenshot:

post-2086-0-30680600-1425905381_thumb.pn

  • Like 4
Link to comment
Share on other sites

  • 1 month later...
  • 4 weeks later...

Had some time to look at the module and it looks like links were not in the original plan. Would require some editing of the module to allow links, especially as entities are converted. Will look at this when i have some time.

Link to comment
Share on other sites

  • 3 months later...

I tested adding this function to the module:

<?php
function convert_twitter_links($tweet)
{
	//converts URLs to active links
	$tweet = preg_replace('/((http)+(s)?:\/\/[^<>\s]+)/i', '<a href="$0" target="_blank">$0</a>', $tweet );

	//converts mentions (e.g. @stathisg) to active links, pointing to the user's twitter profile
	$tweet = preg_replace('/[@]+([A-Za-z0-9-_]+)/', '<a href="http://twitter.com/$1" target="_blank">$1</a>', $tweet );

	//converts hashtags (e.g. #test) to active links, pointing to a twitter's search URL
	$tweet = preg_replace('/[#]+([A-Za-z0-9-_]+)/', '<a href="http://twitter.com/search?q=%23$1" target="_blank">$0</a>', $tweet );
	return $tweet;
}

and then called it like this: 

$text = $this->convert_twitter_links($text); 

Though, I had to put this line just below this line (this is within renderItem() definition ):

$text = wire('sanitizer')->entities($text);

I will guess I must be doing something wrong here not sanitizing this string before rendering it, but I can't really tell, I don't know much about this "entities" methods, so I will recommend taking this solution as unsafe or something like that until someone else gives a hand :)

  • Like 1
Link to comment
Share on other sites

  • 1 month later...

Here's a working code example that doesn't use render and implements elabx's function mentioned above:

<ul>
	<?php

	$i = 0;
	$limit = 4;
	$t = $modules->get('MarkupTwitterFeed'); 

	function convert_links($tweet) {
		$tweet = preg_replace('/((http)+(s)?:\/\/[^<>\s]+)/i', '<a href="$0" target="_blank">$0</a>', $tweet );
		$tweet = preg_replace('/[@]+([A-Za-z0-9-_]+)/', '<a href="http://twitter.com/$1" target="_blank">$1</a>', $tweet );
		$tweet = preg_replace('/[#]+([A-Za-z0-9-_]+)/', '<a href="http://twitter.com/search?q=%23$1" target="_blank">$0</a>', $tweet );
		return $tweet;
	}

	foreach ($t as $tweet){
		if ($i < $limit){
			$text = convert_links($tweet['text']);			
			$timestamp = date('F j g:i a', strtotime($tweet['created_at']));
			echo '<li>'.$text.'<br><small>'.$timestamp.'</small></li>';
		}
		$i++;
	}

	?>
</ul>
  • Like 1
Link to comment
Share on other sites

A variant of the IF statement section from the above example that checks whether a Tweet is a retweet, and displays the appropriate author information.

if ($i < $limit){
	$text = convert_links($tweet['text']);
	$timestamp = date('F j g:i a', strtotime($tweet['created_at']));

	echo '<li>';

	if ($tweet['retweeted']){
		$author = $tweet['retweeted_status']['user']['name']; // Other Person
		$handle = $tweet['retweeted_status']['user']['screen_name']; // @otherPerson
		$text = substr($text, 3); // Removes 'RT ' from the beginning of the Tweet
	} else {
		$author = $tweet['user']['name']; // You
		$handle = $tweet['user']['screen_name']; // @you
	}

	echo $author.' @'.$handle.'<br>'.$text.'<br>'.$timestamp.'</li>';
}

Note that the above requires the following change to MarkupTwitterFeed.module (line 138) to work :

'trim_user' => false, // include user details, because user details are useful
  • Like 2
Link to comment
Share on other sites

  • 1 month later...
  • 1 month later...

Thank you Acturus, got this code working now!

But I'm experiencing another problem: I can't show more than 3 Tweets, even though I've  set the limit in the module to 4...

I'm also experiencing this in 3.0, I set the limit to 5 but it's showing 13. I guess it's ignoring the limit in 3.0? 

Link to comment
Share on other sites

  • 2 months later...

Hello,

I installed this module on a 3.0.12 devns site despite the fact that it is officially not compatible (yet?).

And it broke my backend theme which is  a custom admin theme based on the default theme with only very slight changes to the theme header and the content width.

I needed to manually delete my custom admin theme from the modules table in the DB to get a working backend again.

Finally, I downgraded the site to 2.7.2 so I can use the twitter markup module. Site is still under development and I don't really need all the new features from devns branch.

Has anyone else experienced problems with this module on 3.0.x?

Link to comment
Share on other sites

  • 1 month later...
  • 2 months later...

 @benbyf

I forked the module and added the functionality, you can find the module at github: https://github.com/flydev-fr/MarkupTwitterFeed

To search hashtag use it as the following :

$options = array(
    'searchQuery' => 'ProcessWire',
    'limit' => 3
);
$t = $modules->get('MarkupTwitterFeed');
$out =  $t->search($options);
echo $out;

The function search() act like render().

Thanks again for the suggestion (searching for hashtag). I think we can improve it a bit, let me know for any needs.

  • Like 6
Link to comment
Share on other sites

  • 2 months later...

Hello,

If you use this module, you may be interested by my fork https://github.com/jlj/MarkupTwitterFeed, that adds the following features to the official MarkupTweeterFeed module:

  • support of the recent Twitter extended tweet format (tweets longer than 140 chars);
  • support of emoji characters in tweets;
  • display of image in a tweet (only the first image is displayed in the curent version);
  • display of video in a tweet (with a html5 video markup);
  • for retweets, display of the original author and avatar in the tweet.

Also, it allows a more flexible per-item rendering, as in the following example:

$t = $modules->get('MarkupTwitterFeed');
$t->limit = 10; 

$renderOptions = array(
    'showDate' => 'before, after',
    'dateFormat' => __("M j, Y"), // Tweet block date format
    'listItemOpen' => "\n\t<div class='tweet-item'>",
    'listItemClose' => "</div>",
    'listItemText' => "<i class='fa fa-twitter'></i> <span class='tweet-text'>{text}</span>",
    'listItemDate' => " <div class='date'><i class='fa fa-calendar'></i> {date}</div>", 
    'listItemLink' => "<a rel='nofollow' href='{href}'>{url}</a>", 
    'videoAttributes' => "autoplay loop muted",
    'preserveLineBreaks' => 'coalesce',
);

foreach($t as $tweet) {
  echo $t->renderItem($tweet, $renderOptions);
}

Examples from my website:

Capture d’écran 2016-11-13 à 16.19.17.pngCapture d’écran 2016-11-13 à 16.19.50.png

This module has been tested with pw 2.7.2 only, so I cannot guarantee the proper working with 3.0… :-)

Hope this will be useful for others here.

  • Like 8
Link to comment
Share on other sites

22 minutes ago, netcarver said:

@jean-luc Nice. Any chance of issuing your updates as a pull request to the original repo?

Already done that (https://github.com/ryancramerdesign/MarkupTwitterFeed/pull/5), but the previous pull request I did for this same module in January 2015 has stayed unanswered, so I don't know if this one will be integrated…

  • Like 2
Link to comment
Share on other sites

  • 3 months later...
On 11/13/2016 at 10:16 AM, jean-luc said:

Already done that (https://github.com/ryancramerdesign/MarkupTwitterFeed/pull/5), but the previous pull request I did for this same module in January 2015 has stayed unanswered, so I don't know if this one will be integrated…

Thanks for this very useful fork! It would be rad if it integrated @flydev 's fork too for hashtag search!

  • Like 3
Link to comment
Share on other sites

  • 1 month later...

Jean Luc, 

I have installed your fork on Processwire 3.0.42 and get the following error:

Parse error: syntax error, unexpected 'site' (T_STRING), expecting ',' or ')'

File: .../modules/MarkupTwitterFeed/tmhOAuth/tmhOAuth.php:14

 *
 5:     * An OAuth library written in PHP.
 6:     * The library supports file uploading using multipart/form as well as general
 7:     * REST requests. OAuth authentication is sent using an Authorization Header.
 8:     *
 9:     * @author themattharris
10:     * @version 0.8.4
11:     *
12:     * 06 Aug 2014
13:     */
14:    defined('\ProcessWire\wire("config")->paths->root . 'site/modules/MarkupTwitterFeed/tmhOAuth'') or define('\ProcessWire\wire("config")->paths->root . 'site/modules/MarkupTwitterFeed/tmhOAuth'', dirname(\ProcessWire\wire("config")->paths->root . 'site/modules/MarkupTwitterFeed/tmhOAuth/tmhOAuth.php'));
15:    
16:    class tmhOAuth {
17:      const VERSION = '0.8.4';
18:      var $response = array();

Any ideas how to get around this? I upgrade your module over the one from Ryan. 

 

Thanks

Link to comment
Share on other sites

3 hours ago, erikvanberkum said:

I have installed your fork on Processwire 3.0.42 and get the following error:

Parse error: syntax error, unexpected 'site' (T_STRING), expecting ',' or ')'

File: .../modules/MarkupTwitterFeed/tmhOAuth/tmhOAuth.php:14

Any ideas how to get around this? I upgrade your module over the one from Ryan. 


14:    defined('\ProcessWire\wire("config")->paths->root . 'site/modules/MarkupTwitterFeed/tmhOAuth'') or define('\ProcessWire\wire("config")->paths->root . 'site/modules/MarkupTwitterFeed/tmhOAuth'', dirname(\ProcessWire\wire("config")->paths->root . 'site/modules/MarkupTwitterFeed/tmhOAuth/tmhOAuth.php'));

 

Hi @erikvanberkum

I have not tried the MarkupTwitterFeed module with Processwire 3, but I can tell what caused the error here:

Actually the original tmhOAuth.php:14 is:

defined('__DIR__') or define('__DIR__', dirname(__FILE__));

This code makes the (visibly wrong here) assumption that PHP magic constant __DIR__ is not expanded when placed between single quotes. Here, __DIR__  was replaced by its value (a  PHP expression) at compile time, and the surrounding quotes around it cause a syntax error.

To solve this, you can simply comment or remove line 14 in tmhOAuth.php. Doing so which should be perfectly safe because __DIR__ is defined (probably by processwire), and so the check is not needed. :)

[Edit] __DIR__ is available since PHP 5.3.0, so with Processwire 3.x requiring PHP version 5.3.8 or higher, it is actually safe to delete line 14 of tmhOAuth.php.

Hope this helps.

Link to comment
Share on other sites

Hi @ryan

 

I've been implementing the module in a project and first of all, it's a really nice module!

I have just 1 consideration, you have text for the most basic items (date, link, etc) but the text from the tweet is formatted without an HTML tag for example <p></p>.
Maybe it is possible to implement this? Then it would be possible to style the text itself better.

Link to comment
Share on other sites

  • 5 months later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...