2013年11月10日日曜日

VagrantでFuelPHPを立ち上げるまでにしたこと

備忘録。

最近、少しずつさわっているVagrantでFuelPHPが動くようにするまでにしたことを。

バージョン情報
・Vagrant(1.3.5)
・Chef(11.8)


Vagrant+Chefのインストールのでインストールは以下のサイトを参考にしました。



とりあえずVagrantの立ち上げ
box を http://www.vagrantbox.es/からダウンロードして任意のディレクトリでinitします。
$ vagrant box centos64-minimal http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130731.box

$ mkdir fuelphp
$ cd fuelphp
$ vagrant init centos64


initで生成されたVagrantfileにとりあえずプライベートIPの設定をしておきます。
$ vi Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos64-minimal"
  config.vm.network :private_network, ip: "192.168.33.10"
end

これで vagrant up します。
$ vagrant up
Bringing machine 'default' p with 'virtualbox' provider...
[default] Clearing any previously set forwarded ports...
[defualt] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding posts...
[defualt] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for machine to boot. This may take a few minutes...
[default] Machine booted and ready!
[default] Configuring and enabling network interfaces...
[default] Mounting shared folders...
[default] -- /vagrant

正常に動いたらvagrant sshでつながることを確認しておきます。
(Windowsの場合は Tera Term とかで192.168.33.10に接続できればok)

次にapache、php、mysqlのインストールをするためにrecipeを作ります。
$ mkdir cookbooks
$ cd cookbooks
$ git clone https://github.com/hayashida/httpd-php.git
$ git clone https://github.com/hayashida/mysql-server.git

recipeを全部書いていたら長くなりそうなので簡単に作ったものをgithubに。
設定していることは
・apacheのドキュメントルートを/var/www/html から /vagrant/public に変更
くらいです。
(FuelPHPのディレクトリ構成上、publicがウェブのルートになるので)

それを使ってrecipeを実行します。
$ cd ..
$ vi Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos64-minimal"
  config.vm.network :private_network, ip: "192.168.33.10"
  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = "./cookbooks"
    chef.add_recipe "httpd-php"
    chef.add_recipe "mysql-server"
  end
end

$ vagrant reload

$ vagrant provision

これでapache、php、mysqlのインストールが完了。

http://192.168.33.10/にアクセスしてページが表示されればOK。
phpinfo()などを実行するとPHPがインストールできていることも確認できます。
$ touch ./public/phpinfo.php
$ vi ./public/phpinfo.php
<?php
    phpinfo();

さて、本題のFuelPHP。
これもrecipeを使って・・・としたかったんですがまだそこまではできていないです。
とりあえずFuelPHPをダウンロードしてきてVagrantfileがあるディレクトリに展開します。
fuelphp
    + .vagrant
    + cookbooks
    + docs
    + fuel
    + public
    + CHANGELOG.md
    + composer.json
    + composer.phar
    + CONTRIBUTING.md
    + LICENSE.md
    + oil
    + README.md
    + TESTING.md
    + Vagrantfile

あとは、vagrant ssh でゲストOSにログインしていつもの手順どおり
php composer.phar update や php oil refine install を実行すると画面が立ち上がります。
このプロジェクトをgitなどでバージョン管理して開発メンバーで共有するとメンバー間での環境の違いで悩まされなくなります。
(.vagrantはバージョン管理から除外した方がいいみたい)


Vagrant + Windows の環境ではこれで問題なく動きますが
Vagrant + Mac で開発する場合は、権限関係で動かないところがあるようで
app/tmpやapp/logsなど、php oil refine installで権限を変更している箇所を0777などにしておかないと動かないみたい。

やり方が間違っているのかもしれないけど何かいい方法がないか模索中・・・。






2013年10月25日金曜日

FuelPHPのThemeクラスを使ってPC/モバイルのテーマを切り替える

久しぶりに書きます。
久しぶりのネタもFuelPHPですが
FuelPHPのThemeクラスを使うとPC/モバイルのテーマを簡単に切り替えることができます。

参考になる記事がほかにも色々ありますが、ざっくり紹介まで。

ディレクトリ構成は以下
app
  + classes
    + controller
    + sample.php
  + config
    + theme.php
  + views
    + template_pc.php
    + template_mobile.php
    + pc
      + top
        + index.php
      + header.php
    + mobile
      + top
        + index.php
      + header.php
      + elements
       + footer.php



概略を言うと「template_pc.php」と「template_mobile.php」がテーマ用のテンプレートファイルです。
views内の「pc」と「mobile」とありますがこれがテーマ用のディレクトリとなります。
テーマのディレクトリは変更することができます。
また、モバイル判定後、テーマを変更するだけなのでコントローラは1つです。


それではさっそく例を。

まず設定を行います。
app/config/theme.phpを作成
<?php

