hampom TODAY

「TODAY」ってタイトルが付くブログが作りたいな、と思った10分後に作ったブログ。

Kohana で作る twitter ツール「つどったー」作る編

コメントする »

前回でサイトの準備が整いました!

今回は具体的にプログラムを作っていきます。追加したのは controller 2ファイル。model 1ファイル。view 3ファイルです。

では、/controllers/welcome.php から!

1. welcome.php

<?
class welcome_Controller extends Controller {
    
    public $IN_PRODUCTION = False;
    
    public function __construct()
    {
        parent::__construct();
        
        $this->twitter = new Twitter;
        $this->twitter->check_login();
        $this->page = new View('template');
    }
    
    public function index()
    {
        if($this->twitter->check_login())
        {
            $url = "http://api.twitter.com/1/{$this->twitter->user->username}/lists.json";
            $list = json_decode($this->twitter->oAuthRequest($url));
            
            $this->tsudotter = new Tsudotter_Model;
            $regist_list = $this->tsudotter->get($this->twitter->user->username);

            if(!is_null($regist_list))
            {
              foreach($regist_list as $row)
                $new_regist_list[] = "/{$this->twitter->user->username}/$row";
            }
            else
            {
              $new_regist_list = null;
            }

            $message = $this->twitter->sess->get('user_message');
            $this->page->content = new View('logged_in',array('twitter'=>$this->twitter,'limits'=>$limits,'lists'=>$list,'regist_list'=>$new_regist_list,'message'=>$message));
        }
        else
        {
            $this->twitter->getRequestTokens();
            $url = $this->twitter->getAuthorizeUrl();
            $this->page->content = new View('not_logged_in',array('url'=>$url));
        }
        
        $this->page->render(True);
    }

  
    public function completed()
    {
        if($this->twitter->check_login() == False)
        {
            $this->twitter->sessionRequestTokens();
            $this->twitter->tradeRequestForAccess();
            if($this->twitter->storeTokens())
            {
                url::redirect('');
            }
            else
            {
                echo "help - a wierd error occured somewhere. Check your installation again";
            }
            
        }
        else
        {
            url::redirect('');
        }
    }
    
    public function logout()
    {
        if($this->twitter->check_login() != False)
        {
            $this->twitter->revokeSession(True);
        }
        url::redirect('');
    }
       
}

welcome.php はデフォルトコントローラーになっており、http://tsudotter.com/ にアクセスすると welcome.php の index が対応します。 wellcome.php には、この他にログアウト( logout ) および、twitter で指定した callback URL( completed ) の3つが存在しています。

index では、$this->twitter->check_login() によりログイン状態をチェックされログインされていない場合は、twitter ログイン用URLを取得し view の not_logged_in.php を表示します。一方、ログインされていた場合は Twitter API によりログインユーザーのリスト一覧を取得。さらに、Tsudotter_Model を用いて登録済みのリストを取得しています(ビューにて、登録済みのリストには×を表示したいからです!)

では、ビューはどのようになっているのでしょうか!

2. /views/not_logged_in.php /views/logged_in.php /views/template.php

not_logged_in.php

<p style="padding: 3px;">
  「つどったー」は Twitter で作成したリストへの登録をオープンにする為のサイトです。まずは、以下のリンクからログインし「リストに集う」許可をください!!<br />
</p>
<p style="padding: 3px; text-align: center;">
  <?=html::anchor($url, html::image('Sign-in-with-Twitter-darker.png'));?>
</p>

このファイルで必要なのは html::anchor() だけですね。welcome.php コントローラーファイルの 41行目で取得した $url をここでは出力しています。

logged_in.php

<p style="padding: 3px;">
  <?=$twitter->user->username;?> さん、お手伝いできることはありますか?
</p>
<? if($message !== false): ?>
<p style="padding: 3px; font-weight: bold; color: #cc0000;">
  <?=$message; ?>
</p>
<? endif; ?>
<p style="padding: 3px; text-align: right;">
<?=html::anchor('logout','[ ログアウト ]');?>
</p>
<? if (count($lists->lists) > 0): ?>
<p style="padding: 3px;">
  <?=$twitter->user->username;?> さんの管理されているリストが<?=count($lists->lists);?>件見つかりました。<br />
  登録をオープンにするリストを選択ください。
</p>

<?
  print form::open('list/open');
