FuelPHP バージョンアップ手順

自分のリポジトリに切り替えた oil create したプロジェクトでFuelPHPをバージョンアップした手順のメモ

[bash gutter=”false”]
$ git branch
* 1.7/master
master
prototype
$ git remote add fuelphp git://github.com/fuel/fuel.git
$ git remote -v
fuelphp git://github.com/fuel/fuel.git (fetch)
fuelphp git://github.com/fuel/fuel.git (push)
origin https://hendoh@bitbucket.org/hendoh/testvup.git (fetch)
origin https://hendoh@bitbucket.org/hendoh/testvup.git
$ git fetch fuelphp
$ git stash
$ git merge fuelphp/1.7/master
$ git submodule update
$ git stash pop
$ git checkout master
[/bash]

FuelPHP Opauthの使い方 – Google認証からCalendarリストの表示まで

http://fuelphp.jp/docs/1.7/packages/auth/opauth/intro.html

authに加えてormパッケージを有効にします。
[php title=”fuel/app/config/config.php”]
‘always_load’ => array(
‘packages’ => array(
‘auth’,
‘orm’,
),
),
[/php]

Authパッケージ用のテーブルをデータベースに反映しておきます。
[bash gutter=”false”]
$ oil refine migrate –packages=auth
[/bash]

Opauth を使うためには、まずComposerでライブラリーをインストールします。

今回はGoogleログインを試したいので、composer.jsonにopauth/opauthとopauth/googleを追加します。
[text title=”composer.json” highlight=”4,5″]
"require": {
"php": ">=5.3.3",
"monolog/monolog": "1.5.*",
"opauth/opauth": "0.4.*",
"opauth/google": "dev-master",
"fuelphp/upload": "2.0"
},
[/text]
[bash gutter=”false”]
$ php composer.phar update
Loading composer repositories with package information
Updating dependencies (including require-dev)
– Installing opauth/opauth (0.4.4)
Loading from cache

– Installing opauth/google (dev-master 35df776)
Cloning 35df77684c14acb346a8c3753ae3809852d1a47e

opauth/opauth suggests installing opauth/facebook (Allows Facebook authentication)
opauth/opauth suggests installing opauth/twitter (Allows Twitter authentication)
Writing lock file
Generating autoload files
[/bash]

次に、パッケージのopauth.phpfuel/app/configにコピーして、必要最小限の設定を追加します。
[bash gutter=”false”]
$ cp fuel/packages/auth/config/opauth.php fuel/app/config
[/bash]
[php title=”fuel/app/config/opauth.php” highlight=”3, 5-10″]
return array(

‘security_salt’ => ‘xxxxxxxxx’,

‘Strategy’ => array(
‘Google’ => array(
‘client_id’ => ‘APP ID’,
‘client_secret’ => ‘APP_SECRET’,
‘scope’ => ‘https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/calendar https://www.googleapis.com/auth/calendar.readonly’,
),
),
);
[/php]
Googleの場合は、Strategyにapp_idapp_secretではなく、client_idclient_secretのペアを指定します。
また、Google_Strategy.phpをみると、デフォルトのscopeは
https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email
のみが指定されています。
Calendarのアクセスもログイン時に取得したいので、ここでは、
https://www.googleapis.com/auth/calendar https://www.googleapis.com/auth/calendar.readonly
も追加しています。

Googleカレンダーのリストを表示するコントローラーと認証用のコントローラーを作成します。
[bash gutter=”false”]
$ oil g controller calendar index
Creating view: /Applications/MAMP/htdocs/fuel-gcal/fuel/app/views/template.php
Creating view: /Applications/MAMP/htdocs/fuel-gcal/fuel/app/views/calendar/index.php
Creating controller: /Applications/MAMP/htdocs/fuel-gcal/fuel/app/classes/controller/calendar.php
[/bash]
Controller_Calendarでは before でログイン済みかチェックして、未ログインなら user/login にリダイレクトします。
[php title=”fuel/app/classes/controller/calendar.php”]
class Controller_Calendar extends Controller_Template
{
public function before()
{
parent::before();
if ( ! Auth::check())
{
Session::set_flash(‘error’, ‘You must be logged in.’);
Response::redirect(‘user/login’);
}
}

public function action_index()
{
$data["subnav"] = array(‘index’=> ‘active’ );
$this->template->title = ‘Calendar » Index’;
$this->template->content = View::forge(‘calendar/index’, $data);
}

}
[/php]

