カテゴリー: FuelPHP

Composerを利用してのFuelPHP初期セットアップ

Composerを利用してのFuelPHP初期セットアップ

頻繁にセットアップするわけじゃないので毎回忘れるし、
その時々で方法が変わってたりするので現時点でのFuelPHP
インストール手順をメモ。

■参考
FuelPHP 1.7.2のComposerによるインストール
http://blog.a-way-out.net/blog/2014/07/14/fuelphp-1-7-2-composer-installation/

$ composer create-project fuel/fuel:dev-1.7/master ProjectName

タイムアウトしてしまった。

Failed to download fuel/core from source: The process "git clone --no-checkout 'git://github.com/fuel/core.git' 'fuel/core' && cd 'fuel/core' && git remote add composer 'git://github.com/fuel/core.git' && git fetch composer" exceeded the timeout of 300 seconds.

タイムアウトの対策
Why composer install timeouts after 300 seconds?
http://stackoverflow.com/questions/18917768/why-composer-install-timeouts-after-300-seconds

$ export COMPOSER_PROCESS_TIMEOUT=600

一回消してもう一度行う。

$ composer create-project fuel/fuel:dev-1.7/master ProjectName
Installing fuel/fuel (dev-1.7/master bafb42f2ab52968aea886ef1e6f341d8a62840c9)
  - Installing fuel/fuel (dev-1.7/master 1.7/master)
    Cloning 1.7/master

Created project in ProjectName
Loading composer repositories with package information
Installing dependencies (including require-dev)
  - Installing composer/installers (v1.0.21)
    Loading from cache

  - Installing fuel/docs (dev-1.7/master 473174d)
    Cloning 473174da2cf503c60d4a9935b71acfc31f0906d0

  - Installing fuel/core (dev-1.7/master e8c221a)
    Cloning e8c221af4cb685aefef20cc50a70f369eb37cb95

  - Installing fuel/auth (dev-1.7/master aa9bd2e)
    Cloning aa9bd2e5104026814ff516aacf03258f62a94a55

  - Installing fuel/email (dev-1.7/master 8fbf378)
    Cloning 8fbf378d74bac170a96cad96ba0aed77e319a865

  - Installing fuel/oil (dev-1.7/master ea37c3a)
    Cloning ea37c3a7fe8675fb3327327213b2eca55303933a

  - Installing fuel/orm (dev-1.7/master 5e05c30)
    Cloning 5e05c3068562548657fea69850a23b23f65a5545

  - Installing fuel/parser (dev-1.7/master 0cacd10)
    Cloning 0cacd10d7b1b8f92a0eeddce75c6ba2c0c28112f

  - Installing fuelphp/upload (2.0.2)
    Loading from cache

  - Installing psr/log (1.0.0)
    Loading from cache

  - Installing monolog/monolog (1.5.0)
    Loading from cache

  - Installing michelf/php-markdown (1.4.0)
    Loading from cache

monolog/monolog suggests installing mlehner/gelf-php (Allow sending log messages to a GrayLog2 server)
monolog/monolog suggests installing raven/raven (Allow sending log messages to a Sentry server)
monolog/monolog suggests installing doctrine/couchdb (Allow sending log messages to a CouchDB server)
monolog/monolog suggests installing ext-amqp (Allow sending log messages to an AMQP server (1.0+ required))
monolog/monolog suggests installing ext-mongo (Allow sending log messages to a MongoDB server)
Writing lock file
Generating autoload files
        Made writable: /home/user/public_html/ProjectName/fuel/app/cache
        Made writable: /home/user/public_html/ProjectName/fuel/app/logs
        Made writable: /home/user/public_html/ProjectName/fuel/app/tmp
        Made writable: /home/user/public_html/ProjectName/fuel/app/config
Do you want to remove the existing VCS (.git, .svn..) history? [Y,n]? Y 

$ cd ProjectName/
$ oil --version
Fuel: 1.7.3 running in "development" mode

とりあえずインストールは出来た。

■git管理と権限設定

$ git init
Initialized empty Git repository in /******/ProjectName/.git/

$ git add -A
$ git commit


$ oil refine install
        Made writable: /home/user/public_html/ProjectName/fuel/app/cache
        Made writable: /home/user/public_html/ProjectName/fuel/app/logs
        Made writable: /home/user/public_html/ProjectName/fuel/app/tmp
        Made writable: /home/user/public_html/ProjectName/fuel/app/config

■DIコンテナを入れておく

Fuel Dependency
https://github.com/fuelphp/dependency

$ vim composer.json 
$ composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing fuelphp/dependency (2.0.0)
    Downloading: 100%

