SlideShare uma empresa Scribd logo
1 de 31
Jul 2010
CakePHP
•   Twitter API
    •   OAuth


•   TwitterKit
    •   TwitterKit
    •   TwitterKit
About Me



•   WEB Developer / PHP / CakePHP / HTML / CSS / jQuery / PostgreSQL / MySQL /
    iPhone / /     /      /   /      /               /             / no more

•   BLOG: http://php-tips.com/
•   TWITTER: @nojimage
Twitter API
Twitter API

•   http://api.twitter.com/        HTTP
    JSON     XML
    ‣

    ‣

    ‣

    ‣                  etc...


•
•                  http://dev.twitter.com/
OAuth

•   Twitter API                     Basic   OAuth
    ‣   Basic


•   ConsumerKey AccessToken
    ‣

    ‣   Twitter   AccessToken


•                 dev.twitter.com
OAuth

•                       Twitter
    ‣   ConsumerKey               RequestToken Twitter
    ‣   Authorize URL        ←


•              Twitter

•                       Twitter
    ‣                        URL        (oauth_token, oauth_verifier)
    ‣                   RequestToken                      AccessToken Twitter
    ‣   AccessToken ConsumerKey                     API
TwitterKit
TwitterKit

•   TwitterAPI
    ‣   DataSource, Behavior, Component
    ‣   Twitter

•
    ‣   PHP 5.2 upper (json_encode/json_decode)
    ‣   CakePHP 1.3 +
    ‣   jQuery 1.4.2 +

                   http://github.com/elstc/twitter_kit
TwitterKit

•   Twitter API
    ‣                      http://openlist.jp/
    ‣                     http://tsuketter.com/ (                                 )


•              pear HTTP_OAuth
    ‣   pear                                        Neil Crookess(@neilcrookes)
        HttpSocketOauth


•   OAuth
•


•
•


•
•   http://dev.twitter.com/apps/new

    ‣


    ‣   callback localhost



    ‣

          Read Write
•   http://dev.twitter.com/apps/{app_id}

    •                 Consumer Key   Consumer Secret



    •         My Access Token
        AccessToken
TwitterKit Install

•                           [git clone]
    cd app/plugins
    git clone http://github.com/elstc/twitter_kit.git

    ‣   git               github


•   DB                   [cake schema]
    cake/console/cake schema create TwitterKit.TwitterKit

    ‣            Enter
database.php

•   ConsumerKey, ConsumerSecret, CallbackURL
    <?php
    class DATABASE_CONFIG {

      var $default = array(
    
  
   // DB        .....
        );

        var   $twitter = array( //                                     twitter
             'driver' => 'TwitterKit.TwitterSource',
             'oauth_consumer_key' => '{YOUR_CONSUMER_KEY}',
             'oauth_consumer_secret' => '{YOUR_CONSUMER_SECRET}',
             'oauth_callback'      => '/twitter_kit/oauth/callback',
             'cache' => true, // app/tmp/cache/twitter/
        );
    }
Model

•   Behavior
    <?php
    class Tiwt extends AppModel {

        var $name = 'Tiwt';

        var $useTable = false; //

        //                           TwitterTweetBehavior
        var $actsAs = array('TwitterKit.TwitterTweet');

    }
Controller

•   Component, Helper
    <?php
    class TiwtsController extends AppController {

        var $name = 'Tiwts';

        //
        var $components = array('TwitterKit.Twitter');

        //                      TwitterFormHelper
        var $helpers = array('TwitterKit.TwitterForm');

    }
AuthComponent

