FuelPHPロゴ

職業プログラマではないのですが、仕事でPHPを用いたシステムをいくつか常用しており、フレームワークとしてFuelPHPを利用しています。そこらへんは以前のエントリ(→PHPフレームワーク「FuelPHP」について。CakePHPユーザーからの感想 | Lunarian's Blog)にて記載しています。

その際に紹介した書籍が2つあったのですが、うち1つの改訂版が出るという点と、もうひとつ電子書籍のみだったものが紙の書籍になって出ました。

私はどちらも旧版しか読んでないので、下記はそのときの印象についての記述です。

電子書籍で出ていたものです。電子書籍なのに改訂が有料かつ分冊化というのがよく分からない感じだったのですが、このたび紙の書籍化でそういうのも吹っ飛びました。
FuelPHPについてだけでなく、ユニットテストなどのモダン開発の視点からも記載があり、コード例が豊富で最初のころはとても助けられました。モダン開発の視点からもFuelPHPというフレームワークは便利なのだとわかります。
FuelPHPに関する代表的な書籍です。

装丁が変わっていたので分かりづらいのですが、FuelPHPに関するもう一つの代表的な書籍です。旧版は、右画像のような装丁です。

わかりやすく、必要十分に、そんなに深くまでは行かないという感じです。とはいえ、もう一つの書籍とはコード例の書き方が違うので、いろいろな書き方を見るという点で良いと思います。

FuelPHPは、フォームの書き方がformクラス+Validationクラスの書き方も、それらが一緒くたになったFieldsetクラスを使った書き方もあり、そのどちらにもメリット・デメリットがあるので、いろいろなフォームコード例を見るとそれらが立体的に見えてくると思います。
(その後で、Viewformプラグインとか使うとわかりやすい気がします:fuelphpのfieldsetがもったいないので拡張してみた | エンジニア開発記

お金に糸目をつけない人は、両方買うのがおすすめです。どっちか一つとなると甲乙つけがたい気がするのですが、あとは初心者よりなら改訂 FuelPHP入門、それなりにPHPもフレームワークもやったぜ寄りな人は、はじめてのフレームワークとしてのFuelPHP 改訂版という印象です。両方とも紙の書籍なので、本屋で読み比べるのが一番ですけどね。

最近のFuelPHPについて

相変わらず国内ではそれなりに人気があり、国外では下火という流れです。以前からの既定路線ですね。そして、これも既定路線ですが、PHPフレームワークの「Laravel」(ららべる)が国外で盛り上がりを継続し、それが国内にも進んできているように思えます。かくいう私も今の開発が一段落したらLaravelを勉強しようとたまにドキュメントを見ていたりします。印象として、Laravelは、シンプルで美しく固い菊人形のような印象を受けました。FuelPHPも綺麗ですが、もうちょっと庶民的な印象です。

とはいえ、正直Webアプリは、Javascriptによるアプリ、HTML5アプリといった方がよいのかよくわかってないのですが、JSによるステートフルな、ワンページアプリケーションが良いのでは無いかと思い始めています。私が作っているシステムは小規模オフィス用のCMSだったり、他の会社との協業ツールで、完全にJSアプリでだいたい出来るのでは無いかと思っています。

AngularJS、Backbone.jsなどのJSフレームワークも発展し、PHPはサーバー側でREST対応で良いかなという感じですらあります。そういう意味で言うとFuelPHPは最適といえるフレームワークですし、Laravelをあえて勉強する意味はそんなには無いのかなと言う気もしています。

まだ自分はモダンな開発手法、よりMVCを徹底して、DRYな開発が出来ているかというとまだまだなので、今の開発ではそれらを実践して、一つ一つ積み重ねています。その後で、Laravelなり、AngularJSなりに手を出したいなと思っています。

SlipOn(スリップオン) ロディア#16(No.16)用レザーカバー正面

PCが大好きでキーボードも大好きだけど、手書きのメモも好きである。

昔、論文試験がある試験対策でものすごく文字を書いていた時は手首の痛みが酷かった。それも万年筆にしたらかなり痛みが解消したという体験から、なるべく普段のメモやノートも万年筆にしている。(ちなみにキーボードは、デスクトップではRealforce、ノートはThinkPadにしたら改善した)

とはいえ、結構なめんどくさがりなので、万年筆特有のめんどくさいのはイヤ。

そんな自分にとっての必須アイテムが、PILOTのキャップレスデシモという万年筆。これは別エントリー済み。
→続きを読む

セーラー・プロギア・インペリアルブラック・イメージ1

止まらない物欲

この前ペリカンのスーベレーンM400を購入したばかりだというのに、常用しているロディアNo.16のメモカバーを我慢しきれずに購入してしまった(→別エントリー)ことを皮切りに、そのメモカバーのペンホルダーにセットする万年筆がほしくなってしまった。

第一候補は、ペリカンのスーベレーンM300。小型でインク吸入式のスーベレーン。M400が良いだけに間違いない買い物っぽいが、いかんせんM400を購入したばかりだし、ちょっと高いし、緑縞しか無いしということで二の足を踏んでいたら、M300ベースのカスタマイズモデルM320シリーズを見つけるも、気に入ったオレンジはどこにも在庫が無く、しかも高かった。

そんなこんなでいろいろと万年筆をあれやこれやと探していた。
最終的に、ラミーの2000に落ち着くかに見えたが、たまたま、セーラー万年筆の「プロフェッショナルギア インペリアルブラック」なるものを見つけてしまい、それがまた好みにドンピシャだった。

軸が太く、メモカバーには間違いなく収まらない。でももう関係ない欲しいっ!

…ということで購入してしまいました。
→続きを読む

以前、FuelPHPでphpwordを使ってワードファイル(docx)を出力できるようにした時のメモ | Lunarian's Blogというエントリーをあげたのですが、その後、私が利用したphpwordをforkして進化したと思われるphpoffice/phpwordを発見しました(Github: PHPOffice/PHPWord · GitHub)。日本語に対応し、Pakagistにも登録(該当ページ:phpoffice/phpword – Packagist)があり、使い方は同じっぽいのでこちらを利用する方法に変更します。以下、使い方を簡単にメモ。

fuelPHPへの導入方法− composerをつかう

fuelPHPは、バージョン1.6からパッケージ管理にcomposerが利用されています。(composer公式サイト:Composer
phpoffice/phpword – Packagistがありますので、composerで導入することができます。

composer.json(composer.pharと同一フォルダにある)のrequire部分に、下記記載を追記。

あとは、ターミナル(黒い画面)で

で導入されます。phpwordは、ルートのvendorファイル下に配置され、class PHPWordにパスが通ります(という言い方が正しいかよくわからないけど、オートロードされるということ)。従って、普通に「new $phpword = new \PhpOffice\PhpWord\PhpWord();」でインスタンス生成で、利用できます。

使い方

※createWrite部分で誤りがあったため修正(2014/6/12)

↓こんな感じになります。
生成したワードファイル

参考リンク

FuelPHPとPHPWordのイメージ
【追記:2014/4/21】
以下で利用しているphpwordよりも新しいphpwordパッケージが見つかりました。そちらの方を利用する方が幸せになれると思いますので、コチラのエントリ:FuelPHPでphpoffice/phpwordを利用するメモ | Lunarian's Blogをご参照下さい。

職場で、簡単な業務用のアプリをFuelPHPで作っています。業務用アプリということで、文章を出力する機能が必要となり、PDF出力を利用していました。これについては、FuelPHP用にfuelpdfというパッケージ(fuel-packages/fuel-pdf · GitHub)があり、実装は簡単です。PDF出力ライブラリとしてTCPDFが利用されており、以前利用していたので簡単に実装できました。

ただ、どうしても取引先がMicrosoft Wordのファイルが良いという要望があり、こっちもそのためにWordを起動して手動でドキュメントを作る手間が馬鹿に出来なかったので、phpwordというPHPでMicrosoft Wordファイルを出力するPHPのライブラリをfuelPHPで利用できるようにしたまで奮闘した成果メモを記しておきます。

FuelPHPのパッケージへの理解、autoloadへの理解、フォルダ構成への理解などが不十分で結構とまどいましたが、とても簡単にできました。

phpwordの概要

生成できるのはWord2007形式

phpwordは、オープンソースのライブラリで、PHPでMicrosoft wordのファイルを出力するためのものです。
wordのファイルは、2003までの形式(*.doc)と2007移行の形式(*.docx)で中身が異なり、phpwordで出力できるのは、2007移行の形式(*.docx)になります。
なぜか2007移行の形式(*.docx)を毛嫌いしている人がたまに見受けられるのですが、Microsoft Office 2003は、XPのサポート終了と同時にサポートを終了してたりしますし、phpから2003までのword形式(バイナリファイル)を出力するのはかなり大変なので、そこはあきらめてほしいです。

生成方法は2通り

phpwordは、2つの方法でwordファイルを出力できます。
1つ目は、ワードファイルをテンプレートとして別途用意し、それを読み込んで編集(値を入れ替える)形で出力する方法。
2つ目は、一からワードファイルを生成する方法です。専用のオブジェクトを生成し、そのオブジェクトに一つ一つパーツを入れていき、最後に一つのワードファイルに生成します。

両方法のメリット・デメリット

1つ目は、ワードファイルをワードで編集して作っておくことが出来るなどのメリットがありますが、値を入れ替えるための変数の入力時などに若干面倒があります。また、プログラムの変更時にPHPとワードファイルと2つのソースを編集する必要があります。

2つ目の方法は、TCPDFなどでのやり方と同じなので慣れている人には楽です。またPHPで柔軟にドキュメント内容を変更できます。

私は2つ目の方法で主に利用するのですが、パスワード付きのドキュメントを取引先に指定されているので、その場合には、パスワードが付いたワードファイルのテンプレートを読み込むという形で1つめの方法で生成しています。(パスワードは固定なのでこの点ではそんなに手間はありません。セキュリティをそこまで厳密にする必要が無くて助かりました。phpwordには一からパスワード付きのファイルを生成する機能は無いようなので。)

phpwordの問題点:日本語への対応

問題として日本語への対応がされていないことが上げられます。
与えられた値に対して、PHP関数の「utf8_encode()」を適用してしまい、似非utf8でエンコードされてしまい文字化けする問題があります。これを手動で外す必要があります。
utf8_encode()という関数の名称から問題なさそうに思えるのですが、どうもちゃんとしたutf8にエンコードしてくれるわけではないとのことです。

fuelPHPへの導入方法その1− composerをつかう

(こちらの方法は、日本語対応で問題があるため、私は使っていません。)

fuelPHPは、バージョン1.6からパッケージ管理にcomposerが利用されています。(composer公式サイト:Composer
Packagistに、phpwordがありますので、composerで導入することができます。

composer.json(composer.pharと同一フォルダにある)のrequire部分に、下記記載を追記。

イメージ:
composer.jsonに追記する

あとは、ターミナル(黒い画面)で

ターミナル上でcomposer.phar updateする

で導入されます。phpwordは、ルートのvendorファイル下に配置され、class PHPWordにパスが通ります(という言い方が正しいかよくわからないけど、オートロードされるということ)。従って、普通に「new ¥PHPWord」でインスタンス生成で、利用できます。

この方法がオフィシャルな感じで一番正しい導入方法と思いますが、上述の日本語対応の問題を手動で修正しても「composer.phar update」時に新バージョンで上書きされてしまい、そのたびに修正しなければいけないのでは無いかと思います。(masterブランチしかないので)

そこで以下の方法でパッケージ化(というほどでもないけど)しました。

ちなみに、phpwordをforkしてutf8_encode()部分を消して、packagistに登録して、それでcomposerで導入という方法もありますが、めんどいのと、いろいろとアレなので私はやりません。

FuelPHPへの導入方法その2− packageにしてみる

fuelwordというそれっぽい名前でパッケージ化してみました。
なお、導入方法1と両方やった場合でどういつ名称だとcomposer導入の方が優先されるかと思います。

パッケージの構成と位置

fuel
├app
├core
├vendor
└packages
  └fuelword
    ├classes
     └fuelword.php
    ├config
    ├bootstrap.php
    └vendor
      └phpword(ダウンロードしてここに入れる)
        ├Examples
        ├PHPWord
        ├template
        └PHPWord.php

このような感じになります。fuelフォルダ下のpackagesフォルダ下に「fuelword」というフォルダを作成し、その下にclassesフォルダ、configフォルダ、vendorフォルダを作成。vendorフォルダ下に、PHPWordのページの「download」からphpword本体をダウンロード・解凍し、配置。

fuelwordフォルダの直下の「bootstrap.php」と、fuelword/classesフォルダの下に「fuelword.php」を自作します。私は以下の内容で自作しました。(下記は、フォルダ名、ファイル名が上記の通りであることを前提の内容)

ライセンスがどうなってるのかなど確認してないので問題があったら消します。

内容としては、たいしたことはしてません。他にスマートな方法がある気がしますが、時間が無いのでこれで済ませました。

実際に使ってみる

テンプレートから作成パターン

※テンプレートファイル(*.docx)は自分で用意

下記の参考リンクにも役立つ情報有りなので見てね。

1から作成パターン

↓こんな感じになります。
生成したワードファイル

参考リンク