December 5, 2011

FuelPHPでFacebookアプリを作ってみよう。準備編。

FuelPHP Advent Calendar 2011 に参加させて頂きます。
@madmamor です。

5日目の本日は、FuelPHPでFacebookアプリのサンプル作成手順を紹介します。
FuelPHPのルールを意識しつつ、Facebookでの認証とウォールへの投稿を実装します。
要、Facebookアカウント。です。

とは言うものの、FuelPHPはまだまだ未知数な部分も多く、
もしかすると、よろしくない書き方が含まれているかもしれません。
その辺り含め、ディスカッションのネタになれば幸いです。

今回は、準備編です。敷居の低い環境を想定して話を進めます。
* windows + XAMPP(1.7.7)
* XAMPPはクリーンな状態。php.ini等、設定は一切触っていない。
* FuelPHPのバージョンは1.1-RC1

では、始めましょう。


【先に】
掲載するソースは、oilコマンドで自動生成されたファイルを基にしています。
但し、今回は、oilコマンド無しで作成出来る内容です。


【FuelPHPの配置】
(1)
XAMPPのドキュメントルート(htdocs下)に今回のアプリを配置するディレクトリを作成します。
"fuelfb"とします。


(2)
以下からFuelPHPをDL、解凍。fuelfb下に配置します。
http://fuelphp.com/

必要なものは
* fuelディレクトリ以下
* publicディレクトリ以下
* oilファイル(今回は不必要ですが、一応。)

xampp/
├ htdocs/
 ├ fuelfb/
  ├ fuel/
  ├ public/
  ├ oil


(3)
以下にアクセスできれば、ここまでの話はクリアです。
http://127.0.0.1/fuelfb/public/

【Facebookにアプリ登録】
(1)
Facebookにログインして、以下にアクセス。
https://developers.facebook.com/apps
* 初回アクセス時は開発者登録が必要なので、"許可する"をクリック。


(2)
* 右上の"+新しいアプリケーションを作成"をクリック
* "App Display Name:" にアプリ名を入力。(お好きな名前で。"face"とか"fb"とかは使えないようです。)
* "App Namespace:" は、とりあえず空で良いと思います。
* "I agree to the Facebook Platform Policies." にチェック。
* "続行"をクリック、セキュリティチェックを行い"送信"をクリック。
* "App ID:"と"App Secret:"の内容を控える。
* "アプリをFacebookに結合する方法を選択してください"で"ウェブサイト"をクリック。
* "サイトURL:"に、今回作成するWEBアプリのURLを入力。
... 今回は http://127.0.0.1/fuelfb/public/ になります。
* 一番下の"変更を保存"をクリック。


(4)
* 左上の"詳細設定"をクリック。
* "Sandbox Mode:"を"有効"にする。
... WEBに配置して公開する。となったら、"無効"にすることを忘れずに。
* 一番下の"変更を保存"をクリック。


Facebookのアプリ登録は、以上。


【Facebook PHP SDKのDLと配置】
認証やウォール投稿に必要となります。

(1)
Facebook PHP SDK
https://github.com/facebook/php-sdk
アーカイブは、以下からDL可能です。
https://github.com/facebook/php-sdk/downloads

必要なのはsrcディレクトリ以下です。
今回は、fuel/app/vendor下に"facebook-php-sdk"というディレクトリを作成。
その下に、DLしたsrcディレクトリを配置することにしましょう。
fuel/
├ app/
 ├ vendor/
  ├ facebook-php-sdk/[新規作成]
   ├ src/
    ├ base_facebook.php
    ├ facebook.php
    ├ fb_ca_chain_bundle.crt


【自分用のコンフィグファイルを作成】
色々と触りやすくする為、自分用のコンフィグファイルを作ります。
以下、次回用の設定を含みます。

(1)
fuel/app/config/custom.phpを作成します。
<?php
return array(
    'facebook' => array(
        'init' => array(
            'appId'  => 'YOUR_FACEBOOK_APP_ID',
            'secret' => 'YOUR_FACEBOOK_APP_SECRET',
        ),
        'login' => array(
            'redirect_uri' => 'http://127.0.0.1/fuelfb/public/index/callback/',
            'scope' => array('publish_stream',),
        ),
        'logout' => array(
            'next' => 'http://127.0.0.1/fuelfb/public/index/index/',
        ),
    ),
);

/* End of file custom.php */
'appId'と'secret'の値は、予め控えておいた、FacebookアプリのApp IDとApp Secretを書いて下さい。


(2)
fuel/app/config/config.phpを修正します。
下の方(214行目辺り)の
'config'  => array(),

'config'  => array(
    'custom' => null,
),
にして下さい。
先に作成した、fuel/app/config/custom.phpが自動で読み込まれるようになります。


【コントローラとビューの作成】
次に、ファイルを3つ、作成します。
* fuel/app/classes/controller/index.php
* fuel/app/views/template.php
* fuel/app/views/index/index.php (fuel/app/views/index/ディレクトリも併せて作成して下さい。)

