----------------------------------------------------------------------------------
【 ソフト名 】　CharcoalPHP
【バージョン】　0.5.0
【 公 開 日 】　2008/7/2
【 製作者名 】　stk2k
【 製作言語 】　PHP
【 配布条件 】　BSDライセンス
【ｿﾌﾄｳｪｱ種別】　オープンソースソフトウェア
----------------------------------------------------------------------------------

■CharcoalPHPについて

CharcoalPHPはPHP5以上で使用可能なWebアプリケーションフレームワークです。CharcoalPHPは以下のようなコンセプトで作られました。

・非MVC！
・プログラマに科す制約が少ない
・分かりやすさを重視することで学習コストが少なくてすむ
・インタフェースによる高度なプラグイン構造
・パフォーマンスはそこそこ
・依存ライブラリが少ない
・PHP5の機能を活用（例外など）
・DIコンテナ／コンポーネント志向

■確認環境

OS          : Windows XP/SP2
Web Server  : Apache 2.2.8(Win32)
Script      : PHP 5.2.5
DB          : MySQL 5.0.51a
              PostgreSQL 8.2.6

■構成

CharcoalPHPは下記の構成で配布されます。

----------------------------------------
・フレームワークコア
・コンポーネントライブラリ
・サンプルアプリケーション
----------------------------------------

≪フレームワークコア≫
　−フレームワークを構成するソース一式です。

≪コンポーネントライブラリ≫
　−CharcoalPHPが提供する基本的なコンポーネントです。本バージョンでは下記が提供されます。
　　−データベースアクセス
　　−ロガー
　　−ページャ
　　−リンク管理
　　−パンくずリスト
　　−メール送信

≪サンプルアプリケーション≫
　−CharcoalPHPの機能を紹介するためのサンプルアプリケーションです。本バージョンでは下記が提供されます。

　　−hello_world　　最小のCharcoalPHPアプリケーション
　　−breadcrumb　　 パンくずリスト／Linkerコンポーネントを利用したサンプル
　　−pear_db　　　　データベースアクセスコンポーネントを利用したサンプル（※調整中のため、ver0.5.0では動作しません）
　　−smarty　　　　 Smartyによるビュー実装
　　−session　　　　セッション処理（※調整中のため、ver0.5.0では動作しません）
　　−form　　　　　 自動フォーム機能（SmartForm）（※調整中のため、ver0.5.0では動作しません）
　　−shell　　　　　CLI版PHP向けシェルプログラムサンプル

■外部ライブラリ

CharcoalPHPが依存する外部ライブラリは下記のとおりです。

≪フレームワークコア≫
・Spyc（http://spyc.sourceforge.net/）
・PEAR::Cache_Lite（設定キャッシュ利用の場合、デフォルトは不要）

≪コンポーネントライブラリ≫
・データベースアクセスコンポーネント
　−PEAR::DB
・メール送信コンポーネント
　−PEAR :: Mail
　−PEAR :: Mail_Mime

■特徴

≪フレームワークコア≫
・XMLより分かりやすい、YAML形式の設定ファイル
・タスクによる独立性の高いロジック構造
・イベント／タスクによる疑似並行処理
・タスクのFSM（有限状態マシン）機能による画面遷移制御をサポート
・フォーム自動レンダリング（SmartForm＋html_objects）
・テーブルアソシエーションにも対応したORM機能（SmartGateway）
・データソース、SQLビルダによるRDBMS接続プラグイン（現在はMySQLとPostgreSQLのみ）
・レイアウトマネージャによる自由度の高いビュー
・入力／出力フィルタによるデータ変換処理
・クラスローダによるクラスソース自動読み込み機能
・$_SESSIONを意識しないセッション管理機構
・コンポーネントの自動セッション保存／復元機能（sessionスコープ）
・レイアウトマネージャによる自由度の高いビュー
　−デフォルトでSmarty、PHPTALレンダラを搭載（別途ライブラリが必要）


■注意

・CharcoalPHPの文字コードはEUC-JPで記述されています。

■インストール方法

１．アーカイブを解凍
---------------------------------------------------------

charcoalphp-x.x.x.zip（xはバージョン番号）をアーカイバプログラムで解凍してください。

