November 14, 2012

FuelPHPのfuel-pdfパッケージをセットアップしてHTMLをPDFにコンバートして出力

とりあえずMAC(Mountain Lion)で。(OS毎に変化するのはload_font.phpの実行部分のみと思います。)

--
追記:
Windowsでもbashで全く同様にload_font.phpを実行して、フォントのインストールが出来ました。
--

fuel-pdfを fuel/packages/pdf として配置する。
https://github.com/fuel-packages/fuel-pdf

pdf/lib/dompdfを
https://github.com/dompdf/dompdf
で差し替える。

https://github.com/PhenX/php-font-lib
を pdf/lib/dompdf/lib/php-font-lib として配置する。

pdf/lib/dompdf/load_font.phpを実行してフォントをインストールする。
php load_font.php osaka /Library/Fonts/Osaka.ttf
* Windows 7のフォントは C:\Windows\Fonts にあります。

以下、使い方のサンプル。
Package::load('pdf');
$pdf = Pdf::factory('dompdf')->init();

$html ='<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>xxx</title>
<style>
body { font-family: "Osaka;" }
</style>
</head>
<body>
マルチバイトテスト
</body>
</html>';

$pdf->load_html($html);
$pdf->render();
$pdf->stream("xxx.pdf");
metaのcharsetの指定方法に注意。(HTML5の形式はNGみたい。)

--
追記:
上記のサンプルはDOMPDFを使用していますが、TCPDFというライブラリも使用できます。
TCPDFもHTMLからのPDFコンバートが可能と思いますが、どちらのライブラリを使用するにせよ、
多くの人が期待するかもしれない(?)twitter bootstrapとの組み合わせは、
(2012/11/14時点では)無理です。(CSS3に非対応な為。)

追記2: (2013/05/01)
以下、関連記事です。
DOMPDFでPDFファイルサイズを小さくする
http://madroom-project.blogspot.jp/2012/12/dompdfpdf.html

November 12, 2012

FuelPHPのscafdbタスクを改良しました。

2013/01/14 追記

FuelPHP1.5で、当タスクをベースにしたfromdbタスクが公式に実装されました。
https://github.com/fuel/oil/commit/fcb51348c7d4c401895d4e10119fd795fdc57a94
FuelPHP1.5以降は、fromdbタスクをお使い下さい。

--

大した改良では無いですが、scafdb:scafとscafdb:modelで、
複数テーブルの指定に対応しておきました。
https://github.com/mp-php/fuel-myapp/blob/master/tasks/scafdb.php
https://github.com/mp-php/fuel-myapp/commit/a6357fce3bf3e0e0c9f5a906cd6222da0e7f4d6c

複数テーブルを指定する場合、カンマ区切りで指定して下さい。
単一テーブルの場合、これまでと同様です。

scafdbについては、以下を御覧下さい。
http://www.slideshare.net/mamoruotsuka/fuelphp-tokyo-vol220120923
http://madroom-project.blogspot.jp/2012/06/fuelphpscaffoldtaskgithub.html

尚、FuelPHP1.4でoil generateを正しく実行する為に、以下の修正が必要です。
https://github.com/fuel/oil/commit/74f58bf6ddb1c0c556dc336f578cd3babc4e9755
(追記: パッチが当たっていますので、この修正はもう不要です。)

November 10, 2012

FuelPHP1.4とconfigファイル

FuelPHP1.4がリリースされています。

1.4で初期設定がcore/configに移動したことで、DL直後は
app/config/config.php
app/config/db.php
の2ファィルが、空の配列をreturnするようになっています。

app/config/config.phpも、これからは上書きしたい値のみを書きます。

app/config/db.phpはPDOを用いる場合、"default.type"を書き足す必要があります。
これは、core/config/db.phpでPDO用とMySQLi用の設定がそれぞれ"default"で
定義されていて、MySQLiが後勝ちで"default"になるためです。
(たぶん、これまでDL直後は、PDOがdefaultだったと思う。)

--
追記:
デフォルトでPDOに向くようにパッチが当たっていました。

November 6, 2012

FuelPHPのGdataパッケージを作りました。

GitHubにUPしてあります。
(README等は、後日書く予定です。)

やっていることは簡単で、google-api-php-clientをFuelPHP的にforgeするだけです。

使い方は、以下になります。

