*

Offline Jo

  • *****
  • 232
  • Geschlecht: Männlich
    • JoLichter.de
MODx Twitter Feed
« am: 13. Januar 2013, 18:43:20 »
Hinweis: Twitter hat seine API v1 am 11. Juni 2013 abgeschaltet (LINK) - leider unterstützt die API v1.1 nur noch JSON und kein RSS-Feed :mad:



Hallo hier stelle ich euch mein
Fading Twitter Feed Ticker
für MODx (benötigt jQuery für das Fading) per cURL und SimpleXML vor

Sollte auch mit file_get_contents funktionieren (ungetestet).

Snippet 'TwitterFeed'
<?php
# V 13.02.003
#
# Mit PHP5 direkt Twitter-XML-Dateien (RSS-Feed) verarbeiten
# Benötigt ein aktiviertes allow_url_fopen oder ein installiertes cURL-Modul!
#
# http://api.twitter.com/1/statuses/user_timeline.rss?screen_name=[DeinTwitterAccount]
#
# Beispiel Chunk Aufruf:
# [[!$TwitterFeed? &TWaccount=`twitter` &TWcount=`10` &TWfading=`5000` &TWtpl=`tplTwitterFeed`]]
#
#
# Variablen -Start------------------->
   $intCount $modx->getOption('limit',$scriptProperties,10);
   $strAccount $modx->getOption('account',$scriptProperties,'twitter');
   $strTargetURL='http://api.twitter.com/1/statuses/user_timeline.rss?screen_name='.$strAccount;
           
$tpl $modx->getOption('tpl',$scriptProperties,'tplTwitterFeed');
           
$intFading $modx->getOption('fading',$scriptProperties,5000);
# Variablen -Ende-------------------<
#
#
# Methode zum abholen der Daten wählen -Start------------------->
if (function_exists('curl_version')) {
# mit cURL XML Daten von Twitter holen
$strArray = array('Accept-Language: '.$_SERVER["HTTP_ACCEPT_LANGUAGE"]);
$ch curl_init();
curl_setopt($chCURLOPT_URL$strTargetURL);
curl_setopt($chCURLOPT_HTTPHEADER$strArray);
curl_setopt($chCURLOPT_CONNECTTIMEOUT4);
curl_setopt($chCURLOPT_RETURNTRANSFERTRUE);
$feed curl_exec($ch);
$intReturnCode curl_getinfo($chCURLINFO_HTTP_CODE); 
curl_close($ch);
# prüfe ob die Seite erreichbar ist!
if ($intReturnCode != 200 && $intReturnCode != 302 && $intReturnCode != 304) { return 'ERROR RSS-Feed'; };
}
else if (
file_get_contents(__FILE__) && ini_get('allow_url_fopen')) {
# mit file_get_contents XML Daten holen
$feed file_get_contents($strTargetURL);
}
else
{
    return 
'Weder cURL installiert, noch allow_url_fopen aktiviert!';
}
# Methode zum abholen der Daten wählen -Ende-------------------<


# konvertiert in UTF-8
$feed utf8_encode($feed); 

# Feed als neue SimpleXML Element aufsetzen
$xml = new SimpleXmlElement($feed);

# Namensraum deklarieren
$xml->registerXPathNamespace('twitter''http://api.twitter.com/');
#print_r($xml);
#print $xml->asXML();


$title $xml->xpath('//channel/item/title');
$description $xml->xpath('//channel/item/description');
$pubDate $xml->xpath('//channel/item/pubDate');
$guid $xml->xpath('//channel/item/guid');
$link $xml->xpath('//channel/item/link');