認証用のコントローラも追加します。ビューが必要なloginアクションのみ指定します。
[bash gutter=”false”]
$ oil g controller user login
Creating view: /Applications/MAMP/htdocs/fuel-gcal/fuel/app/views/user/login.php
Creating controller: /Applications/MAMP/htdocs/fuel-gcal/fuel/app/classes/controller/user.php
[/bash]
ビューが必要ないoauth、callback、register、logoutアクションを追加すると、Controller_Userのインタフェースは以下のようになります。
[php title=”fuel/app/classes/controller/user.php”]
class Controller_User extends Controller_Template
{
public function action_login(){}

public function action_oauth($provider = null){}

public function action_callback(){}

public function action_register(){}

public function action_logout(){}
}
[/php]

まずはログインページの表示
[php]
public function action_login()
{
$this->template->title = ‘User » Login’;
$this->template->content = View::forge(‘user/login’);
}
[/php]
[php title=”fuel/app/views/user/login.php”]
<p>
<?php echo Html::anchor(‘user/oauth/google’, ‘Login in with Google’, array(‘class’=>’btn btn-primary’)); ?>
</p>
[/php]

OAuth認証に関する各アクションは、公式ドキュメントの例: Using Opauth in your application を参考に埋めていきます。

[php title=”fuel/app/classes/controller/auth.php#action_oauth”]
public function action_oauth($provider = null)
{
// bail out if we don’t have an OAuth provider to call
if ($provider === null)
{
\Messages::error(__(‘login-no-provider-specified’));
\Response::redirect_back();
}

// load Opauth, it will load the provider strategy and redirect to the provider
\Auth_Opauth::forge();
}
[/php]

action_oauthの$providerには、ログインページで指定したリンクをクリックしたときは”google”が指定されます。
[php]
<?php echo Html::anchor(‘auth/oauth/google’, ‘Login in with Google’, array(‘class’=>’btn btn-primary’)); ?>
[/php]

次にcallbackです。
[php title=”fuel/app/classes/controller/auth.php#action_callback”]
public function action_callback()
{
try
{
$opauth = \Auth_Opauth::forge(false);

$status = $opauth->login_or_register();

$provider = $opauth->get(‘auth.provider’, ‘?’);

switch ($status)
{
case ‘linked’:
\Session::set_flash(‘success’, sprintf(__(‘login.provider-linked’), ucfirst($provider)));
$url = ‘calendar’;
break;

case ‘logged_in’:
\Session::set_flash(‘success’, sprintf(__(‘login.logged_in_using_provider’), ucfirst($provider)));
$url = ‘calendar’;
break;

case ‘register’:
\Session::set_flash(‘success’, sprintf(__(‘login.register-first’), ucfirst($provider)));
$url = ‘user/register’;
break;

case ‘registered’:
\Session::set_flash(‘success’, __(‘login.auto-registered’));
$url = ‘calendar’;
break;

default:
throw new \FuelException(‘Auth_Opauth::login_or_register() has come up with a result that we dont know how to handle.’);
}

\Response::redirect($url);
}

catch (\OpauthException $e)
{
Log::error($e->getMessage());
\Response::redirect_back();
}

catch (\OpauthCancelException $e)
{
exit(‘It looks like you canceled your authorisation.’.\Html::anchor(‘users/oath/’.$provider, ‘Click here’).’ to try again.’);
}
}
[/php]

処理の流れについて説明します。

Googleの認可ページから戻ってきたときのOAuthのCallback処理は、Auth_Opauthのlogin_or_registerメソッドが処理してくれます。

次に、login_or_registerの戻り値である$statusによって、リダイレクト先を決めています。
ステータスは以下の通りです。

  • linked: ログイン済みの時に、現在ログインしているユーザにプロバイダーの情報が紐づけられた
  • logged_in: 紐付け済みのプロバイダーでログインした
  • registered: プロバイダーのログイン情報をもとに自動でユーザ登録した
  • register: プロバイダーのログイン情報を取得してユーザ登録していない。このときは、セッションにのみ情報を保持

プロバイダーがGoogleの場合は、auth.info.nicknameが取得されないので、新規ユーザで初回のCallback時のステータスは register になります。

次にregisterです。

公式ドキュメントのサンプルのregisterアクションは長々と書いてありますが、今回は、Google認証のみにして、UsernameまたはEメールとパスワードによる認証は省略するため、シンプルに書き直してみます。

ここで必要な処理は、action_callbackでセッションに入れられた情報を users とそれに紐付く user_providers テーブルに保存して、Auth::force_login を呼び出します。
[php title=”fuel/app/classes/controller/auth.php#action_register”]
public function action_register()
{
if ($authentication = \Session::get(‘auth-strategy.authentication’, array()))
{
try
{
$user = \Session::get(‘auth-strategy.user’);

$username_tmp = explode(‘@’, $user[‘email’]);
$username = array_shift($username_tmp);
// call Auth to create this user
$user_id = \Auth::create_user(
$username,
‘dummy’,
$user[‘email’],
\Config::get(‘application.user.default_group’, 1),
array(
‘fullname’ => $user[‘name’],
)
);

// if a user was created succesfully
if ($user_id)
{
// don’t forget to pass false, we need an object instance, not a strategy call
$opauth = \Auth_Opauth::forge(false);

// call Opauth to link the provider login with the local user
$insert_id = $opauth->link_provider(array(
‘parent_id’ => $user_id,
‘provider’ => $authentication[‘provider’],
‘uid’ => $authentication[‘uid’],
‘access_token’ => $authentication[‘access_token’],
‘secret’ => $authentication[‘secret’],
‘refresh_token’ => $authentication[‘refresh_token’],
‘expires’ => $authentication[‘expires’],
‘created_at’ => time(),
));
\Auth::instance()->force_login((int) $user_id);

\Session::set_flash(‘success’, __(‘login.new-account-created’));
\Response::redirect_back(‘calendar’);
}

else
{
\Session::set_flash(‘error’, __(‘login.account-creation-failed’));
}
}

// catch exceptions from the create_user() call
catch (\SimpleUserUpdateException $e)
{
// duplicate email address
if ($e->getCode() == 2)
{
\Session::set_flash(‘error’, __(‘login.email-already-exists’));
}

// duplicate username
elseif ($e->getCode() == 3)
{
\Session::set_flash(‘error’, __(‘login.username-already-exists’));
}

// this can’t happen, but you’ll never know…
else
{
\Session::set_flash(‘error’, $e->getMessage());
}
}
}

else
{
\Session::set_flash(‘error’, ‘Failed to retrieve a user information from the provider.’);
}

\Response::redirect_back(‘user/login’);
}
[/php]

カレンダー表示の実装

gdataパッケージを追加します。
[text title=”composer.json” highlight=”6″]
"require": {
"php": ">=5.3.3",
"monolog/monolog": "1.5.*",
"opauth/opauth": "0.4.*",
"opauth/google": "dev-master",
"mp-php/fuel-packages-gdata": "dev-master",
"fuelphp/upload": "2.0"
},
[/text]
パッケージをインストールして、設定ファイルを fuel/app/config にコピーします。
[bash gutter=”false”]
$ php composer.phar update
[/bash]
gdataパッケージ用の設定を追加します。
[bash gutter=”false”]
$ cp fuel/packages/gdata/config/gdata.php fuel/app/config/
[/bash]
[php title=”fuel/app/config/gdata.php”]
return array(
‘application_name’ => ”,
‘client_id’ => ‘APP ID’,
‘client_secret’ => ‘APP_SECRET’,
‘redirect_uri’ => ”,
‘api_key’ => ”,
‘scopes’ => array(),
‘access_type’ => ‘offline’,
);
[/php]
opauthのGoogleStrategyの設定と重複しているのでなんとかしたいところです。

[php title=”fuel/app/classes/controller/calendar.php#action_index”]
public function action_index()
{
Package::load(‘gdata’);
$gdata = Gdata::forge(
‘Calendar’,
$instance_name = ‘default’,
$config = array(
)
);

$authentication = \Session::get(‘auth-strategy.authentication’);

$gdata->client->setAccessToken(json_encode(array(
‘access_token’ => $authentication[‘access_token’],
‘expires_in’ => $authentication[‘expires’],
‘refresh_token’ => $authentication[‘refresh_token’],
‘created’ => time()
)));
$cal = new Google_CalendarService($gdata->client);
$data["calList"] = $cal->calendarList->listCalendarList();

$this->template->title = ‘Calendar &raquo; Index’;
$this->template->content = View::forge(‘calendar/index’, $data);
}
[/php]

[php title=”fuel/app/views/calendar/index.php”]
<ul>
<?php foreach($calList[‘items’] as $calendar): ?>
<li><?php echo $calendar[‘summary’]; ?></li>
<?php endforeach; ?>
</ul>
[/php]

オフラインアクセスの処理

取得したアクセストークンは、期限(expires)が設定されているため定期的に、リフレッシュトークンを利用してアクセストークンを取得し直す必要があります。
Googleのドキュメント Offline access に手順が詳しく載っています。

作成中。。。

mp-php/fuel-packages-gdataでFuelPHPでGoogle APIを扱う

FuelPHPアプリからGoogle Calendar連携をする必要があったのでパッケージを探したところ fuel-packages-gdata を見つけたので試してみました。

作成者の方が詳しく説明してくれています: FuelPHPのGdataパッケージを作りました。- madroom project

こちらの説明で十分ですが、作業手順をメモしておきます。

Composerでインストール
[php title=”composer.json” highlight=”4″]
"require": {
"php": ">=5.3.3",
"monolog/monolog": "1.5.*",
"mp-php/fuel-packages-gdata": "dev-master",
"fuelphp/upload": "2.0.1"
},
[/php]
[bash]
$ php composer.phar update
[/bash]

設定ファイルを fuel/app/config ディレクトリにコピーして各値をセットします。
[bash]
$ cp fuel/packages/gdata/config/gdata.php fuel/app/config/
[/bash]
[php title=”fuel/app/config/gdata.php”]
<?php
return array(
‘application_name’ => ‘Google Calendar Test’,
‘client_id’ => ‘11111.xxxyyyzzz.apps.googleusercontent.com’,
‘client_secret’ => ‘xxxyyyzzz’,
‘redirect_uri’ => ‘http://localhost/gcal-sample/callback’,
‘api_key’ => ”,
‘scopes’ => array(),
‘access_type’ => ‘offline’,
);
[/php]

常に使う場合は、config.php の always_load に指定します。
[php title=”fuel/app/config/config.php” highlight=”5″]
‘always_load’ => array(
‘packages’ => array(
‘auth’,
‘orm’,
‘gdata’,
),
),
[/php]
常に使う訳ではない場合は必要箇所で
[php gutter=”false”]
Package::load(‘gdata’);
[/php]

Gdata::forge()したオブジェクトのclientがGoogle Data APIクライアントのオブジェクトになります。
[php]
datetime="2014-02-27T02:55:56+00:00">$gdata = Gdata::forge(
‘Calendar’,
$instance_name = ‘default’,
$config = array()
);
$gdata->client->setAccessToken(xxxx);
$cal = new Google_CalendarService($gdata->client);
$calList = $cal->calendarList->listCalendarList();
echo json_encode($calList[‘items’])
[/php]
最近、GData Clientが新しくなったので、対応後は
[php]
$gdata = Gdata::forge(
‘Calendar’,
$instance_name = ‘default’,
$config = array()
);
$gdata->client->setAccessToken(xxxx);
$cal = new Google_Service_Calendar($gdata->client);
$calList = $cal->calendarList->listCalendarList();
echo json_encode($calList->items);
[/php]

FuelPHP Authパッケージ – Simpleauthの使い方

FuelPHPは認証機能を標準で含まれるパッケージAuthで提供しています。
Authには3つのドライバーの実装が含まれています。

  • Simpleauth: 基本パッケージ
  • Ormauth: 基本パッケージのORM対応版
  • Opauth: Facebook、Twitter連携などログイン連携機能を提供

Authパッケージは、機能をAPI形式で利用します。
(Railsでいうところのdeviseではなくsorceryに近い)
そのため、決まりきった定型フォームを用意する必要があり面倒ですが、柔軟にサインアップフローが設計できるという面もあります。

以下、Simpleauthの使い方を確認した際のメモです。

auth パッケージを always_load に設定
注意: configも追加する必要あり
[php title=”app/config/config.php” highlight=”3″]
‘always_load’ => array(

‘packages’ => array(‘auth’),

‘config’ => array(‘auth’),

),
[/php]

simpleauth用のテーブルを定義
[bash]
$ oil refine migrate –packages=auth
Performed migrations for package:auth:
001_auth_create_usertables
002_auth_create_grouptables
003_auth_create_roletables
004_auth_create_permissiontables
005_auth_create_authdefaults
006_auth_add_authactions
007_auth_add_permissionsfilter
008_auth_create_providers
009_auth_create_oauth2tables
010_auth_fix_jointables
[/bash]
テスト用コントローラを作成
[bash]
$ oil generate controller auth login register success_page
Creating view: /Applications/MAMP/htdocs/fuelphp-simpleauth/fuel/app/views/template.php
Creating view: /Applications/MAMP/htdocs/fuelphp-simpleauth/fuel/app/views/auth/login.php
Creating view: /Applications/MAMP/htdocs/fuelphp-simpleauth/fuel/app/views/auth/register.php
Creating view: /Applications/MAMP/htdocs/fuelphp-simpleauth/fuel/app/views/auth/success_page.php
Creating controller: /Applications/MAMP/htdocs/fuelphp-simpleauth/fuel/app/classes/controller/auth.php
[/bash]

[php title=”fuel/app/classes/controller/auth.php”]
class Controller_Auth extends Controller_Template
{
public function before()
{

}

public function action_login()
{

}

public function action_success_page()
{

}

public function action_register()
{

}

public function action_logout()
{

}
}
[/php]

ログイン処理は、Simpleauthのドキュメントの はじめに 例 とほぼ同じです。
[php title=”fuel/app/classes/controller/auth.php#action_login”]
public function action_login()
{
$data = array();

if (Input::post())
{
if (Auth::login(Input::post(‘email’), Input::post(‘password’)))
{
Response::redirect(‘auth/success_page’);
}
else
{
$data[‘username’] = Input::post(‘username’);
Session::set_flash(‘error’, ‘Wrong username/password combo. Try again’);
}
}

$this->template->title = ‘Auth &raquo; Login’;
$this->template->content = View::forge(‘auth/login’, $data);
}
[/php]
Auth::login メソッドを利用してログインを実行します。

[php title=”fuel/app/views/auth/login.php”]
<?php echo Form::open(); ?>
<div class="control-group">
<label class="control-label" for="email">Email</label>
<?php echo Form::input(‘email’, ”, array(‘id’=>’email’, ‘class’=>’form-control’, ‘placeholder’=>’Email’)); ?>
</div>
<div class="control-group">
<label class="control-label" for="password">Password</label>
<?php echo Form::password(‘password’, ”, array(‘id’=>’password’, ‘class’=>’form-control’, ‘placeholder’=>’Password’)); ?>
</div>
<div class="control-group">
<?php echo Form::submit(‘submit’, ‘Login’, array(‘class’=>’btn btn-primary’)); ?> |
<?php echo Html::anchor(‘auth/register’, ‘Sign up’); ?>
</div>
<?php echo Form::close(); ?>
[/php]

Controller_Templateを利用しているので、メッセージはset_flashしています。

ユーザの登録処理は、Auth::create_userを使用します。
第4引数のグループと第5引数の追加情報はここでは使わないので省略しています。
[php title=”fuel/app/classes/controller/auth.php#action_register”]
public function action_register()
{
$data = array();

if (Input::post())
{
Auth::create_user(
Input::post(‘username’),
Input::post(‘password’),
Input::post(‘email’)
);
Session::set_flash(‘success’, ‘You have been successfully registered.’);
Response::redirect(‘auth/login’);
}
$this->template->title = ‘Auth &raquo; Register’;
$this->template->content = View::forge(‘auth/register’, $data);
}
[/php]

[php title=”fuel/app/views/auth/register.php”]
<?php echo Form::open(); ?>
<div class="control-group">
<label class="control-label" for="email">Email</label>
<?php echo Form::input(‘email’, ”, array(‘id’=>’email’, ‘class’=>’form-control’, ‘placeholder’=>’Email’)); ?>
</div>
<div class="control-group">
<label class="control-label" for="username">Username</label>
<?php echo Form::input(‘username’, ”, array(‘id’=>’username’, ‘class’=>’form-control’, ‘placeholder’=>’Username’)); ?>
</div>
<div class="control-group">
<label class="control-label" for="password">Password</label>
<?php echo Form::password(‘password’, ”, array(‘id’=>’password’, ‘class’=>’form-control’, ‘placeholder’=>’Password’)); ?>
</div>
<div class="control-group">
<?php echo Form::submit(‘submit’, ‘Register’, array(‘class’=>’btn btn-primary’)); ?> |
<?php echo Html::anchor(‘auth/login’, ‘Login’); ?>
</div>
<?php echo Form::close(); ?>
[/php]

ログイン成功後のテストページ
[php title=”fuel/app/classes/controller/auth.php#action_success_page”]]
public function action_success_page()
{
$this->template->title = ‘Auth &raquo; Success page’;
$this->template->content = View::forge(‘auth/success_page’);
}
[/php]

[php title=”fuel/app/views/auth/success.php”]
<p>Success page</p>
<p><?php echo Html::anchor(‘auth/logout’, ‘Logout’); ?></p>
[/php]

ログアウト処理
[php title=”fuel/app/classes/controller/auth.php#action_logout”]
public function action_logout()
{
if ( Auth::logout() )
{
Response::redirect(‘auth/login’);
}
else
{
Session::set_flash(‘error’, ‘Logout failed.’);
Response::redirect_back(‘auth/success_page’, ‘refresh’);
}
}
[/php]

認証チェック
ログイン済みかどうかは、Auth::check メソッドを使ってbeforeメソッドでチェックしています。

ここでは、success_page だけをチェック対象としています。
[php title=”fuel/app/classes/controller/auth.php#before”]
public function before()
{
parent::before();

if ( Request::active()->action === ‘success_page’ && ! Auth::check())
{
Session::set_flash(‘error’, ‘You must be logged in.’);
Response::redirect(‘auth/login’);
}
}
[/php]

FuelPHPでファイルアップロード

アップロードフォームのView
[php]
<?php echo Form::open(array("class"=>"form-horizontal", "enctype"=>"multipart/form-data")); ?>
<?php echo Form::file(‘file’); ?>
<?php echo Form::submit(‘submit’, ‘Upload’, array(‘class’ => ‘btn btn-primary’)); ?>
<?php echo Form::close(); ?>
[/php]

Controller
[php]
public function action_upload($id = null)
{
$config = array(
‘path’ => ‘files’,
‘new_name’ => $file_name,
‘ext_whitelist’ => array(‘jpg’, ‘jpeg’),
);
Upload::process($config);

if (Upload::is_valid())
{
Upload::save();
$file = Upload::get_files(0);

Session::set_flash(‘success’, $file[‘name’]." has been uploaded successfully.");
}
else
{
$error_file = Upload::get_errors(0);
Session::set_flash(‘error’, $error_file["errors"][0]["message"]);
}
}
[/php]

Sublime text 2のphpcsプラグインでFuelPHPのスタイルを設定する

FuelPHP用のphpcsは以下のGithubリポジトリから取得する。
https://github.com/eviweb/fuelphp-phpcs

クローンして Standards/FuelPHP ディレクトリを
Applications/MAMP/bin/php/php5.4.4/lib/php/PHP/CodeSniffer/Standards にコピー
[bash]
$ git clone https://github.com/eviweb/fuelphp-phpcs.git
$ cd fuelphp-phpcs-master/Standards
$ sudo cp -r FuelPHP/ /Applications/MAMP/bin/php/php5.4.4/lib/php/PHP/CodeSniffer/Standards/
[/bash]
PHP Code Snifferプラグインの設定を変更する。

Preferences > Package Settings > PHP Code Sniffer > Settings – User
[text]
"phpcs_additional_args": {
// "–standard": "PEAR",
"–standard": "FuelPHP",
"-n": ""
},
[/text]

FuelPHP プロジェクトを作成後 Bitbucket masterリポジトリに切り替えるには

FuelPHPでプロジェクト作成後 Bitbucketに作成したリポジトリのmasterブランチにpushするまでの手順をまとめておきます。

Bitbucketでリポジトリを作成:
Bitbucket-create-repository

リポジトリが作成されると、作成されたリポジトリのページが表示されます。
Bitbucket-created-repository
[私はこれまでに作ったリポジトリをプッシュします。]をクリックするとpushの手順が表示されます。
bitbucket-3

FuelPHPでプロジェクトを作成した後、この手順に沿って、Bitbucketに作成したHello FuelPHPリポジトリにpushしてみます。

FuelPHPプロジェクトの作成は、Hello FuelPHP を参考に作成してください。

oilコマンドでプロジェクトを作成した後、以下のコマンドで確認すると originfuel.git が指定されています。 [bash]
$ git remote -v
origin git://github.com/fuel/fuel.git (fetch)
origin git://github.com/fuel/fuel.git (push)
[/bash]
そこで、手順の git remote add origin の行は、替わりに remote set-url コマンドを使います。

また、1.7/mastermaster に変更してからpushします(FuelPHPプロジェクトをgit管理するときにすべきこと を実行している場合は、すでにmasterになっています)。

以下、全体の手順です。
[bash]
$ oil create fuelblog

$ cd fuelblog
$ git branch
* 1.7/master
$ git branch master
$ git checkout master
M composer.phar
M docs
Switched to branch ‘master’
$ git remote set-url origin https://hendoh@bitbucket.org/hendoh/fuelblog.git
git push -u origin –all
[/bash]

[ソース]を開くと、プロジェクトのファイルがpushされたことが確認できます。
bitbucket-4

追記
プロジェクトを作成したら、まず FuelPHPプロジェクトをgit管理するときにすべきこと を実行しておいた方が良いようです。

FuelPHP Composerでライブラリー•パッケージを管理するには

FuelPHP は 1.6 からライブラリーやパッケージの管理に Composer を利用できるようになりました(1.6 リリースノート)。

Composer関連のファイルは、生成したプロジェクト直下にあります。

  • composer.json
  • composer.lock
  • composer.phar

comporser.json を開いてみるとデフォルトで、以下の3つのみ指定があります。
[bash]
{

"require": {
"php": ">=5.3.3",
"monolog/monolog": "1.5.*",
"fuelphp/upload": "2.0.1"
},

}
[/bash]

Composerでインストールされたライブラリーは fuel/vendor ディレクトリに展開されます。

fuelphp-composer-fuel-vendor
“FuelPHP Composerでライブラリー•パッケージを管理するには” の続きを読む

FuelPHP PaginationにBootstrapを適用するには

FuelPHPでは、Pagination クラス を利用してページングを実装します。

以下は、Admin Scaffoldで作成したCompanyというモデルを一覧するindexアクション内のページングのコードです。
このページでは、検索条件は指定せず全件を対象としています。

Bootstrapを適用するには、ハイライトされている2行を追加するだけです。
[php highlight=”12,13″]
public function action_index($page = 1)
{
$par_page = 10;
$query = Model_Company::query();

$config = array(
‘pagination_url’ => Uri::base(false).’admin/company/index/’,
‘total_items’ => $query->count(),
‘per_page’ => $par_page,
‘uri_segment’ => count(explode(‘/’, Uri::base())),
‘current_page’ => (int)$page,
‘name’ => ‘bootstrap’,
‘wrapper’ => ‘<ul class="pagination">{pagination}</ul>’,
);
$pagination = Pagination::forge(‘mypagination’, $config);
$data[‘pagination’] = $pagination;

$data[‘companies’] = $query->offset(($page-1)*$par_page)->limit($par_page)->get();


}
[/php]
ビューは、以下のコードを変更する必要はありません。
[php]
<?php echo Pagination::instance(‘mypagination’)->render(); ?>
[/php]