(1)
app/config.phpのalways_load.packagesに'gdata'を加えるか
任意の場所でPackage::load('gdata')して有効にします。

(2)
packages/gdata/config/gdata.php
をapp/config/以下にコピーして、編集します。

(3)
forgeする際、サービス名を渡して下さい。
$gdata = Gdata::forge($service_name);

カレンダーのAPIを使うなら
$gdata = Gdata::forge('calendar');
になります。

$gdata->client
$gdata->service
を駆使して処理を進める感じです。

その他、以下を一通りforge出来ます。(と思っています。。。)
packages/gdata/vendor/google-api-php-client/src/contrib/Google_[サービス名]Service.php

同一プロセスで複数のGdataインスタンスを扱いたい場合は
$gdata_xxx = Gdata::forge('xxx', $instance_name);
$gdata_yyy = Gdata::forge('yyy', $instance_name);
になります。

app側からconfigを上書きしたい場合は、第三引数に配列を渡して下さい。
中でマージしています。
$gdata = Gdata::forge('xxx', 'default', $config);
以下、ControllerでGoogleカレンダー一覧を取得するサンプルです。
public function action_login()
{
    $g = static::get_gdata();
    Response::redirect($g->client->createAuthUrl());
}

public function action_callback()
{
    $g = static::get_gdata();
    $g->client->authenticate();
    //$access_token = $g->client->getAccessToken();
    $calendars = $g->service->calendarList->listCalendarList();
    Debug::dump($calendars);
    exit();
}

private static function get_gdata()
{
    Package::load('gdata');
    return Gdata::forge('calendar'); 
}
refresh tokenの使い方を調べないとなー。

November 4, 2012

FuelPHPのFBページのフィードを取得する

もちろん、FuelPHPのFBページじゃなくてもOKです。


参考:
FacebookページのフィードURLを取得してフィードリーダーで購読する方法
http://www.koikikukan.com/archives/2012/04/19-003333.php


1). FBページのURLを調べる
https://www.facebook.com/jp.fuel

2). FBページのURLのwwwをgraphに置き換える
https://graph.facebook.com/jp.fuel

3). 2にアクセスして返却されるjsonの"id"をコピー
https://graph.facebook.com/jp.fuel の場合は 355539997857756

4). フィード取得
https://www.facebook.com/feeds/page.php?format=rss20&id=[取得したID]
https://www.facebook.com/feeds/page.php?format=atom10&id=[取得したID]

https://www.facebook.com/jp.fuel の場合は
https://www.facebook.com/feeds/page.php?format=rss20&id=355539997857756
https://www.facebook.com/feeds/page.php?format=atom10&id=355539997857756

PHP Coding Standards Fixerのインストールや使い方のメモ

■本家
http://cs.sensiolabs.org/


■インストール
wget http://cs.sensiolabs.org/get/php-cs-fixer.phar -O xxx/php-cs-fixer.phar


■アップデート
php php-cs-fixer.phar self-update


■使い方
php php-cs-fixer.phar fix /path/to/dir
php php-cs-fixer.phar fix /path/to/file


■使い方(levelオプション指定)
php php-cs-fixer.phar fix /path/to/project --level=psr0
php php-cs-fixer.phar fix /path/to/project --level=psr1
php php-cs-fixer.phar fix /path/to/project --level=psr2
php php-cs-fixer.phar fix /path/to/project --level=all


■使い方(fixersオプション指定)
php php-cs-fixer.phar fix /path/to/dir --fixers=linefeed,short_tag,indentation


■fixersオプションの意味(一部、表現に間違いあるかも)
* indentation
インデントをスペースx4に。

* braces
クラス名とメソッド名に続く括弧は次の行にする。制御構造に続く括弧は同じ行にする。


* linefeed
PHPファイルの改行コードをLFに。

* trailing_spaces
行末のホワイトスペースを削除。

* unused_use
使用していないuseステートメントを削除。

* php_closing_tag
PHPの閉じタグ ?> を削除。

* short_tag
ショートタグは使わない。

* return
returnの前は一行空ける。

* visibility
全てのプロパティやメソッドは可視性を宣言する。

* phpdoc_params
phpdocの@paramは縦に整列する。

* eof_ending
ファイルの末尾は改行する。

* extra_empty_lines
余分な空白行を削除。

* include
includeするファイルの指定に括弧は使わない。

