Archive for the ‘PHP’ Category

■Fuelphpにて環境の振り分け例

bootstrap.php の編集を行い、開発環境や本番環境の振り分けを行う。

例)
・ポートが8080の場合 → staging環境
・ホストが”localhost”の場合 → development環境
・上記に該当しない場合 → production環境

switch (isset($_SERVER['SERVER_PORT']) ? $_SERVER['SERVER_PORT'] : '') {

//テスト環境の場合
	case '8080':
		Fuel::$env = Fuel::STAGING;
		break;

//本番環境の場合(他の条件に該当しない)
	default:
		Fuel::$env = Fuel::PRODUCTION;
		break;
}

switch (isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : '') {

//開発環境の場合
	case 'localhost':
		Fuel::$env = Fuel::DEVELOPMENT;
		break;
}

考えてみれば単純なことなのにハマったので備忘録に残します。
ハマった時のケースはModule Aから共通Module(例ではModule B)のデータを表示する際にModule AのViewでModule BのModelをどう呼び出すか、というもの。(そもそも設計云々に問題があるというのは割愛します・・・)

■module Aからmodule BのModelを呼び出す場合。

module Aで

\Module::load('B');

と記述し、Module Bを読み込む。
確認方法は、

$loaded = Module::loaded();
var_dump($loaded);

とすれば、呼び出されていることが確認できます。

Modelでデータを取得する際は、

$persons = B\Model_Xxx::find('all');

というように、namespace(module名)を付ければ呼び出すことができます。

 

・・・何でこんなに悩んだんだろう。。。

 

FuelPHPのドキュメントにも例がありますが、FuelPHPのValidationでuniqueチェックを作ってみました。
本家の例ではValidationを拡張する例として記載があります。

http://fuelphp.com/docs/classes/validation/validation.html

 

但し、DBへのInsert時は上記の拡張例で問題ないのですが、Update時は、
更新するレコード自身を含めてしまうとuniqueチェックで引っかかってしまうため、除外する必要があります。
その処理を公式ドキュメントの例を参考にコードを追加してみました。

また、コアクラスを拡張しているため、/fuel/app/bootstrap.phpを編集する必要があります。

 

Autoloader::add_classes(array(
    // ここにオーバーライドしたいクラスを追加します
    // Example: 'View' => APPPATH.'classes/view.php',
    'Validation' => APPPATH.'classes/validation.php',
));

Modelのコード使用例は以下の通りです。

	public static function validate($id=null)
	{
		
		$val = \Validation::forge();
		$val->add_field('group_code', 'グループコード', 'required|min_length[1]|max_length[4]')
			->add_rule('unique', self::$_table_name . '.group_code', $id);

		return $val;
	}

Controllerのコード例は以下の通りです。

■Insert例

	$val = Model_Group::validate();

■Update例

	$val = Model_Group::validate($post->id);

CodeIgniterからWordprssを呼び出した際に苦労したから、FuelPHPからはどうだろうと思いやってみた。
とりあえずということでまずは投稿された記事が呼び出せるか?(ってか、まだこれしかしてない)
まずは、フォルダの構成。あまり深く考えず、ドキュメントルートにwordpressを置いてみた。

ドキュメントルートの名前はwpplus(適当)

wp_1

 

この状態でwordpressのインストールを実行。

 

次に、 /fuel/app/bootstrap.php の編集を行う。
ポイントは3行目の「 require ‘../wordpress/wp-load.php’; 」の部分。
10行目の「require COREPATH.’classes’.DIRECTORY_SEPARATOR.’autoloader.php’; 」の部分より、
前に呼び出す必要がある。

<?php

require '../wordpress/wp-load.php';

// Load in the Autoloader
require COREPATH.'classes'.DIRECTORY_SEPARATOR.'autoloader.php';
class_alias('Fuel\\Core\\Autoloader', 'Autoloader');

// Bootstrap the framework DO NOT edit this
require COREPATH.'bootstrap.php';
Autoloader::add_classes(array(
// Add classes you want to override here
// Example: 'View' => APPPATH.'classes/view.php',
));

// Register the autoloader
Autoloader::register();

/**
* Your environment. Can be set to any of the following:
*
* Fuel::DEVELOPMENT
* Fuel::TEST
* Fuel::STAGING
* Fuel::PRODUCTION
*/
Fuel::$env = (isset($_SERVER['FUEL_ENV']) ? $_SERVER['FUEL_ENV'] : Fuel::DEVELOPMENT);

// Initialize the framework with the config file.
Fuel::init('config.php');

次に、Controllerの作成。
ポイントは9行目の「 require_once ‘../wordpress/wp-blog-header.php’; 」の部分。
後はWordpressの関数を呼び出すことで記事の一覧を取得出来る。


