Cakephp显示推文

时间:2014-01-29 10:44:59

标签: cakephp twitter

如何使用新的Twitter API在CakePHP元素的Twitter页面中显示5条推文? 那有插件吗?很抱歉,如果这是一个愚蠢的问题,但我之前使用的是Twitter API。

2 个答案:

答案 0 :(得分:1)

如果您感兴趣,我已经创建了一个可以轻松完成此操作的插件:https://github.com/voycey/CakePHP-Twitter-API-v1.1-Full

答案 1 :(得分:0)

我不知道一个可以使用新API的CakePHP插件,但是有一个很好的普通PHP库很容易使用 - https://github.com/jublonet/codebird-php

您需要在Twitter中创建一个应用,以获取您的消费者密钥和令牌。

以前是一些相关的代码片段,我之前用它来使用CakePHP应用程序:

app/Config/bootstrap.php中(您需要缓存推文,而不是每次请求都获取推文)

Cache::config('three_hour_config', array(
    'engine' => 'File', //[required]
    'duration'=> '+3 hours', //[optional]
    'probability'=> 100, //[optional]
    'mask' => 0777, // [optional] permission mask to use when creating cache files
));

在您的控制器中 - 也许AppController.php

private function __setLatestTweets() {
    $rawTweets = Cache::read('rawTweets', 'three_hour_config' );
    if (empty($rawTweets)) {

        // from https://github.com/jublonet/codebird-php
        require_once (APP . 'Vendor' . DS . 'jublonet' . DS . 'codebird-php' . DS . 'src' . DS . 'codebird.php');
        \Codebird\Codebird::setConsumerKey('********', '*********');
        $cb = \Codebird\Codebird::getInstance();
        $cb->setToken('*****-**********', '*********');

        $rawTweets = (array)$cb->statuses_userTimeline(array('count' => 1));

        // remove the last key, which is not numeric.
        // If we don't remove it, it's treated like a normal tweet and creates errors
        unset($rawTweets['httpstatus']);

        Cache::write('rawTweets', $rawTweets, 'three_hours');
    }
    $this->set('rawTweets',$rawTweets);
}

然后我写了一个助手来帮助我格式化它们:/app/View/Helper/TwitterHelper.php

<?php
/* /app/View/Helper/TwitterHelper.php */
App::uses('AppHelper', 'View/Helper');

class TwitterHelper extends AppHelper {

    public $helpers = array('Time');

    public function formatTweets($tweets) {
        $latestTweets = '';

        foreach ($tweets as $tweet) {
            if ($tweet->retweeted) {
                $tweetText = $tweet->retweeted_status->text;
            } else {
                $tweetText = $tweet->text;
            }
            // Convert twitter Usernames and links to Hyperlinks
            $tweetcontent = '<div class="tweet_content">' . $this->linkify($tweetText) . '</div>';
            $tweetDate = strtotime($tweet->created_at);
            $singleTweet = $tweetcontent . '<div class="tweet_footer">' .
                        $this->Time->timeAgoInWords( $tweetDate ) .
                        ' &sdot; ' .
                        '<a href="https://twitter.com/intent/tweet?in_reply_to=' . number_format($tweet->id, 0, '', '') . '" class="twtr_reply" target="_blank">reply</a>' .
                        ' &sdot; ' .
                        '<a href="https://twitter.com/intent/retweet?tweet_id=' . number_format($tweet->id, 0, '', '') . '" class="twtr-rt" target="_blank">retweet</a>' .
                        ' &sdot; ' .
                        '<a href="https://twitter.com/intent/favorite?tweet_id=' . number_format($tweet->id, 0, '', '') . '" class="twtr-fav" target="_blank">favorite</a>' .
                        '</div>';
            $latestTweets .= "<div class=\"single_tweet\"> $singleTweet </div>";
        }

        return $latestTweets;
    }

/**
 * Credit Jeremy Parrish http://rrish.org/
 */
    public function linkify($statusText) {
        // linkify URLs
        $statusText = preg_replace(
            '/(https?:\/\/\S+)/',
            '<a target="_blank" href="\1">\1</a>',
            $statusText
        );

        // linkify twitter users
        $statusText = preg_replace(
            '/(^|\s)@(\w+)/',
            '\1@<a target="_blank" href="http://twitter.com/\2">\2</a>',
            $statusText
        );

        // linkify tags
        $statusText = preg_replace(
            '/(^|\s)#(\w+)/',
            '\1#<a target="_blank" href="http://search.twitter.com/search?q=%23\2">\2</a>',
            $statusText
        );

        return $statusText;
    }

}

然后在你看来你会有类似的东西:

<h4>Latest from Twitter</h4>
<div class="tweets_container">
    <?php echo $this->Twitter->formatTweets($rawTweets); ?>
</div>