Twitterbox na vlastní pěst

neděle, 8. únor 2009 @ 23:54

Rád mám nad webem maximální kontrolu a tak si téměř všechno implementuji po svém a výjimkou nebyl ani seznam několika posledních utwittnutí.

Původní řešení modulu se ukázalo jako nepraktické, jelikož načítání feedu zpomalilo načítání webu (které je i bez toho pomalé až hrůza). Z toho důvodu jsem do zbraně povolal jQuery a modul malinko upravil. Jeho základem je krátký kód jQuery a trocha HTML.

<script type="text/javascript">
$(document).ready(function()    {
    $("#twitter_status").load("/js/twitter.php", function(){
        $("#twitter_loading").hide();
    });
});
</script>
<h2>Twitter</h2>
<div id="twitter_loading" style="text-align: center"><img src="/images/loading.gif" alt="Loading..."/></div>
<ul id="twitter_status"></ul>

Pomocí $(document).re­ady() jQuery sdělíme, že kód chceme spouštět teprve ve chvíli, kdy je stránka načtená. $("#twitter_status").load("/js/twitter.php") dotáže skript, který se stará o zpracování Twitter feedu. Funkce, kterou jsme do události load() uzavřeli, skryje obrázek signalizující nahrávání ale teprve ve chvíli, kdy dostaneme od php skriptu odpověď. HTML kód nám jen určuje co, kde a jak.

Skript twitter.php starající se o zpracování feedu vypadá následovně.

<?php
setlocale(LC_TIME, "czech");
$feed_url = 'http://twitter.com/statuses/user_timeline/UID.rss';
$feedXml = simplexml_load_file($feed_url);
$counter = 0;
foreach ($feedXml->channel->item as $article)
{
    $tweet = str_replace("nick: ", "", $article->description);
    $date = strtotime($article->pubDate);
    $tweet_date = iconv('WINDOWS-1250', 'UTF-8', strftime( '%A, %e. %B %Y @ %H:%M', $date));
    // replace links
    $tweet = preg_replace('/[[:space:]]?http:\/\/([a-zA-Z0-9.-\/]*)[[:space:]]?/is', ' <a href="http://$1">http://$1</a> ', $tweet);
    // replace twitter user references
    $tweet = preg_replace('/[[:space:]]?\@([a-zA-Z0-9]*)[[:space:]]/is', ' @<a href="http://twitter.com/$1">$1</a> ', $tweet);
    echo '<li>'.$tweet.'<br /><a href="'.$article->link.'">'.strtolower($tweet_date).'</a></li>';
    $counter++;
    if ($counter === 3) {
        break;
    }
}
?>

UID v proměnné $feed_url nahradíme ID našeho feedu. K načtení feedu použijeme SimpleXML, který následně proběhneme pomocí foreach(). Z tweetu odstraníme naše jméno, jelikož je zbytečné jej na vlastním webu zobrazovat. Datum nejprve převedeme na vteřiny a následně zformátujeme na námi požadovaný výpis přes strftime(). Nyní vytvoříme z URL v tweetu odkazy a to samé uděláme s referencemi na ostatní uživatele (oba regulární výrazy by jistě šlo nějak vylepšit a zdokonalit ale tohle zatím úplně stačí).

Už zbývá jen vypsat naformátovaný řádek tweetu. Proměnná $counter, která se na začátku scriptu nastaví na 0 a pak testuje v cyklu slouží k ukončení cyklu po vypsání určitého počtu tweetů (v tomto případě tří).

Jednoduché, že?

nudists-bashful