return array(
    'active'    => 'pc',    // 有効なテーマ
    'fallback'  => 'pc',    // active themeが見つからない場合
    'paths'     => array(APPPATH.'views'),  // テーマのディレクトリ
    'view_ext'  => '.php',  // テーマファイルの拡張子
);


次にコントローラ。
app/controller/sample.php
<?php

class Controller_Sample extends Controller
{
    public function before()
    {
        parent::before();

        // Themeインスタンスの生成
        $this->theme = Theme::instance();

        // モバイル判定を行いテーマを切り替える
        if (Agent::is_mobiledevice()) {
            $this->theme->active('mobile');
            $this->theme->set_template('template_mobile');
        } else {
            $this->theme->active('pc');
            $this->theme->set_template('template_pc');
        }
        $this->theme->set_partial('header', 'header');
    }

    public function after($response)
    {
        if (empty($response) or !$response instanceof Response) {
            $response = Response::forge($this->theme->render());
        }

        return parent::after($response);
    }

    public function action_index()
    {
        $posts = Model_Post::find('all');

        $view = $this->theme->view('top/index');
        $view->set('posts', $posts);
        $this->theme->template->content = $view;
    }
}



あらかじめbeforeでThemeインスタンスを生成します。
モバイルの判定はAgent::is_mobiledevice()で行い有効なテーマを切り替えます。

Agent::is_mobiledevice()は前にも記事にしたようにiPadなどはモバイルとして認識されているようなので注意が必要です。

アクションメソッドはほぼそのままですが
ビューを生成するところでテーマ内のビューを参照します。
beforeの部分で有効なテーマを切り替えているので'top/index'と指定するだけで
PCならpc/top/index、mobileならmobile/top/indexを参照してくれます。


あとはビューです。が、これはもうそのままです。
まず、app/views/template_pc.php
<!doctype html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>PC Site</title>
</head>
<body>
    <?php echo $partials['header']; ?>
    <?php echo $content; ?>
    <?php echo render('elements/footer'); ?>
</body>
</html>


テーマごとに部品化したいものはpartialを使うこともできますし
テーマを無視して部品化するものはrenderなど書く事もできます。


久しぶりに書いてもざっくりとした内容でした。





2013年5月4日土曜日

baserCMSのプラグインでウィジェットを作ってみた

今回初めてプラグインを作りましたが参考にしたページ



プラグインについては上記のサイトを参考に作ることができました。

プラグインを作る過程でウィジェットも実装してみたかったのでその手順をメモ書き。


baserCMSのウィジェット作成画面で表示される部品(投稿者一覧や月別アーカイブなど)は
{プラグイン名}/views/elements/admin/widgets
を自動的に?見るのでまずはそこにファイルを作成します。

bcforum_entries.php
<?php
    $title = 'ブログ一覧';
    $description = '最近の投稿を表示します',


これだけでウィジェット管理の作成画面に表示されるようになります。
あとは表示画面の作成。
作成するディレクトリは
{プラグイン名}/views/elements/widgets

ここに同じ名前でファイルを作成

bcforum_entries.php
<div class="widget">
    <h2><?php echo $name ><h2>
</div>

これでウィジェットエリアに表示されるようになります。

手順あってるのか不安ですが、簡単に実装することができました。
(間違ってたら指摘してもらえると嬉しいです)







2013年4月20日土曜日

baserCMSで会員制のページを作る

最近、baserCMSでホームページを構築しようとしていてそこで調べたことをメモ程度に。
baserCMSを使うとある指定されたページに認証機能をつけることができます。
今回は認証機能を使ってブログ(member_blog)を開こうとしたときに認証をかける例。


まずはファイルのコピーから。
cd basercms
cp ./baser/config/baser.php ./app/config/
cp ./baser/controllers/members_controller.php ./app/controllers/
cp ./baser/models/member.php ./app/models/
cp -r ./baser/views/members ./app/views/


次にコピーした app/config/baser.php を修正します。
// 行101から
$config['BcAuthPrefix'] = array(
    // 管理画面
    'admin' => array(
        (省略)
    ),
    // マイページ(例)
    'mypage' => array(
        'name'           => 'マイページ',
        'alias'          => 'mypage',
        'loginRedirect'  => '/member_blog',
        'loginTitle'     => 'マイページログイン',
        'userModel'      => 'Member',
        'loginAction'    => '/mypage/members/login',
        'toolbar'        => true
    ),
);

とりあえず実装するだけならコメントを外すだけで良いです。
今回は(member_blog)を開いた際に、認証をかけログインできたら(member_blog)を開くようにしたいので loginRedirect の部分だけを書き換えています。
また、ログアウトはまだ実装しないので標準を使用。 toolbar を true にしておきます。

次にbaserCMSにログインしてユーザグループの追加を行います。

注意する点は認証プレフィックス設定でマイページを選択します。
このマイページとは config/baser.php で設定している mypage.name になります。
合わせてこのグループに対応するユーザも作成します。