２．Webサーバディレクトリを作成
---------------------------------------------------------

CharcoalPHPアプリケーションを配置するディレクトリを作成します。Webサーバのドキュメントルートディレクトリ以下に適当なディレクトリ（ここではcharcoalとします）を作成してください。

$DocumentRoot/charcoal


３．フレームワークコアクラスを配置
---------------------------------------------------------

１を解凍してできたファイル、ディレクトリをすべて、２で作成したディレクトリ以下にコピーします。


■サンプルアプリケーション

ローカルマシン上にインストールした場合、下記のURLからアクセスできます。

http://localhost/charcoal/public_html/


■免責事項

本本ソフトウェアの利用、改変、再配布は自由ですが、本ソフトウェアを利用、または本ソフトウェアを利用するソフトウェア
の利用により生じたいかなる損害についても保証はいたしかねます。


■今後の予定

≪フレームワークコア≫
　−Webフロー機能の実装
　−バリデーション機能の実装
　−フォーム機能の実装                   (済)
　−多言語化（i18n）対応
　−セッション管理方法のプラグイン化     (済)
　−２重投稿防止トークン
　−一連処理（シーケンス）の実相
　−CLI対応                              (済)
　−CSML(CharcoalScreenMarkupLanguage／仮）対応
　−フレームワーク標準テンプレートシステム
　−AJAX対応（ウィジェット）
　−設定ファイルのPHP化（検討中）
　−タスクからのモジュール呼び出し

≪コンポーネントライブラリ≫
　−データベースアクセスコンポーネント
　　−MySQL以外のDBへの対応                     (済)
　　−ADOdb／PDOの検討
　　−O/Rマッピング                             (済)
　　−DBクラスの複数テーブル（JOIN）対応        (済)
　−メール送信コンポーネント
　　−添付ファイル対応

≪その他≫
　−Scaffolding機能
　−パフォーマンスチューニング

■変更履歴

2008-07-02 ver.0.5.0

　◆仕様変更／機能追加

　【全体】
　　−クラス名のcharcoalプリフィックスをすべて削除

　【コア】
　　−CHARCOAL_RUNMODEでランモード（下記参照）を指定するようにしました。フロントコントローラ（index.php）の先頭でdefineしてください。
　　　（未定義の場合、UnexpectedRunModeExceptionがスローされます）
　　　−http＝Webアプリケーション
　　　　−最初にロードされるプロファイルのファイル名は「ホスト名.global.ini」
　　　−shell＝シェルアプリケーション
　　　　−最初にロードされるプロファイルのファイル名は「shell.global.ini」（固定）

　　−XxxFactoryクラスをFactoryクラスにまとめました。アプリに影響はありません。

　　−ConfigLoader#loadConfigで先頭がdefault（default.オブジェクト名.yml）のデフォルト定義ファイルを読まないようにしました。混乱を避け
　　　るためと、パフォーマンス向上のためです。

　　−ディスパッチャ、モジュールグラフは廃止され、代わりにタスクマネージャ、タスクが導入されました。

　　−パフォーマンス上ネックになっていたログ出力箇所をいくつか削除または移動しました。

　　−FrameworkClassLoaderを最適化しました。

　　−その他、いくつかパフォーマンスチューニングのためのリファクタリングを行いました。

　◆バグ修正

　【全体】
　　−php.iniのshort_open_tagがtrueだとPHPとして解釈されないソースを修正（ショートタグで記述しているスクリプトがあった）しました。

　◆今後の予定

　　−ProcedureContextはタスク毎のContextとして分離される予定です。
　　−現在Contextからセッションを取得できますが、タスクがスコープ（sessionスコープ）をサポートすれば不要になりますので削除します。
　　−テンプレートにロジックを書かなければならないケースは、CSML（Charcoal Screen Markup Language）で解決する予定です。CSMLコンパイラと
　　　標準のテンプレートエンジンが連携することでテンプレートファイルがより奇麗に記述できます。
　　−タスクの処理を共通化するため、タスクからモジュールを呼び出せるようにします。
　　−WebAPIや外部URL読み込み時にブロックされる時間を短縮するための並行処理をサポートします。
　　−AJAXに対応します。
　　−フォームバリデータ、DBバリデータを実装します。


2008-06-23 ver.0.4.0

　◆仕様変更／機能追加

　【コア】
　　−スクリプトのタイムアウトをプロファイルで指定できるようにしました（SCRIPT_TIMEOUT）。単位は秒、初期値は10分（=600秒）です。
　　　−例）タイムアウト時間を1時間（=3600秒）にする
　　　　　　　SCRIPT_TIMEOUT=3600
　【DB】
　　−テーブルアソシエーション（階層クエリ機能）が追加されました。階層クエリはテーブルモデルに以下の設定を行うことにより、フレーム
　　　ワークにより自動的に処理されます。詳細はサンプルプログラム「pear_db」のソースを参照してください。

　　　−テーブルモデルクラスでのアノテーション指定：

　　　　　var $relation_name    = '@relation @target:[target_model_name] @linkage:[linkage] @extract:[extract]'

            [relation_name]       : 関連名
            [target_model_name]   : 関連先テーブルモデル名（config/table_modelsに定義が必要）
            [linkage]             : リンケージ指定
                                         inner  : 関連元に外部キーがある（デフォルト）
                                         outer  : 関連先に外部キーがある
            [extract]             : フィールド展開方法
                                         array  : 検索結果を配列として、アノテーションの指定対象の属性にセット（デフォルト）
                                         field  : 検索結果の最初のレコードを、展開用フィールドに展開

　　　−テーブルモデルクラスでの展開フィールド指定：

　　　　　var $extract_field    = '@extract @source:[model_name]/[field_name]'

            [extract_field]       : 展開フィールド名
            [model_name]          : 展開元テーブルモデル名（config/table_modelsに定義が必要）
            [field_name]          : 展開元フィールド名


2008-06-02 ver.0.3.2

　◆仕様変更／機能追加

　【コア】
　　−タイムゾーンをプロファイルで指定できるようにしました（DEFAULT_TIMEZONE)。
　　　−例）　DEFAULT_TIMEZONE=Asia/Tokyo
　【エラードキュメント】
　　−エラードキュメントのファイル名を固定に変更（ステータスコード + .tml）
　　　−例）　404.html
　【DB】
　　−queryメソッドで文字エンコーディングを自動変換するオプションを追加
　【エラー表示】
　　−引数がクラスのときクラス名が正しく表示されない不具合を修正
　　−バックトレースが関数の場合に対応
　【ログ】
　　−ログにレベル（F/E/W/I/D/T）を出力するように修正
　【フォーム】
　　−フォームモデルのアノテーション「@value:%DTO_VALUE%」を廃止、デフォルトでDTO値をセットするように変更
　　−選択リスト取得メソッド（IFormMode#getChoiceList）の引数にProcedureContextを追加
　　−フォームモデルアノテーションに「@hidden」を追加
　　　−@hiddenを指定されたフィールドはHTMLレンダリング時に<input type="hidden">を出力する