•   AppController::beforeFilter()
    <?php
    class AppController extends Controller {

      var $components = array('Session', 'Auth');

      // ...

      public function beforeFilter() {
           $this->Auth->authorize = 'controller';
           $this->Auth->userModel = 'TwitterKit.TwitterKitUser';
           $this->Auth->loginAction = array(
              'plugin' => 'twitter_kit',
              'controller' => 'users', 'action' => 'login');
      }

      // ...
AuthComponent

•   isAuthorized                               AccessToken
    <?php
    class AppController extends Controller {

     // ...

     public function isAuthorized() {
        // set OAuth
              ConnectionManager::getDatasource('twitter')->setToken(
                 $this->Auth->user('oauth_token'),
                 $this->Auth->user('oauth_token_secret')
              );
          // ...
          return true;
      }

      // ...
Action!

•   TwitController::index()
    •   HOME
    •   Model fetch


•   TwitController::add()
    •   POST
    •   Model teewt
    •
TiwtsController::index()
function index() {

    if ($this->Session->read('reflash')) {
        //
        $this->Twitter->refreshCache();
    }

    $timelines = $this->Tiwt->fetch($this->params['named']);
    $this->set(compact('timelines'));

}
Tiwt::fetch()
function fetch($options = array()) {

    $params = array();

    foreach (array('since_id', 'max_id', 'count', 'page') as $key) {
       if (!empty($options[$key])) {
           $params[$key] = $options[$key];
       }
    }

    //
    $results = $this->getTwitterSource()->statuses_home_timeline($params);
    if (empty($results)) { return array(); }
    //
    return array_map(array($this, '_reverse'), $results);
}
TiwtsController::add()
function add() {

    $this->autoRender = false;

    if (!empty($this->data)) {

        if ( $this->Tiwt->teewt($this->data) ) {
            $this->Session->write('reflash', true); //
            $this->Session->setFlash($this->Tiwt->strrev('          '));
        } else {
           $this->Session->setFlash($this->Tiwt->strrev('    '));
        }

    }

    $this->redirect(array('action' => 'index'));

}
Tiwt::teewt()
function teewt($data = null) {

    if (empty($data)) { $data = $this->data; }

    //         (tweet             TwitterKit::TwitterTweet   )

    return $this->tweet($this->strrev($data[$this->alias]['text']));

}
Tiwt::strrev(), Tiwt::_reverse()
function _reverse($data) {

    if (empty($data)) { return array(); }

    $data['rev']['text'] = $this->strrev($data['text']);
    $data['rev']['user']['screen_name'] = $this->strrev(
      $data['user']['screen_name']);

    return $data;

}

function strrev($str){

    preg_match_all('/./us', $str, $ar);
    return join('', array_reverse($ar[0]));

}
View

•   layout/default.ctp
    •   jQuery


•   tiwts/index.ctp
    •                 → TwitterFormHelper::tweet()
    •
http://tiwt.php-tips.com/
•   Twitter



•   TwitterKit
                 github PULL
TwitterKitではじめる OAuthスピードクッキング

Mais conteúdo relacionado

Mais procurados

優しいWAFの作り方
優しいWAFの作り方優しいWAFの作り方
優しいWAFの作り方
techmemo
 
Symfony & Javascript. Combining the best of two worlds
Symfony & Javascript. Combining the best of two worldsSymfony & Javascript. Combining the best of two worlds
Symfony & Javascript. Combining the best of two worlds
Ignacio Martín
 
Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the Finish
Yehuda Katz
 
Rails 3 overview
Rails 3 overviewRails 3 overview
Rails 3 overview
Yehuda Katz
 

Mais procurados (20)

優しいWAFの作り方
優しいWAFの作り方優しいWAFの作り方
優しいWAFの作り方
 
How to develop modern web application framework
How to develop modern web application frameworkHow to develop modern web application framework
How to develop modern web application framework
 
Silex Cheat Sheet
Silex Cheat SheetSilex Cheat Sheet
Silex Cheat Sheet
 
With a Mighty Hammer
With a Mighty HammerWith a Mighty Hammer
With a Mighty Hammer
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Storytelling By Numbers
Storytelling By NumbersStorytelling By Numbers
Storytelling By Numbers
 
Complex Sites with Silex
Complex Sites with SilexComplex Sites with Silex
Complex Sites with Silex
 
New Symfony Tips & Tricks (SymfonyCon Paris 2015)
New Symfony Tips & Tricks (SymfonyCon Paris 2015)New Symfony Tips & Tricks (SymfonyCon Paris 2015)
New Symfony Tips & Tricks (SymfonyCon Paris 2015)
 
Symfony & Javascript. Combining the best of two worlds
Symfony & Javascript. Combining the best of two worldsSymfony & Javascript. Combining the best of two worlds
Symfony & Javascript. Combining the best of two worlds
 
Design how your objects talk through mocking
Design how your objects talk through mockingDesign how your objects talk through mocking
Design how your objects talk through mocking
 
Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the Finish
 
Get into the FLOW with Extbase
Get into the FLOW with ExtbaseGet into the FLOW with Extbase
Get into the FLOW with Extbase
 
Incremental Type Safety in React Apollo
Incremental Type Safety in React Apollo Incremental Type Safety in React Apollo
Incremental Type Safety in React Apollo
 
The Coolest Symfony Components you’ve never heard of - DrupalCon 2017
The Coolest Symfony Components you’ve never heard of - DrupalCon 2017The Coolest Symfony Components you’ve never heard of - DrupalCon 2017
The Coolest Symfony Components you’ve never heard of - DrupalCon 2017
 
How Kris Writes Symfony Apps
How Kris Writes Symfony AppsHow Kris Writes Symfony Apps
How Kris Writes Symfony Apps
 
Introduction to CQRS and Event Sourcing
Introduction to CQRS and Event SourcingIntroduction to CQRS and Event Sourcing
Introduction to CQRS and Event Sourcing
 
Unit testing after Zend Framework 1.8
Unit testing after Zend Framework 1.8Unit testing after Zend Framework 1.8
Unit testing after Zend Framework 1.8
 
Guard Authentication: Powerful, Beautiful Security
Guard Authentication: Powerful, Beautiful SecurityGuard Authentication: Powerful, Beautiful Security
Guard Authentication: Powerful, Beautiful Security
 
Алексей Плеханов: Новинки Laravel 5
Алексей Плеханов: Новинки Laravel 5Алексей Плеханов: Новинки Laravel 5
Алексей Плеханов: Новинки Laravel 5
 
Rails 3 overview
Rails 3 overviewRails 3 overview
Rails 3 overview
 

Destaque (8)

OAuth Echo の Rails Gem
OAuth Echo の Rails GemOAuth Echo の Rails Gem
OAuth Echo の Rails Gem
 
セキュリティとコンプライアンスプログラムについて
セキュリティとコンプライアンスプログラムについてセキュリティとコンプライアンスプログラムについて
セキュリティとコンプライアンスプログラムについて
 
Hyman Charme 09 11 09 Final 1
Hyman Charme 09 11 09 Final 1Hyman Charme 09 11 09 Final 1
Hyman Charme 09 11 09 Final 1
 
セキュそば 090314
セキュそば 090314セキュそば 090314
セキュそば 090314
 
Girls Day Out Giving Project 2009
Girls Day Out Giving Project 2009Girls Day Out Giving Project 2009
Girls Day Out Giving Project 2009
 
FabricとRailsと私
FabricとRailsと私FabricとRailsと私
FabricとRailsと私
 
Plugin for CakePHP2.0
Plugin for CakePHP2.0Plugin for CakePHP2.0
Plugin for CakePHP2.0
 
Composerはじめました
ComposerはじめましたComposerはじめました
Composerはじめました
 

Semelhante a TwitterKitではじめる OAuthスピードクッキング

Building @Anywhere (for TXJS)
Building @Anywhere (for TXJS)Building @Anywhere (for TXJS)
Building @Anywhere (for TXJS)
danwrong
 
Building TweetEngine
Building TweetEngineBuilding TweetEngine
Building TweetEngine
ikailan
 
Twig, the flexible, fast, and secure template language for PHP
Twig, the flexible, fast, and secure template language for PHPTwig, the flexible, fast, and secure template language for PHP
Twig, the flexible, fast, and secure template language for PHP
Fabien Potencier
 
Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012
Michelangelo van Dam
 

Semelhante a TwitterKitではじめる OAuthスピードクッキング (20)

Building @Anywhere (for TXJS)
Building @Anywhere (for TXJS)Building @Anywhere (for TXJS)
Building @Anywhere (for TXJS)
 
An introduction to Laravel Passport
An introduction to Laravel PassportAn introduction to Laravel Passport
An introduction to Laravel Passport
 
Building TweetEngine
Building TweetEngineBuilding TweetEngine
Building TweetEngine
 
Api
ApiApi
Api
 
Twitter4R OAuth
Twitter4R OAuthTwitter4R OAuth
Twitter4R OAuth
 
Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12
 
Let's read code: the python-requests library
Let's read code: the python-requests libraryLet's read code: the python-requests library
Let's read code: the python-requests library
 
Designing CakePHP plugins for consuming APIs
Designing CakePHP plugins for consuming APIsDesigning CakePHP plugins for consuming APIs
Designing CakePHP plugins for consuming APIs
 
関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい
 
Workshop quality assurance for php projects - phpbelfast
Workshop quality assurance for php projects - phpbelfastWorkshop quality assurance for php projects - phpbelfast
Workshop quality assurance for php projects - phpbelfast
 
Lecture n
Lecture nLecture n
Lecture n
 
Language literacy
Language literacyLanguage literacy
Language literacy
 
Workshop quality assurance for php projects - ZendCon 2013
Workshop quality assurance for php projects - ZendCon 2013Workshop quality assurance for php projects - ZendCon 2013
Workshop quality assurance for php projects - ZendCon 2013
 
Mining Georeferenced Data
Mining Georeferenced DataMining Georeferenced Data
Mining Georeferenced Data
 
Twig, the flexible, fast, and secure template language for PHP
Twig, the flexible, fast, and secure template language for PHPTwig, the flexible, fast, and secure template language for PHP
Twig, the flexible, fast, and secure template language for PHP
 
Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012
 
Motion Django Meetup
Motion Django MeetupMotion Django Meetup
Motion Django Meetup
 
[Srijan Wednesday Webinars] Ruling Drupal 8 with #d8rules
[Srijan Wednesday Webinars] Ruling Drupal 8 with #d8rules[Srijan Wednesday Webinars] Ruling Drupal 8 with #d8rules
[Srijan Wednesday Webinars] Ruling Drupal 8 with #d8rules
 
Cakephpstudy5 hacks
Cakephpstudy5 hacksCakephpstudy5 hacks
Cakephpstudy5 hacks
 
YDN KR Tech Talk : Pipes 와 YQL 활용하기
YDN KR Tech Talk : Pipes 와 YQL 활용하기YDN KR Tech Talk : Pipes 와 YQL 활용하기
YDN KR Tech Talk : Pipes 와 YQL 활용하기
 

Último

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Último (20)

Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 

TwitterKitではじめる OAuthスピードクッキング

  • 2. Twitter API • OAuth • TwitterKit • TwitterKit • TwitterKit
  • 3. About Me • WEB Developer / PHP / CakePHP / HTML / CSS / jQuery / PostgreSQL / MySQL / iPhone / / / / / / / / no more • BLOG: http://php-tips.com/ • TWITTER: @nojimage
  • 5. Twitter API • http://api.twitter.com/ HTTP JSON XML ‣ ‣ ‣ ‣ etc... • • http://dev.twitter.com/
  • 6. OAuth • Twitter API Basic OAuth ‣ Basic • ConsumerKey AccessToken ‣ ‣ Twitter AccessToken • dev.twitter.com
  • 7. OAuth • Twitter ‣ ConsumerKey RequestToken Twitter ‣ Authorize URL ← • Twitter • Twitter ‣ URL (oauth_token, oauth_verifier) ‣ RequestToken AccessToken Twitter ‣ AccessToken ConsumerKey API
  • 9. TwitterKit • TwitterAPI ‣ DataSource, Behavior, Component ‣ Twitter • ‣ PHP 5.2 upper (json_encode/json_decode) ‣ CakePHP 1.3 + ‣ jQuery 1.4.2 + http://github.com/elstc/twitter_kit
  • 10. TwitterKit • Twitter API ‣ http://openlist.jp/ ‣ http://tsuketter.com/ ( ) • pear HTTP_OAuth ‣ pear Neil Crookess(@neilcrookes) HttpSocketOauth • OAuth
  • 11.
  • 14. http://dev.twitter.com/apps/new ‣ ‣ callback localhost ‣ Read Write
  • 15. http://dev.twitter.com/apps/{app_id} • Consumer Key Consumer Secret • My Access Token AccessToken
  • 16. TwitterKit Install • [git clone] cd app/plugins git clone http://github.com/elstc/twitter_kit.git ‣ git github • DB [cake schema] cake/console/cake schema create TwitterKit.TwitterKit ‣ Enter
  • 17. database.php • ConsumerKey, ConsumerSecret, CallbackURL <?php class DATABASE_CONFIG { var $default = array( // DB ..... ); var $twitter = array( // twitter 'driver' => 'TwitterKit.TwitterSource', 'oauth_consumer_key' => '{YOUR_CONSUMER_KEY}', 'oauth_consumer_secret' => '{YOUR_CONSUMER_SECRET}', 'oauth_callback' => '/twitter_kit/oauth/callback', 'cache' => true, // app/tmp/cache/twitter/ ); }
  • 18. Model • Behavior <?php class Tiwt extends AppModel { var $name = 'Tiwt'; var $useTable = false; // // TwitterTweetBehavior var $actsAs = array('TwitterKit.TwitterTweet'); }
  • 19. Controller • Component, Helper <?php class TiwtsController extends AppController { var $name = 'Tiwts'; // var $components = array('TwitterKit.Twitter'); // TwitterFormHelper var $helpers = array('TwitterKit.TwitterForm'); }
  • 20. AuthComponent • AppController::beforeFilter() <?php class AppController extends Controller { var $components = array('Session', 'Auth'); // ... public function beforeFilter() { $this->Auth->authorize = 'controller'; $this->Auth->userModel = 'TwitterKit.TwitterKitUser'; $this->Auth->loginAction = array( 'plugin' => 'twitter_kit', 'controller' => 'users', 'action' => 'login'); } // ...
  • 21. AuthComponent • isAuthorized AccessToken <?php class AppController extends Controller { // ... public function isAuthorized() { // set OAuth ConnectionManager::getDatasource('twitter')->setToken( $this->Auth->user('oauth_token'), $this->Auth->user('oauth_token_secret') ); // ... return true; } // ...
  • 22. Action! • TwitController::index() • HOME • Model fetch • TwitController::add() • POST • Model teewt •
  • 23. TiwtsController::index() function index() { if ($this->Session->read('reflash')) { // $this->Twitter->refreshCache(); } $timelines = $this->Tiwt->fetch($this->params['named']); $this->set(compact('timelines')); }
  • 24. Tiwt::fetch() function fetch($options = array()) { $params = array(); foreach (array('since_id', 'max_id', 'count', 'page') as $key) { if (!empty($options[$key])) { $params[$key] = $options[$key]; } } // $results = $this->getTwitterSource()->statuses_home_timeline($params); if (empty($results)) { return array(); } // return array_map(array($this, '_reverse'), $results); }
  • 25. TiwtsController::add() function add() { $this->autoRender = false; if (!empty($this->data)) { if ( $this->Tiwt->teewt($this->data) ) { $this->Session->write('reflash', true); // $this->Session->setFlash($this->Tiwt->strrev(' ')); } else { $this->Session->setFlash($this->Tiwt->strrev(' ')); } } $this->redirect(array('action' => 'index')); }
  • 26. Tiwt::teewt() function teewt($data = null) { if (empty($data)) { $data = $this->data; } // (tweet TwitterKit::TwitterTweet ) return $this->tweet($this->strrev($data[$this->alias]['text'])); }
  • 27. Tiwt::strrev(), Tiwt::_reverse() function _reverse($data) { if (empty($data)) { return array(); } $data['rev']['text'] = $this->strrev($data['text']); $data['rev']['user']['screen_name'] = $this->strrev( $data['user']['screen_name']); return $data; } function strrev($str){ preg_match_all('/./us', $str, $ar); return join('', array_reverse($ar[0])); }
  • 28. View • layout/default.ctp • jQuery • tiwts/index.ctp • → TwitterFormHelper::tweet() •
  • 30. Twitter • TwitterKit github PULL

Notas do Editor