ソース内容は、以下の通りです。


fuel/app/classes/controller/index.php
<?php
require_once APPPATH.'vendor/facebook-php-sdk/src/facebook.php';

class Controller_Index extends Controller_Template {

    private $fb;

    public function before()
    {
        parent::before();
        $this->fb = new Facebook(Config::get('facebook.init'));
    }

    public function action_index()
    {
        $this->template->title = 'Index » Index';

        $data = array(
            'is_login' => $this->fb->getUser()?true:false,
        );

        $this->template->content = View::forge('index/index',$data);
    }

    public function action_login()
    {
        exit('TODO : login');
    }

    public function action_callback()
    {
        exit('TODO : callback');
    }

    public function action_logout()
    {
        exit('TODO : logout');
    }

}
import('facebook-php-sdk/src/facebook', 'vendor');
としたかったのですが、どうも、fuel/core/vendor下に配置しないとエラーになるようです。
なので今回は、require_onceの形を取っています。

fuel/app/views/template.php
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title><?php echo $title; ?></title>
    <style type="text/css">
        * { margin: 0; padding: 0; }
        body { background-color: #EEE; font-family: sans-serif; font-size: 16px; line-height: 20px; margin: 40px; }
        #wrapper { padding: 30px; background: #fff; color: #333; margin: 0 auto; width: 600px; }
        a { color: #36428D; }
        h1 { color: #000; font-size: 55px; padding: 0 0 25px; line-height: 1em; }
        .intro { font-size: 22px; line-height: 30px; font-family: georgia, serif; color: #555; padding: 29px 0 20px; border-top: 1px solid #CCC; }
        .notice { border: 1px solid #CCC; padding: 10px; background-color: #EEE; }
        h2 { margin: 50px 0 15px; padding: 0 0 10px; font-size: 18px; border-bottom: 1px dashed #ccc; }
        h2.first { margin: 10px 0 15px; }
        p { margin: 0 0 15px; line-height: 22px;}
        a { color: #666; }
        pre { border-left: 1px solid #ddd; line-height:20px; margin:20px; padding-left:1em; font-size: 16px; }
        pre, code { color:#137F80; font-family: Courier, monospace; }
        ul { margin: 15px 30px; }
        li { line-height: 24px;}
        label { display: block; }
        .footer { color: #777; font-size: 12px; margin: 40px 0 0 0; }
    </style>
</head>
<body>
    <div id="wrapper">
        <h1><?php echo $title; ?></h1>
        <?php if (Session::get_flash('notice')): ?>
            <div class="notice"><p><?php echo implode('</p><p>', (array) Session::get_flash('notice')); ?></div></p>
        <?php endif; ?>

        <?php echo $content; ?>

        <p class="footer">
            <a href="http://fuelphp.com">Fuel</a> is released under the MIT license.<br />Page rendered in {exec_time}s using {mem_usage}mb of memory.
        </p>
    </div>
</body>
</html>
なんだか良くわからない。。。と思われた方も、今回は、気にしなくて良いです。
とりあえず、ベタ貼りで良いです。

fuel/app/views/index/index.php
<p>Index</p>

<?php if ($is_login): ?>
<a href="http://127.0.0.1/fuelfb/public/index/logout/">Logout.</a>
<?php else: ?>
<a href="http://127.0.0.1/fuelfb/public/index/login/">Login with Facebook.</a>
<?php endif; ?>

これら3ファイルは、oilコマンドで自動生成して、若干の修正を施した内容です。
(fuel/app/views/template.phpは、全くそのままです。)


【XAMPPのphp.ini修正】
xampp/php/php.iniの
;extension=php_curl.dll

extension=php_curl.dll
にします。
Facebook PHP SDKを使用する際に必要です。
ここで、XAMPPのApacheを再起動して下さい。


【確認】
http://127.0.0.1/fuelfb/public/index/index/
にアクセスして、以下が表示されれば、OKです。
fuel/app/classes/controller/index.phpのaction_index()が呼び出されました。
"index"の部分がfuel/app/views/index/index.phpです。
外枠にはfuel/app/views/template.phpが使用されています。


今回は、ここまでです。
とりあえず、ベタ貼りで動けばOKです。
後で改造して挙動を伺って頂ければと思います。
お疲れ様でした。

次回は、
DB(テーブル)作成、モデル作成、認証&ウォール投稿機能作成。
をバリデーション付きで、一気に行います。
ポイントとなりそうな箇所の解説も併記します。


■4日目
@fukata さん
[FuelPHP]Validationの使い方
次回予定している実装編の参考にさせて頂きます。

■6日目
@9ensan さん
FuelPHPで作るログイン管理
ログイン周りはまだ見ていなかったので、助かります。

P.S.
祝、10人突破!!


2011/12/11 追記
実装編の記事は、こちらになります。
FuelPHPでFacebookアプリを作ってみよう。実装編。

No comments:

Post a Comment