Writing lock file
Generating autoload files

■アクセスURLの変更

アクセスするURLを調整するためにpublicディレクトリを任意の場所に任意の名前でコピー
この時assetsディレクトはコピーしないでおく。
fuel/core/config/asset.php

fuel/app/config
にコピーし

'paths' => array('assets/'),

の箇所を変更する。

■index.phpを消す

$ vim fuel/app/config/config.php
index_file' => false,

.htaccessの以下の部分のコメントを外す

# Remove index.php from URL
#RewriteCond %{HTTP:X-Requested-With} !^XMLHttpRequest$
#RewriteCond %{THE_REQUEST} ^[^/]*/index\.php [NC]
#RewriteRule ^index\.php(.*)$ $1 [R=301,NS,L]
↓
# Remove index.php from URL
RewriteCond %{HTTP:X-Requested-With} !^XMLHttpRequest$
RewriteCond %{THE_REQUEST} ^[^/]*/index\.php [NC]
RewriteRule ^index\.php(.*)$ $1 [R=301,NS,L]

これで駄目な場合は
RewriteBaseを指定してみる。

あとはnamespaceベースでの指定とかに変更したりする。

【FuelPHP】FuelPHPでdompdfを使うまでの道のり

【FuelPHP】FuelPHPでdompdfを使うまでの道のり

前回まではoilコマンドで「fuel/packages/pdf」に
fuel-pdfをインストールして使っていたけど、
フォントのインストールしたり、設定ファイルを色々と
変更するなどしていると管理が面倒になったので、
fuel-pdfをやめて、dompdf自体を「fuel/app/vendor」
にいれて管理するように変更した。

前回のインストールの様子
【FuelPHP】FuelPHPでfuel-pdfを使うまでの道のり

dompdf自体をgitで設置することで前回までに起きていた
クラスが見つからない問題などが一切でなかったので、
こっちのやり方のほうが安心できる。
同梱されてる「tcpdf」使って無いしこれで問題ない。

とりえあず設定方法のメモ。

■fuel/app/vendor以下にdompdfをいれるので移動。

$ pwd
/home/linux-user/public_html/tmp/appname/fuel/app/vendor

■dompdfをcloneする

$ git clone https://github.com/dompdf/dompdf.git
Initialized empty Git repository in /home/linux-user/public_html/tmp/appname/fuel/app/vendor/dompdf/.git/
remote: Counting objects: 5634, done.
remote: Total 5634 (delta 0), reused 0 (delta 0), pack-reused 5634
Receiving objects: 100% (5634/5634), 13.47 MiB | 3.40 MiB/s, done.
Resolving deltas: 100% (3967/3967), done.

■できたフォルダに移動して・・・

$ cd dompdf/

■サブモジュールのinitとupdateで空になってた「php-font-lib」が入ります。

