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;"> </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つだけのファイルです。