ひとまずこれで認証機能は完成。
http://localhost/basercms/mypage/members/login
を開くとログイン画面が表示できると思います。

先ほど作成したユーザでログインをするとブログ(member_blog)に自動的にページが遷移します。
動作の確認はこれで良いですが、一度ログアウトして

http://localhost/basercms/member_blog/index
にアクセスしてみてださい。

ブログ(member_blog)が正常に表示されると思いますが、今回はこのブログに制限をかけたいのでもう少し修正が必要です。

修正するファイルはテーマ側。
デフォルトのテーマ(nada-icons)ですと layouts/default.php の先頭に下記を追加します。

$url = $html->url();
$pattern = '/member_blog/';
if (preg_match($pattern, $url)) {
    if (!isset($this->viewVars['user'])) {
        header('Location: '.$bcBaser->getUrl(Configure::read('BcAuthPrefix.mypage.loginAction')));
    }
}


こうすることでブログ(member_blog)配下のアドレスが指定された場合に認証済みかのチェックを行い、認証がまだの場合はログインページに遷移することができます。


こんなかんじでbaserCMSで会員制のページを作ることができました。
まだまだbaserCMSの仕組みがわかっていないので書き方が変なところやこうすれば良いみたいなところがありましたら教えてください。



参考ページ





2013年4月10日水曜日

FuelPHPのチートシートみたいなものを作った

もともとは社内の勉強会ネタで作っていたもの。
http://fuelphpcheatsheet.aws.af.cm/

よく使うものとかを中心に、書いていますがまだまだ情報が少なすぎる状態です。

AppFogを使って見たかったのでそれも兼ねて。
ぼちぼちと更新していきます。



AppFogでの公開については以下のサイトを参考にしました。





2013年1月29日火曜日

似てるけど似てないPHPの配列を結合する

AdventCalendar2012でも書きましたが似てるけど似てないシリーズ。
(シリーズといいながら思いついたときに書き残そうと思っただけですが)
(というかほぼ自分の備忘録)

今回は配列の結合。
最近知ったことなんですが配列を結合に+という配列結合演算子があります。
今まで配列の結合と言えば array_merge と思っていたんですが + もありました。

何か違うことでもあるのかなと思って実際に試してみました。

簡単な例ですが
$tmp1_1 = array("1", "2", "3");
$tmp1_2 = array("a", "b", "c", "d");

var_dump(array_merge($tmp1_1, $tmp1_2));
// 結果
//array
//  0 => string '1' (length=1)
//  1 => string '2' (length=1)
//  2 => string '3' (length=1)
//  3 => string 'a' (length=1)
//  4 => string 'b' (length=1)
//  5 => string 'c' (length=1)
//  6 => string 'd' (length=1)

var_dump($tmp1_1 + $tmp1_2);
// 結果
//array
//  0 => string '1' (length=1)
//  1 => string '2' (length=1)
//  2 => string '3' (length=1)
//  3 => string 'd' (length=1)

全然、違います。
array_merge は指定した配列同士を連結していますが、+ の場合は前に指定した配列に値が追加されるような動きになります。

PHP: array_merge - Manual
http://jp1.php.net/manual/ja/function.array-merge.php
PHP: 配列演算子 - Manual
http://php.net/manual/ja/language.operators.array.php

php.netによると同じキー文字列を有している場合は、後に指定された配列により上書きされる。
とあるので
$tmp2_1 = array(
        "key_1" => "1",
        "key_2" => "2",
        "key_3" => "3",
    );
$tmp2_2 = array(
        "key_1" => "a",
        "key_2" => "b",
        "key_3" => "c",
        "key_4" => "d",
    );

var_dump(array_merge($tmp2_1, $tmp2_2));
// 結果
//array
//  'key_1' => string 'a' (length=1)
//  'key_2' => string 'b' (length=1)
//  'key_3' => string 'c' (length=1)
//  'key_4' => string 'd' (length=1)

var_dump($tmp2_1 + $tmp2_2);
// 結果
//array
//  0 => string '1' (length=1)
//  1 => string '2' (length=1)
//  2 => string '3' (length=1)
//  3 => string 'd' (length=1)

array_merge のほうは同じキー文字列を有しているので上書きされているのがわかります。
+ のほうは先ほどの結果と同じです。

動きを理解しておかないと思わぬ結果が返ってくるかもしれないです。




2013年1月27日日曜日

チートシートアプリ

アプリという方でもないですが。
寝る前に同僚からVimとかSublimeText2のチートシートを作ってと頼まれてたの思い出したので。
適当です。


画面はこんなかんじ。
人それぞれキーバインドしてるから簡単に内容を修正できるようにデータはxmlで。
htmlで作ってるからDropboxとかに置いとけばブラウザで表示できるし、データもxmlだからいつでも修正できる。

とりあえずGithubに置いたからあとはご自由に。
https://github.com/hayashida/cheatsheet