* PSR0
クラスは、その名前空間に一致するパスに配置する必要があり、少なくとも一つの名前空間の深さにすると、クラス名がファイル名と一致する必要があります。(自動翻訳のまま)

* controls_spaces
制御構造に続く括弧の左にはスペースを空ける。

* elseif
else ifの代わりにelseifを使う。


■個人的な感想
levelオプション指定(無指定含む)で使うことは無さそう。
fixersオプション指定で使うと便利そう。
その時、indentationとbracesは使わなそう。

なので
php php-cs-fixer.phar fix /path/to/dir --fixers=linefeed,trailing_spaces,unused_use,php_closing_tag,short_tag,return,visibility,phpdoc_params,eof_ending,extra_empty_lines,include,PSR0,controls_spaces,elseif
かなー。

backbone.jsのmodelとHTTPメソッドのメモ


model.save()
* idが無いとpost
* idが有るとput

model.destroy()
* idが無いと通信しなかった
* idが有るとdelete

FuelPHPのController_RestとPUT/DELETEとPHPの標準入力についてメモ

2013/05/19 追記:
実はv1.2の頃から Input::json() メソッドがあり、backbone.js(JSON通信)については、それを使えば良いっぽいです。Input::json() の使い方は Input::post() とかの使い方と同じなはずです。

--

backbone.jsを使っていて、当問題に出くわしました。

PHPの標準入力は
http://php.net/manual/ja/wrappers.php.php
"php://input でオープンしたストリームは、一度しか読み込めません。"
との事です。

Controller_RestでPUT/DELETEの時
* Controller_Rest::_detect_format
* Input::param
* Input::hydrate
と進んで、Input::hydrateでfile_get_contents('php://input')しているようです。

そのためか、Controller_Restを継承したサブクラスのメソッド(put_xxx/delete_xxx)で
file_get_contents('php://input')しても、内容は読み込めませんでした。

Input::put/Input::deleteで取れなくは無いのですが、試しにInput::putをログ出力してみると
--
Array
(
    [{"id":"xxx","name":"yyy"}] =>
)
--
という、奇妙な形に。。。

至急、解決したかったので、Inputクラスをapp側で拡張、置換。
以下のメソッドを実装して、凌ぐことにしました。
public static function php_input()
{
    static::$php_input === null and static::$php_input = file_get_contents('php://input');
    return static::$php_input;
}
とりあえず、以下の形で取得できました。
--
{"id":"xxx","name":"yyy"}
--

backbone.jsのmodel.save()の送信値(PHP)

backbone.jsのmodel.save()の送信値は標準入力に入ってくるので、PHPだと以下の方法で取り出します。
$json = json_decode(file_get_contents('php://input'));
echo $json->xxx;
--
追記
file_get_contents('php://input')は一回しか出来ないようですね。
http://php.net/manual/ja/wrappers.php.php
フレームワーク側で勝手にfile_get_contents('php://input')している時は、注意ですね。
--

November 2, 2012

FuelPHPでカバレッジレポートを作成する小物TaskをGitHubに置いておきました。

以下になります。
https://github.com/mp-php/fuel-myapp/blob/master/tasks/coverage.php

php oil r coverage:htmlでhtmlのレポートが作成されます。
第一引数がディレクトリ(デフォルトは"../coverage/")
第二引数がグループ(デフォルトは"App")
となります。

--
追記:
coverage:clover
coverage:text
coverage:php
coverage:all
も追加しておきました。引数はcoverage:htmlと同じです。
--


第一引数のディレクトリに対して削除処理を行った後、レポートを作成します。


--
追記:
暗示的に削除処理を行うのも良くないなーということで、対象ディレクトリ(ファイル)が存在する場合、
-fオプションを付与していないと即時終了するように修正しておきました。
--

IDEの設定ファイル等をGIt管理から避ける為に、プロジェクトを以下の構成にしているので、デフォルトディレクトリも、workと並ぶようにしています。

--
プロジェクトルート/
    work/(ここをGit管理)
    xxx/
    yyy/
    coverage/(今回のtaskで生成するディレクトリのデフォルト)
    その他、IDEの設定ファイル等
--

尚、php oil r coverageとphp oil r coverage:helpでヘルプ表示です。


作る時間よりも、MAMP関係のパスに苦戦してた時間の方が長かった。。。