$ git submodule init
Submodule 'lib/php-font-lib' (https://github.com/PhenX/php-font-lib.git) registered for path 'lib/php-font-lib'

$ git submodule update
Initialized empty Git repository in /home/linux-user/public_html/tmp/appname/fuel/app/vendor/dompdf/lib/php-font-lib/.git/
remote: Counting objects: 885, done.
remote: Total 885 (delta 0), reused 0 (delta 0), pack-reused 885
Receiving objects: 100% (885/885), 9.25 MiB | 1.82 MiB/s, done.
Resolving deltas: 100% (493/493), done.
Submodule path 'lib/php-font-lib': checked out 'c30c7fc00a6b0d863e9bb4c5d5dd015298b2dc82'

■マルチバイト対応のためにIPAフォントを準備
(前回のインストール時に/home/linux-user/.fonts/にダウンロード済み)

$ php load_font.php ipagothic /home/linux-user/.fonts/IPAfont00303/ipagp.ttf
Unable to find bold face file.
Unable to find italic face file.
Unable to find bold_italic face file.
Copying /home/linux-user/.fonts/IPAfont00303/ipagp.ttf to /home/linux-user/public_html/tmp/appname/fuel/app/vendor/dompdf/lib/fonts/ipagp.ttf...
Generating Adobe Font Metrics for /home/linux-user/public_html/tmp/appname/fuel/app/vendor/dompdf/lib/fonts/ipagp...

■テスト用のコントローラを作成して実行

public function action_pdftest()
{
    require_once( APPPATH .'vendor/dompdf/dompdf_config.inc.php');
    $pdf = new \DOMPDF();
    $html ='<!DOCTYPE html>
        <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>xxx</title>
        <style>
        body { font-family: "ipagothic;" }
        </style>
        </head>
        <body>
        マルチバイト
        </body>
        </html>';
    $pdf->load_html($html);
    $pdf->render();
    $pdf->stream("sample.pdf", array("Attachment" => 0));
}

dompdf/dompdf
https://github.com/dompdf/dompdf

Usage dompdf
https://github.com/dompdf/dompdf/wiki/Usage

【FuelPHP】dompdfで作成するPDFのサイズを小さくしてみる

dompdfで作成するPDFのサイズを小さくしてみる

前回dompdfを使ってHTMLからPDFを生成できるようになったのですが、
どうもPDFにフォントが全て含まれているようでファイルサイズがでかかった。
そこで設定を変更して利用しているフォントだけを含むようにしてみる。

■dompdf_config.custom.inc.php

//define("DOMPDF_ENABLE_FONTSUBSETTING", true);
// ↓
define("DOMPDF_ENABLE_FONTSUBSETTING", true);

上記の設定変更で問題無いはずだけど以下のエラーが発生。

Fatal Error - Class 'Font' not found in /****/fuel/packages/pdf/lib/dompdf/lib/class.pdf.php on line 2352
// Load font
$font_obj = Font::load($fbfile);

上記のFontクラスが読めていない模様。
そもそも前回パスを勝手に変更して設置しているのでその影響かもしれない。
とりあえず該当クラスでFontが読めるように数行追記

■packages/pdf/lib/dompdf/lib/class.pdf.php

require_once "php-font-lib/classes/Autoloader.php";
use FontLib\Font;

実行するとさらに以下のエラーが発生。

Fatal Error - Class 'Font_Binary_Stream' not found in /****/fuel/packages/pdf/lib/dompdf/lib/class.pdf.php on line 2367

php-font-lib/classesの下を見ても「Font_Binary_Stream」は無いので、
名前が似ている「Binary_Stream」を利用するように変更してみる。

■packages/pdf/lib/dompdf/lib/class.pdf.php

require_once "php-font-lib/classes/Autoloader.php";
use FontLib\Font;
use FontLib\Binary_Stream;

■packages/pdf/lib/dompdf/lib/class.pdf.php @2367くらい

//$font_obj->open($tmp_name, Font_Binary_Stream::modeWrite);
//↓
$font_obj->open($tmp_name, Binary_Stream::modeWrite);

実行すると動いた。
元々4.3MBあったPDFが39KBに激減した。

これでいいのかな・・・・?

■参考サイト
DOMPDFでPDFファイルサイズを小さくする
http://madroom-project.blogspot.jp/2012/12/dompdfpdf.html

【FuelPHP】FuelPHPでfuel-pdfを使うまでの道のり

FuelPHPでfuel-pdfを使うまでの道のり

HTMLをPDFとして出力したいのでfuel-pdfをインストールしdompdfを使ってみる。
設定するまでにかなりてこずったのでメモ。

fuel-pdfをoilコマンドでいれるよりも、dompdfをそのまま
インストールしたほうがフォントのインストールとかも考えたら
やりやすいかもしれない。
【FuelPHP】FuelPHPでdompdfを使うまでの道のり

 

■fuel-pdfをインストール

$ php oil package install pdf

■フォルダ名を変更する
「fuel/packages/fuel-pdf」から
「fuel/packages/pdf」に変更

■利用できるようにconfigを変更

編集ファイル:「fuel/app/config/config.php」

	 'always_load'  => array(

		 'packages'  => array(
             'pdf'
		),

		・・・
		),

■とりあえず動かすために適当なコントローラを用意して以下を記述

    public function action_hoge()
    {

        \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: "ipagothic;" }
</style>
</head>
<body>
マルチバイト
</body>
</html>';

        $pdf->load_html($html);
        $pdf->render();
        $pdf->stream("test.pdf");
    }

この状態でPDFがダウンロードできるが????とか文字化けしている状態のはず。

■日本語が表示できるフォントが無いのでIPAフォントをインストールする

まずIPAのサイトにしたがってフォントをサーバにインストールする。

Linuxに対するフォントインストール例
http://ipafont.ipa.go.jp/fontinstall.html

■dompdfを最新のものに変更

まず最初に。。
http://madroom-project.blogspot.jp/2012/11/fuel-pdfhtmlpdf.html
このサイトに沿って

pdf/lib/dompdfと
pdf/lib/dompdf/lib/php-font-lib
を差し替える

■次にdompdf側でIPAフォントをロードする

以下のコマンドでロードを行う模様

$ php load_font.php ipagothic /home/user/.fonts/IPAfont00303/ipagp.ttf