というわけで、非常に簡単でした。

■modulesについて

・独立して動作させる

・HMVCを利用できる

・独立したルーティングを定義できる

 

■module化の手順

・config.phpの編集

/fuel/app/config/config.php を編集し、有効化する。

'module_paths' => array(
	APPPATH.'modules'.DS
),

・namespaceの設定

Controller や Modelに namespace の設定が必要になる。


■ルーティングの定義方法
/fuel/app/modules/(app名)/config/ にroutes.php を作成し、ルーティングを定義する。
ルーティングは通常の/fuel/app/config/routes.php とまったく同様。

FuelPHPでindex.phpを含むURI(mod rewriteで省略しない)場合、

paginationのリンク生成が正常に動作しないことを確認しました。

 

■例

http://localhost/app/public/index.php/aaa/bbb/list

■コントローラ: bbb

■メソッド:list

■paginationのconfig

$pagination = Pagination::forge(‘default’, array(
‘pagination_url’ => ‘/app/public/index.php/aaa/bbb/list’,
‘uri_segment’ => 4,
‘total_items’ => $count,
‘per_page’ => $this->per_page,
‘));

この場合、paginationで生成されるURLは、以下のようになりました。

http://localhost/app/public/index.php/aaa/bbb/2
※本来であれば、http://localhost/app/public/index.php/aaa/bbb/list/2となるはず

上記の例をmod rewriteでindex.phpを省略させた場合、正常に動作し、以下のURLが生成されました。

http://localhost/app/public/aaa/bbb/list/2

 

paginationのコードを追ったところ、以下の部分を変更することで正常に処理されるようになりました。

■FuelPHP 1.6の場合

543行目
○修正前

$segs[$this->config['uri_segment'] - 1 + $seg_offset] = '{page}'; 

○修正後

$segs[$this->config['uri_segment'] + $seg_offset] = '{page}'; 

 

この事象は恐らくバグだと思われます。
これはあくまで暫定の対処方法です。

 

FuelPHP 1.6をxampp(windows環境)で利用する際、composerをインストールしないと使えなくなりました。

FuelPHPをxamppに設置(解凍)してアクセスすると、以下のエラーが表示されます。

Composer is not installed. Please run “php composer.phar update” in the root to install Composer

丁寧に対処するためのコマンドが表示されますが、このコマンドは旧バージョンがインストールされていて、

それをアップデートするためのコマンドになります。

composerがインストールされていない環境では、”update”ではなく、”install”する必要があります。

インストールするためのコマンドは以下の通りです。

php composer.phar install

 

CodeIgniterをインストールした直後の設定では、URIパスの指定が無かった場合に呼び出される

コントローラ(デフォルトコントローラ)は、「welcome.php」となっている。

 

デフォルトコントローラを変更するには、「application/config/route.php」の一部を変更する必要がある。

○初期値

$route['default_controller'] = "welcome";

○変更例

$route['default_controller'] = "index";

上記の変更にて、「index.php」が呼び出されるようになる。

PHPの軽量フレームワーク CodeIgniterの備忘録

■フロントコントローラの設定

ドキュメントルートに設置したindex.phpで以下の2箇所を編集する。
セキュリティ上は、index.phpとは別の場所(公開ディレクトリではない場所)の方が良い。

○「system」ディレクトリのパスを設定
$system_path = ‘system’;

○「application」ディレクトリのパスを設定
$application_folder = ‘application’;

 

■環境の切り替え

index.phpの中で環境を定義することで変更・切り替えが可能

○開発環境
define(‘ENVIRONMENT’, ‘development’);
→ error_reporting(E_ALL);に設定される。

○テスト環境
define(‘ENVIRONMENT’, ‘testing’);
→ error_reporting(0) ; に設定される。

○本番環境
define(‘ENVIRONMENT’, ‘production’);
→ error_reporting(0) ; に設定される。

PEARのMDB2パッケージ使用例です。プレースホルダを用いています。
ちなみにDBパッケージはメンテナンスが終了しているため、使用が推奨されていません。


error_reporting(E_ALL);
if (error_reporting() > 6143) {

error_reporting(E_ALL & ~E_DEPRECATED);
}

require_once 'MDB2.php';

$dsn = array(
'phptype' => 'mysqli',
'username' => 'db_user',
'password' => 'db_password',
'hostspec' => 'localhost',
'database' => 'testDB',
);

$mdb2 =& MDB2::connect($dsn);

if (PEAR::isError($mdb2)) {

die($mdb2->getMessage());

}

///検索する名前を仮設定
$name = 'aaa';

$sql = "SELECT * FROM sampleTable WHERE name = ? ORDER BY id";

$stmt = $mdb2->prepare($sql, array('text'));
$res = $stmt->execute(array($name));