　◆バグ修正

　【エラードキュメント】
　　−エラードキュメントのディレクトリ配置が間違っていたのを修正

2008-05-30 ver.0.3.1

　◆仕様変更／機能追加

　【設定ファイル】
　　−CharcoalPHPが提供するデフォルト実装の設定ファイルに関してはweb_app以下にコピーする必要がなくなりました。
　　　−フレームワーク提供クラスのカテゴリ
　　　　−data_sources
　　　　　−pear_db
　　　　−dispatchers
　　　　　−simple_dispatcher
　　　　−filters
　　　　　−encoding_output
　　　　−loggers
　　　　　−app
　　　　　−debug
　　　　　−sql
　　　　　−system
　　　　−renderers
　　　　　−smarty
　　　　−session_handlers
　　　　　−default_session_handler
　　　　−sql_builders
　　　　　−mysql
　　　　−transformers
　　　　　−simple_transformer
　【DB】
　　−find系メソッドは配列の配列を返していたが、charcoal_DTOオブジェクトの配列を返すように変更しました。
　【フォーム】
　　−入力時と出力時に違うフォームを扱うケースなどを考慮し、ProcedureContext経由での取得（$context->form）をやめ、getFormメソッド
　　で動的に取得する方法（ProcedureContext#getForm）に変更しました。
　　−フォームモデルでfieldレベルでパネル定義しなくても動的に作成するよう変更しました。
　【モジュール】
　　−IModule::executeに引数actionを追加しました。actionを判定することで複数のモジュールを１つにまとめることができるようになりました。
　　　−例）
　　　　　　ShouhinAddModule/ShouhinDelModule/ShouhinUpdateModule ===> ShouhinModule
　【デバッグ】
　　−エラー一覧画面でメソッドの引数名、型、デフォルト値まで参照できるようになりました。