しかし失敗

$ php load_font.php ipagothic /home/user/.fonts/IPAfont00303/ipagp.ttf
PHP Warning:  require_once(/home/user/public_html/bantane/cooperation/fuel/packages/pdf/lib/dompdf/lib/php-font-lib/classes/Font.php): failed to open stream: No such file or directory in /home/user/public_html/bantane/cooperation/fuel/packages/pdf/lib/dompdf/dompdf_config.inc.php on line 332
PHP Fatal error:  require_once(): Failed opening required '/home/user/public_html/bantane/cooperation/fuel/packages/pdf/lib/dompdf/lib/php-font-lib/classes/Font.php' (include_path='.:/usr/share/pear:/usr/share/php') in /home/user/public_html/bantane/cooperation/fuel/packages/pdf/lib/dompdf/dompdf_config.inc.php on line 332

「fuel/packages/pdf/lib/dompdf/lib/php-font-lib/classes/Font.php」
↑これが無いっていっている

dompdf fails to load
http://stackoverflow.com/questions/15028250/dompdf-fails-to-load

↑このページを参考にして
「php-font-lib/src/FontLib」を「php-font-lib/classes/」として配置する。

$ cd fuel/packages/pdf/lib/dompdf/lib/php-font-lib/src
$ cp -r FontLib ../classes
$ pwd
/home/user/public_html/bantane/cooperation/fuel/packages/pdf/lib/dompdf/lib/php-font-lib/classes
$ ll
合計 68
drwxrwxr-x 8 user user 4096  2月 24 16:49 2015 ./
drwxrwxr-x 7 user user 4096  2月 24 16:49 2015 ../
-rw-rw-r-- 1 user user 5867  2月 24 16:49 2015 Adobe_Font_Metrics.php
-rw-rw-r-- 1 user user  986  2月 24 16:49 2015 Autoloader.php
-rw-rw-r-- 1 user user 8715  2月 24 16:49 2015 Binary_Stream.php
drwxrwxr-x 2 user user 4096  2月 24 16:49 2015 EOT/
-rw-rw-r-- 1 user user  836  2月 24 16:49 2015 Encoding_Map.php
-rw-rw-r-- 1 user user 1606  2月 24 16:49 2015 Font.php
drwxrwxr-x 2 user user 4096  2月 24 16:49 2015 Glyph/
-rw-rw-r-- 1 user user  725  2月 24 16:49 2015 Header.php
drwxrwxr-x 2 user user 4096  2月 24 16:49 2015 OpenType/
drwxrwxr-x 3 user user 4096  2月 24 16:49 2015 Table/
drwxrwxr-x 2 user user 4096  2月 24 16:49 2015 TrueType/
drwxrwxr-x 2 user user 4096  2月 24 16:49 2015 WOFF/

このようにしてFont.phpがある状態にする

しかしまだ失敗。。

$ php load_font.php ipagothic /home/user/.fonts/IPAfont00303/ipagp.ttf
Unable to find bold face file.
Unable to find italic face file.
Unable to find bold_italic face file.
Copying /home/user/.fonts/IPAfont00303/ipagp.ttf to /home/user/public_html/bantane/cooperation/fuel/packages/pdf/lib/dompdf/lib/fonts/ipagp.ttf...
Generating Adobe Font Metrics for /home/user/public_html/bantane/cooperation/fuel/packages/pdf/lib/dompdf/lib/fonts/ipagp...
PHP Fatal error:  Class 'Font' not found in /home/user/public_html/bantane/cooperation/fuel/packages/pdf/lib/dompdf/load_font.php on line 139

DOMPDF – Class ‘Font’ not found
http://stackoverflow.com/questions/22226218/dompdf-class-font-not-found

↑このページを参考にload_font.phpを変更

require_once "dompdf_config.inc.php";

↓以下に変更する

require_once "dompdf_config.inc.php";
require_once "lib/php-font-lib/classes/Autoloader.php";
use FontLib\Font;

やっと成功。

$ php load_font.php ipagothic /home/user/.fonts/IPAfont00303/ipagp.ttf
Unable to find bold face file.
Unable to find italic face file.
Unable to find bold_italic face file.
Copying /home/user/.fonts/IPAfont00303/ipagp.ttf to /home/user/public_html/bantane/cooperation/fuel/packages/pdf/lib/dompdf/lib/fonts/ipagp.ttf...
Generating Adobe Font Metrics for /home/user/public_html/bantane/cooperation/fuel/packages/pdf/lib/dompdf/lib/fonts/ipagp...