?>
<table style="margin: 5px auto 5px auto; width: 490px; border: 1px #E3E3E3 solid; border-collapse: collapse; border-spacing: 0;">
  <tr>
    <th style="padding: 5px; border: #E3E3E3 solid; border-width: 0 0 1px 1px; background: #F5F5F5; font-weight: bold; line-height: 120%; text-align: center;">&nbsp;</th>
    <th style="padding: 5px; border: #E3E3E3 solid; border-width: 0 0 1px 1px; background: #F5F5F5; font-weight: bold; line-height: 120%; text-align: center;">リスト名</th>
    <th style="padding: 5px; border: #E3E3E3 solid; border-width: 0 0 1px 1px; background: #F5F5F5; font-weight: bold; line-height: 120%; text-align: center;">リンク</th>
  </tr>
  <? foreach($lists->lists as $value): ?>
  <tr>
    <td style="padding: 5px; border: 1px #E3E3E3 solid; border-width: 0 0 1px 1px; background: #FFFFFF; text-align: center;">
    <? if(is_array($regist_list) && in_array($value->uri, $regist_list)): ?>
      <span style="color: #cc0000;">×</span>
    <? else: ?>
      <? print form::radio('chk_list', $value->uri); ?>
    <? endif; ?>
    </td>
    <td style="padding: 5px; border: 1px #E3E3E3 solid; border-width: 0 0 1px 1px; background: #FFFFFF;"><?=$value->name;?></td>
    <td style="padding: 5px; border: 1px #E3E3E3 solid; border-width: 0 0 1px 1px; background: #FFFFFF;"><a href="http://twitter.com<?=$value->uri;?>"><?=$value->full_name;?></a>)</td>
  </tr>
  <? endforeach; ?>
</table>
<?
  print form::submit('submit', '登録');
?>
<?

ああ…。 css は外部ファイルにまとめるべきでした…。
ページ上部側から、ログアウト、リスト、入力画面と並んでいます。

実際に出力されると以下のようになります。

さて、もうひとつの template.php はどんな役割を果たしているのでしょうか。
実はコンテンツ部分を除いたヘッダーやフッターなど、統一部分が記述されています。

つどったーでは、ヘッダーとフッターのほかに右部のコンテンツについても template.php に含めています。

自身のリストを公開するフォームと、他のユーザーのリストに登録するフォームはどちらも /controllers/list.php で処理を行います。

3. list.php

<?
class List_Controller extends Controller {
    
    public function __construct()
    {
        parent::__construct();
        
        $this->twitter = new Twitter;
        $this->twitter->check_login();
        $this->tsudotter = new Tsudotter_Model;
        $this->twitter_user = new Twitter_user_Model;
    }
    
    public function open()
    {
      if($this->twitter->check_login() != False)
      {
        list($dummy, $nickname, $list_name) = explode("/", $this->input->post('chk_list'));

        if($this->twitter->user->username == $nickname)
        {
          $inArray = array(
            'nickname' => $nickname,
            'list_name'=> $list_name
          );

          $this->tsudotter->insert_list($inArray);
        }
      }

      url::redirect('');
    }
 
    public function add()
    {
      if($this->twitter->check_login() != False)
      {
        $screen_name = $this->input->post('screen_name');
        $list_name = $this->input->post('list_name');

        $user_list = $this->tsudotter->get($screen_name);

        if(in_array($list_name, $user_list))
        {
          $user = $this->twitter_user->get_key($screen_name);

          if(is_object($user))
          {
            $this->list_owner = new Twitter;

            $this->list_owner->user = new Twitter_user_Model;
            $this->list_owner->user->set_keys($user->access_key, $user->secret_key);

            $url = "http://api.twitter.com/1/{$screen_name}/{$list_name}/members.json";
            $args = array(
              "id" => $this->twitter->user->username
              );
            
            $this->list_owner->oAuthRequest($url, $args, "POST");

            $this->twitter->sess->set_flash('user_message', '登録を行いました!');
          }
          else
          {
            $this->twitter->sess->set_flash('user_message', '希望されたリストは登録許可がありません。残念!');
          }

        }
        else
        {
          $this->twitter->sess->set_flash('user_message', '希望されたリストは登録許可がありません。残念!');
        }
        
      }

      url::redirect('');

    }
}

リストの公開は open。リストへの登録は add で。KTwitter ではログインをするとユーザーの access key および secret key がデータベースに保存されますので、それらの情報を用いて登録希望のユーザー名(screen name)を、Twitter リストAPI により登録します。

最後にモデルですが、KTwitter に含まれる twitter_user.php はそのまま利用し tsudotter_model として1つだけ追加しています。

4.tsudotter.php

<?php
class Tsudotter_model extends Model {

    public function __construct()
    {
        parent::__construct();
    }
    
    public function insert_list($data)
    {
      $this->db->insert('tsudotter', $data);
    }
    
    public function get($nickname)
    {
      $this->db->where('nickname', $nickname);
      $r = $this->db->get('tsudotter');

      if($r->count() > 0)
      {
        foreach($r as $row)
          $all_array[] = $row->list_name;

        return $all_array;
      }
      else
      {
        return null;
      }

    }
}

公開するリスト情報を登録する insert_list() と、登録されているリスト情報を取得する get() の2つだけのファイルです。

投稿者: hampom

2010年 3月 16日 at 12:28 PM

カテゴリー: 未分類

コメントする

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

%s に接続中

フォロー

Get every new post delivered to your Inbox.

現在332人フォロワーがいます。