# Platzhalter -Start------------------->
$modx->setPlaceholder('TWaccount'$strAccount);
$modx->setPlaceholder('TWtpl'$tpl);
$modx->setPlaceholder('TWfading'$intFading);

        
$intCount $intCount#(limitiert die Ausgabe)

    
for($i=1$i <= $intCount$i++) {

$modx->setPlaceholder('TWcount'$i);
$modx->setPlaceholder('TWtitle'.$itrim($title[$i]));
$modx->setPlaceholder('TWdescription'.$itrim($description[$i]));
$modx->setPlaceholder('TWpubDate'.$itrim($pubDate[$i]));
$modx->setPlaceholder('TWguid'.$itrim($guid[$i]));
$modx->setPlaceholder('TWlink'.$itrim($link[$i]));

        
$output.= $modx->parseChunk($tpl$modx->placeholders'[[+'']]'); 
    }
# Platzhalter -Ende-------------------<

return $output;



Snippet 'twitterFilter' um den Twitter Namen zu entfernen
<?php
// strip the twitter username

$input preg_replace('@(http?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@''$1'$input);
$intLen strlen($modx->getPlaceholder('TWaccount')) + 1;
return 
substr($input,$intLen);



Snippet 'twitterParser' um die URLs zu formatieren
<?php
// properly formatted URLs

$input preg_replace("#(^|[\n ])([\w]+?://[\w]+[^ \"\n\r\t< ]*)#""\\1<a href=\"\\2\" target=\"_blank\">\\2</a>"$input);
$input preg_replace("#(^|[\n ])((www|ftp)\.[^ \"\t\n\r< ]*)#""\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>"$input);
$input preg_replace("/@(\w+)/""<a href=\"http://twitter.com/\\1\" target=\"_blank\">@\\1</a>"$input);
$input preg_replace("/#(\w+)/""<a href=\"http://search.twitter.com/search?q=\\1\" target=\"_blank\">#\\1</a>"$input);
 
return 
$input;



Chunk 'TwitterFeed' mit Fading (jQuery) und das Snippet getCache zum Cachen (alle 30 Minuten)
<div id="div_twitter">
<h2>Tweets</h2>
<ul id="tweet">
               [[!getCache?
                  &element=`TwitterFeed`
                  &cacheExpires=`1800`
                  &account=`[[+TWaccount]]`
                  &limit=`[[+TWcount]]`
                  &fading=`[[+TWfading]]`
                  &tpl=`[[+TWtpl]]`]]
</ul>
<p style="text-align: center;">
<img style="float:left; margin:2px 2px 10px 20px;" src="assets/templates/tmp_jolichter/images/twitter_32x26.png" alt="@Twitter" width="20" height="16" />
<a title="Folge [[+TWaccount]] auf Twitter" href="http://twitter.com/[[+TWaccount]]" rel="nofollow" target="_blank">Folge auf Twitter</a>
</p>
</div>



<script type="text/javascript">
<!--
$(document).ready(function(){
var tweets = $("#tweet li");
showt(tweets);
})
var n = 0;
function showt(jq){
jq.eq(n).fadeIn(1000).delay([[+TWfading]]).fadeOut(1000, function(){
n++;
if (n == [[+TWcount]]) { n = 0; };
showt(jq);
});
}
//-->
</script>
Danke Joe Molloy für den Tipp!



Chunk 'tplTwitterFeed'
<li><p>
[[+TWtitle[[+TWcount]]:twitterFilter:twitterParser]]
<br /><br />
<span class="smallfont" style="float:right;"><a href="[[+TWlink[[+TWcount]]]]" target="_blank">[[+TWpubDate[[+TWcount]]:ago]]</a></span>
</p></li>



Ein wenig CSS und fertig  :biggrin:
.tweet{word-wrap:break-word;} #tweet{min-height:120px; position:relative;} #tweet li{display:none;}


Aufgerufen wird der Feed dann einfach so:
[[!$TwitterFeed? &TWaccount=`JoLichter` &TWcount=`10` &TWfading=`5000` &TWtpl=`tplTwitterFeed`]]
Parameter (in Klammer die Standardwerte):
TWaccount: Twitter Name (twitter)
TWcount: Anzahl der Tweets (10)
TWfading: Animationszeit in ms (5000)
TWtpl: Chunk Template (tplTwitterFeed)
« Letzte Änderung: 13. Juni 2013, 17:36:52 von Jo »