　◆バグ修正

　【セッション】
　　−charcoal_Session#removeで消したデータが_SESSIONに保存されてしまうバグを修正

2008-05-27 ver.0.3.0-alpha

　【DB】
　　−DataModelをTableModelに名称変更
　【フォーム】
　　−フォームモデルを実装(/core/form_models）
　　−HTMLObjectを実装(/core/html_objects）
　　−DTOトランスフォーマを実装（/core/transformers）
　【セッション】
　　−セッションハンドラを実装(/core/session_handlers）、セッション機構をプラグイン化
　【URLマッピング】
　　−URLマッパを実装（/core/url_mappers）、静的URL（mod_rewite）に対応

2008-05-18 ver.0.2.0-alpha

　−配列アクセス時のE_NOTICEを解消
　−Requestクラスの内部でGETとPOSTのデータを分けて管理するように変更
　　−GETパラメータのみ取り出したいときは以下のようにする。
　　　　　　$data = $request->get( $key, charcoal_Request::TYPE_GET );
　−クラスローダとセッション処理をModuleGraphProcedure$execute()からFramework#run()に移動
　−EncodingConverterクラスにfromStringメソッドを追加。合わせてコンストラクタはprivateに変更
　−DBコンポーネント（db:DataGateway）を削除、charcoal_DBクラスを追加（$context->dbで取得可能）。
　　−SQLビルダを追加〜RDBMSごとにSQLを生成するクラスを定義可能にした（sql_buildersに配置）
　　−データソースを追加〜データベースアクセスライブラリごとにDB接続／処理を行うクラスを定義可能にした（data_sourcesに配置）
　　　−データベースの接続設定はデータソース設定ファイル（config/data_sources/xxx.data_source.yml）で行う。
　　　　−形式は以下のとおり
　　　　　　−backend: データベースバックエンド。指定の方法はデータソースの実装によります。
　　　　　　−user: データベース接続ユーザ名。
　　　　　　−password: データベース接続パスワード
　　　　　　−server: 接続先サーバ名
　　　　　　−db_name: 接続先データベース名
　　　　　　−charset: 接続時の文字コード

2008-05-14 ver.0.1.0-alpha

　−すべてのクラス名の先頭に「charcoal_」プレフィックスを付与
　−モジュールグラフ設定ファイルのフォーマット変更：「graph_nodes」を追加
　−プロファイル名をグローバルプロファイルの中で変更可能に：　PROFILE_NAMEで指定
　−Configルートにあるproc_list.iniに登録されていないプロシージャ名が指定された場合はエラードキュメントを表示するようにした
　−HttpException例外クラスを追加：　ソース中でステータスコードを引数にHttpException例外を投げることで自動的にエラードキュメントが表示される。
　−ログ出力方法を変更：　ロガーをプラグイン化できるようにした。グローバルプロファイル内で下記のように指定。
　　　−LOG_ENABLED：　ログ機能のON/OFFを指定
　　　−LOG_LEVEL：　ログ出力レベルを指定（F:FATAL E:ERROR W:WARNING I:INFO D:DEBUG T:TRACE）
　　　−LOG_LOGGERS：　ロガー名を指定（カンマ区切りで複数指定可）
　−DBのリスト項目など、頻繁に変化しない項目などのデータをキャッシュする機能を追加（リソースキャッシュ）
　−ModuleContextクラスを改名し、ProcedureContextとした。
　−モジュールグラフからレンダリングへのパラメータ転送をProcedureContextではなくResponseオブジェクトを経由するように変更

2008-04-22 ver.0.0.1-alpha

　−初回リリース