load_font.phpは無事に動いた。

この状態でプログラムを動かすとPDFに日本語が表示された。

■参考サイト

TJS-Technology/fuel-pdf
https://github.com/TJS-Technology/fuel-pdf

FuelPHP の fuel-pdf パッケージを利用し日本語の PDF を生成する
http://qiita.com/hmukaida/items/a960408e736b079390ef

dompdf
https://code.google.com/p/dompdf/wiki/Installation

dompdfで日本語を扱う
http://www.yazin.info/blog/archives/2012/0719_203107.html

FuelPHPのfuel-pdfパッケージをセットアップしてHTMLをPDFにコンバートして出力
http://madroom-project.blogspot.jp/2012/11/fuel-pdfhtmlpdf.html

Unable to locate the ttf2afm / ttf2pt1 executable
http://stackoverflow.com/questions/21675533/unable-to-locate-the-ttf2afm-ttf2pt1-executable

dompdf fails to load
http://stackoverflow.com/questions/15028250/dompdf-fails-to-load

DOMPDF – Class ‘Font’ not found
http://stackoverflow.com/questions/22226218/dompdf-class-font-not-found

dompdf samples
http://pxd.me/dompdf/www/examples.php#encoding_utf-8.html,pdf

【Fuel】Validationクラスのget_messageの前後に任意のタグを設定する

【Fuel】Validationクラスのget_messageの前後に任意のタグを設定する

FuelPHPのValidationクラスでget_messageメソッドでエラーを出力するときに
前後にデフォルトで指定のタグを付加する方法。

といっても\fuel\core\classes\validation\error.phpをのぞいたら
ドキュメントに無い設定項目があったのでそれをconfigに設定するだけ。
※試しているバージョンは1.7.2

■fuel/core/classes/validation/error.php

	/**
	 * Get Message
	 *
	 * Shows the error message which can be taken from loaded language file.
	 *
	 * @param   string  HTML to prefix error message
	 * @param   string  HTML to postfix error message
	 * @param   string  Message to use, or false to try and load it from Lang class
	 * @return  string
	 */
	public function get_message($msg = false, $open = '', $close = '')
	{
		$open   = empty($open)  ? \Config::get('validation.open_single_error', '')  : $open;
		$close  = empty($close) ? \Config::get('validation.close_single_error', '') : $close;

		if ($msg === false and ! ($msg = $this->field->get_error_message($this->rule)))
		{
			if (is_null($msg))
			{
				$msg = $this->field->fieldset()->validation()->get_message($this->rule);
			}
			if ($msg === false)
			{
				$msg = \Lang::get('validation.'.$this->rule) ?: \Lang::get('validation.'.\Arr::get(explode(':', $this->rule), 0));
			}
		}
		if ($msg == false)
		{
			return $open.'Validation rule '.$this->rule.' failed for '.$this->field->label.$close;
		}

		// only parse when there's tags in the message
		return $open.(strpos($msg, ':') === false ? $msg : $this->_replace_tags($msg)).$close;
	}

■fuel/app/config/config.php

・・・
        /**
         * Validation settings
         */
        'validation' => array(
                /**
                 * Wether to fallback to global when a value is not found in the input array.
                 */
                // 'global_input_fallback' => true,
                'open_single_error' => '<div class="error">',
                'close_single_error' => '</div>',
        ),
・・・

これでget_messageのたびにタグを渡さなくて済む。

FuelPHPのRestコントローラでBackbone.jsからPOSTのデータを受け取る方法

今頃「Backbone.jsアプリケーション開発ガイド」を
写経してみているのですが、チュートリアル2
「ライブラリ(RESTを使ったBackbone.jsアプリケーション)」
ではまったのでメモ。

バックエンドをFuelPHPのRestコントローラで
記述していたのですが、Backbone側でcollection.create(model.save)した
際に$_POSTが空っぽでデータが受け取れなかった。

調べてみると同様の症状を発見。

Backbone.emulateJSON = true;

上記を記述すればバックエンド側で以下のように取得できるようになった。

$model = json_decode(Input::post('model'));

Backbone.jsには以下のように書いてありました。

// Turn on `emulateJSON` to support legacy servers that can't deal with direct
// `application/json` requests ... will encode the body as
// `application/x-www-form-urlencoded` instead and will send the model in a
// form param named `model`.
Backbone.emulateJSON = false;

■参考URL
Backbone.js Model.save()によるPOSTデータをPHPで読み込む
FuelPHP application with Backbone.js model.save()
Backbone.SyncでSAStrutsにFormをPOSTする方法
Backbone.jsを使ってみた