Source for file Controller.php
Documentation is available at Controller.php
// vim: foldmethod=marker
* @author Masaki Fujimoto <fujimoto@php.net>
* @license http://www.opensource.org/licenses/bsd-license.php The BSD License
* @version $Id: ed3adc07c3452a1f5c89f098bde0f73f0e6125cd $
* @todo gatewayでswitchしてるところがダサダサ
* @author Masaki Fujimoto <fujimoto@php.net>
/** @var string アプリケーションID */
/** @var string アプリケーションベースディレクトリ */
/** @protected string アプリケーションベースURL */
/** @protected string アプリケーションDSN(Data Source Name) */
/** @protected array アプリケーションディレクトリ */
/** @protected array アプリケーションディレクトリ(デフォルト) */
'action' =>
'app/action',
'action_cli' =>
'app/action_cli',
'action_xmlrpc' =>
'app/action_xmlrpc',
'plugin' =>
'app/plugin',
'filter' =>
'app/filter',
'template' =>
'template',
/** @protected array DBアクセス定義 */
/** @protected array 拡張子設定 */
/** @protected array クラス設定 */
/** @protected array クラス設定(デフォルト) */
'class' =>
'Ethna_ClassFactory',
'backend' =>
'Ethna_Backend',
'config' =>
'Ethna_Config',
'error' =>
'Ethna_ActionError',
'form' =>
'Ethna_ActionForm',
'logger' =>
'Ethna_Logger',
'plugin' =>
'Ethna_Plugin',
'renderer' =>
'Ethna_Renderer_Smarty',
'session' =>
'Ethna_Session',
'view' =>
'Ethna_ViewClass',
'url_handler' =>
'Ethna_UrlHandler',
/** @protected array フィルタ設定 */
/** @protected string 使用ロケール設定 */
/** @protected string システム側エンコーディング */
/** @protected string クライアント側エンコーディング */
/** ブラウザからのエンコーディングを指す */
/** @protected string 現在実行中のアクション名 */
/** @protected string 現在実行中のXMLRPCメソッド名 */
/** @protected array forward定義 */
/** @protected array デフォルトのforward定義 */
'403' =>
array( 'view_name' =>
'Ethna_View_403',),
'404' =>
array( 'view_name' =>
'Ethna_View_404',),
'500' =>
array( 'view_name' =>
'Ethna_View_500',),
'json' =>
array( 'view_name' =>
'Ethna_View_Json',),
'redirect' =>
array( 'view_name' =>
'Ethna_View_Redirect',),
/** @protected array action定義 */
/** @protected array action(CLI)定義 */
/** @protected array action(XMLRPC)定義 */
/** @protected array アプリケーションマネージャ定義 */
/** @protected object レンダラー */
/** @protected array フィルターチェイン(Ethna_Filterオブジェクトの配列) */
/** @protected object Ethna_ClassFactory クラスファクトリオブジェクト */
/** @protected object Ethna_ActionForm フォームオブジェクト */
/** @protected object Ethna_View ビューオブジェクト */
/** @protected object Ethna_Config 設定オブジェクト */
/** @protected object Ethna_Logger ログオブジェクト */
/** @protected object Ethna_Plugin プラグインオブジェクト */
/** @protected string リクエストのゲートウェイ(www/cli/rest/xmlrpc/soap...) */
* Ethna_Controllerクラスのコンストラクタ
$GLOBALS['_Ethna_controller'] =
$this;
if ($this->base ===
"") {
// EthnaコマンドなどでBASEが定義されていない場合がある
if (isset
($this->class[$key]) ==
false) {
$this->class[$key] =
$val;
if (isset
($this->directory[$key]) ==
false) {
$class_factory =
$this->class['class'];
// ディレクトリ名の設定(相対パス->絶対パス)
foreach ($this->directory as $key =>
$value) {
// Smartyプラグインディレクトリは配列で指定する
$tmp[] =
$this->base .
(empty($this->base) ?
'' :
'/') .
$elt;
// フレームワークとしての内部エンコーディングはクライアント
// エンコーディング(=ブラウザからのエンコーディング)
// @see Ethna_Controller#_getDefaultLanguage
if (empty($this->url) &&
PHP_SAPI !=
'cli') {
// include Ethna_Plugin_Abstract for all plugins
$this->plugin->includePlugin('Abstract');
//// assert (experimental)
//if ($this->config->get('debug') === false) {
// ini_set('assert.active', 0);
* (現在アクティブな)コントローラのインスタンスを返す
* @return object Ethna_Controller コントローラのインスタンス
if (isset
($GLOBALS['_Ethna_controller'])) {
return $GLOBALS['_Ethna_controller'];
* @return string アプリケーションID
* @param string $id アプリケーションID
* @return mixed true:OK Ethna_Error:NG
// アプリケーションIDはクラス名のprefixともなるため、
// @see http://www.php.net/manual/en/language.variables.php
if (preg_match('/^[a-zA-Z][a-zA-Z0-9]*$/', $id) ===
0) {
?
"Application ID must NOT start with Number.\n"
:
"Only Numeric(0-9) and Alphabetical(A-Z) is allowed for Application Id\n";
* @param string $action_name アクション名
* @return mixed true:OK Ethna_Error:NG
if (preg_match('/^[a-zA-Z\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/',
* @param string $view_name ビュー名
* @return mixed true:OK Ethna_Error:NG
if (preg_match('/^[a-zA-Z\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/',
* @param string $db_key DBキー
public function getDSN($db_key =
"")
if (isset
($this->dsn[$db_key]) ==
false) {
return $this->dsn[$db_key];
* @param string $db_key DBキー
* @return bool true:persistent false:non-persistent(あるいは設定無し)
$key =
sprintf("dsn%s_persistent", $db_key ==
"" ?
"" :
"_$db_key");
$dsn_persistent =
$this->config->get($key);
* @param string $db_key DBキー("", "r", "rw", "default", "blog_r"...)
* @return string $db_keyに対応するDB種別定義(設定が無い場合はnull)
if (isset
($this->db[$db_key]) ==
false) {
return $this->db[$db_key];
* @return string アプリケーションベースURL
* @return string アプリケーションベースディレクトリ
* クライアントタイプ/言語からテンプレートディレクトリ名を決定する
* デフォルトでは [appid]/template/ja_JP/ (ja_JPはロケール名)
* ロケール名は _getDefaultLanguage で決定される。
* @return string テンプレートディレクトリ
* @see Ethna_Controller#_getDefaultLanguage
// _getDerfaultLanguageメソッドでロケールが指定されていた場合は、
// テンプレートディレクトリにも自動的にそれを付加する。
$template .=
'/' .
$this->locale;
* @return string アクションディレクトリ
* @return string ビューディレクトリ
* (action,view以外の)テストケースを置くディレクトリ名を決定する
* @return string テストケースを置くディレクトリ
* @param string $key ディレクトリタイプ("tmp", "template"...)
* @return string $keyに対応したアプリケーションディレクトリ(設定が無い場合はnull)
if (isset
($this->directory[$key]) ==
false) {
* @param string $key type
* @return string $key directory
* @param string $key 拡張子タイプ("php", "tpl"...)
* @return string $keyに対応した拡張子(設定が無い場合はnull)
if (isset
($this->ext[$key]) ==
false) {
* @return object Ethna_ClassFactory クラスファクトリオブジェクト
* @return object Ethna_ActionError アクションエラーオブジェクト
* Accessor for ActionForm
* @return object Ethna_ActionForm アクションフォームオブジェクト
* if the ::$action_form class is not null, then cannot set the view
* @return object Ethna_ActionForm アクションフォームオブジェクト
* @return object Ethna_View ビューオブジェクト
* if the ::$view class is not null, then cannot set the view
* @param $view object Ethna_ViewClass
if ($this->view !==
null) {
* @return object Ethna_Backend backendオブジェクト
* @return object Ethna_Config 設定オブジェクト
* @return object Ethna_I18N i18nオブジェクト
* @return object Ethna_Logger ログオブジェクト
* @return object Ethna_Session セッションオブジェクト
* @return object Ethna_AppSQL SQLオブジェクト
* @return object Ethna_Plugin プラグインオブジェクト
* @return object Ethna_UrlHandler URLハンドラオブジェクト
* @return string 実行中のアクション名
* @return string 実行中のXMLRPCメソッド名
* @return array ロケール名(e.x ja_JP, en_US 等),
* (ロケール名は、ll_cc の形式。ll = 言語コード cc = 国コード)
* @see http://www.gnu.org/software/gettext/manual/html_node/Locale-Names.html
* @return string ロケール名(e.x ja_JP, en_US 等),
* (ロケール名は、ll_cc の形式。ll = 言語コード cc = 国コード)
* @param $locale ロケール名(e.x ja_JP, en_US 等),
* (ロケール名は、ll_cc の形式。ll = 言語コード cc = 国コード)
* クライアントエンコーディング名へのアクセサ(R)
* @return string $client_encoding クライアントエンコーディング名
* クライアントエンコーディング名へのアクセサ(W)
* @param string $client_encoding クライアントエンコーディング名
* @param string $class_name アプリケーションコントローラのクラス名
* @param mixed $action_name 指定のアクション名(省略可)
* @param mixed $fallback_action_name アクションが決定できなかった場合に実行されるアクション名(省略可)
public static function main($class_name, $action_name =
"", $fallback_action_name =
"")
$c->trigger($action_name, $fallback_action_name);
* @param string $class_name アプリケーションコントローラのクラス名
* @param string $action_name 実行するアクション名
* @param bool $enable_filter フィルタチェインを有効にするかどうか
public static function main_CLI($class_name, $action_name, $enable_filter =
true)
$c->action_cli[$action_name] =
array();
$c->trigger($action_name, "", $enable_filter);
* XMLRPCアプリケーションのエントリポイント
die("xmlrpc extension is required to enable this gateway");
$c->trigger("", "", false);
* @param string $class_name アプリケーションコントローラのクラス名
* @param mixed $action_name 指定のアクション名(省略可)
* @param mixed $fallback_action_name アクションが決定できなかった場合に実行されるアクション名(省略可)
public static function main_SOAP($class_name, $action_name =
"", $fallback_action_name =
"")
$c->trigger($action_name, $fallback_action_name);
* @param mixed $default_action_name 指定のアクション名
* @param mixed $fallback_action_name アクション名が決定できなかった場合に実行されるアクション名
* @param bool $enable_filter フィルタチェインを有効にするかどうか
* @return mixed 0:正常終了 Ethna_Error:エラー
public function trigger($default_action_name =
"", $fallback_action_name =
"", $enable_filter =
true)
$this->_trigger_WWW($default_action_name, $fallback_action_name);
$this->_trigger_CLI($default_action_name);
$this->_trigger_XMLRPC();
* 引数$default_action_nameに配列が指定された場合、その配列で指定された
* アクション以外は受け付けない(指定されていないアクションが指定された
* 場合、配列の先頭で指定されたアクションが実行される)
* @param mixed $default_action_name 指定のアクション名
* @param mixed $fallback_action_name アクション名が決定できなかった場合に実行されるアクション名
* @return mixed 0:正常終了 Ethna_Error:エラー
private function _trigger_WWW($default_action_name =
"", $fallback_action_name =
"")
$action_name =
$this->_getActionName($default_action_name, $fallback_action_name);
if ($fallback_action_name !=
"") {
$this->logger->log(LOG_DEBUG, 'undefined action [%s] -> try fallback action [%s]', $action_name, $fallback_action_name);
$action_obj =
$this->_getAction($fallback_action_name);
$action_name =
$fallback_action_name;
$r =
$this->filter_chain[$i]->preActionFilter($action_name);
$forward_name =
$backend->perform($action_name);
$r =
$this->filter_chain[$i]->postActionFilter($action_name, $forward_name);
// コントローラで遷移先を決定する(オプション)
$forward_name_params =
$this->_sortForward($action_name, $forward_name);
$preforward_params =
array();
$preforward_params =
$forward_name_params;
$forward_name =
$forward_name_params;
if ($forward_name !=
null) {
$this->view =
new $view_class_name($backend, $forward_name, $this->_getForwardPath($forward_name));
* @param mixed $default_action_name 指定のアクション名
* @return mixed 0:正常終了 Ethna_Error:エラー
private function _trigger_CLI($default_action_name =
"")
return $this->_trigger_WWW($default_action_name);
* フレームワークの処理を実行する(XMLRPC)
* @param mixed $action_name 指定のアクション名
* @return mixed 0:正常終了 Ethna_Error:エラー
private function _trigger_XMLRPC($action_name =
"")
$xmlrpc_gateway_method_name =
"_Ethna_XmlrpcGateway";
$xmlrpc_gateway_method_name,
'escaping' =>
array('markup'),
$xmlrpc_gateway_method_name,
$xmlrpc_gateway_method_name
'escaping' =>
array('markup'),
header('Content-Type: text/xml; charset=UTF-8');
* _trigger_XMLRPCのコールバックメソッド
private function trigger_XMLRPC($method, $param)
foreach ($def as $key =>
$value) {
if (isset
($param[$n]) ==
false) {
$r =
$backend->perform($method);
private function _trigger_SOAP()
$script =
$gg->generate();
$server =
new SoapServer(null, array('uri' =>
$this->config->get('url')));
$server->setClass($gg->getClassName());
* エラー発生時の追加処理を行いたい場合はこのメソッドをオーバーライドする
* (アラートメール送信等−デフォルトではログ出力時にアラートメール
* が送信されるが、エラー発生時に別にアラートメールをここで送信
* @param object Ethna_Error エラーオブジェクト
list
($log_level, $dummy) =
$this->logger->errorLevelToLogLevel($error->getLevel());
$message =
$error->getMessage();
$this->logger->log($log_level, sprintf("%s [ERROR CODE(%d)]", $message, $error->getCode()));
* @param int $code エラーコード
* @return string エラーメッセージ
$message_list =
$GLOBALS['_Ethna_error_message_list'];
for ($i =
count($message_list)-
1; $i >=
0; $i--
) {
return $message_list[$i][$code];
* @param mixed $default_action_name 指定のアクション名
* @return string 実行するアクション名
private function _getActionName($default_action_name, $fallback_action_name)
// フォームから要求されたアクション名を取得する
$form_action_name =
preg_replace('/[^a-z0-9\-_]+/i', '', $form_action_name);
$this->logger->log(LOG_DEBUG, 'form_action_name[%s]', $form_action_name);
// Ethnaマネージャへのフォームからのリクエストは拒否
if ($form_action_name ==
"__ethna_info__" ||
$form_action_name ==
"__ethna_unittest__") {
// フォームからの指定が無い場合はエントリポイントに指定されたデフォルト値を利用する
if ($form_action_name ==
"" &&
count($default_action_name) >
0) {
$tmp =
is_array($default_action_name) ?
$default_action_name[0] :
$default_action_name;
if ($tmp{strlen($tmp)-
1} ==
'*') {
$this->logger->log(LOG_DEBUG, '-> default_action_name[%s]', $tmp);
$action_name =
$form_action_name;
// エントリポイントに配列が指定されている場合は指定以外のアクション名は拒否する
if ($this->_isAcceptableActionName($action_name, $default_action_name) ==
false) {
// 指定以外のアクション名で合った場合は$fallback_action_name(or デフォルト)
$tmp =
$fallback_action_name !=
"" ?
$fallback_action_name :
$default_action_name[0];
if ($tmp{strlen($tmp)-
1} ==
'*') {
$this->logger->log(LOG_DEBUG, '-> fallback_action_name[%s]', $tmp);
$this->logger->log(LOG_DEBUG, '<<< action_name[%s] >>>', $action_name);
* アプリケーションの性質に応じてこのメソッドをオーバーライドして下さい。
* デフォルトでは"action_"で始まるフォーム値の"action_"の部分を除いたもの
* ("action_sample"なら"sample")がアクション名として扱われます
* @return string フォームにより要求されたアクション名
if (isset
($_SERVER['REQUEST_METHOD']) ==
false) {
if ($_SERVER['REQUEST_METHOD'] ==
"GET") {
} else if ($_SERVER['REQUEST_METHOD'] ==
"POST") {
if (empty($_SERVER['URL_HANDLER']) ==
false) {
$tmp_vars['__url_handler__'] =
$_SERVER['URL_HANDLER'];
$tmp_vars['__url_info__'] = isset
($_SERVER['PATH_INFO']) ?
$_SERVER['PATH_INFO'] :
null;
$tmp_vars =
$url_handler->requestToAction($tmp_vars);
if ($_SERVER['REQUEST_METHOD'] ==
"GET") {
} else if ($_SERVER['REQUEST_METHOD'] ==
"POST") {
if (strcasecmp($_SERVER['REQUEST_METHOD'], 'post') ==
0) {
// フォーム値からリクエストされたアクション名を取得する
$action_name =
$sub_action_name =
null;
foreach ($http_vars as $name =>
$value) {
if ($value ==
"" ||
strncmp($name, 'action_', 7) !=
0) {
// value="dummy"となっているものは優先度を下げる
if ($action_name ==
null) {
$action_name =
$sub_action_name;
* アクション名を指定するクエリ/HTMLを生成する
* @param string $action action to request
* @param string $type hidden, url...
} else if ($type ==
"url") {
* フォームにより要求されたアクション名に対応する定義を返す
* @param string $action_name アクション名
public function _getAction($action_name, $gateway =
null)
if (isset
($action[$action_name])) {
$action_obj =
$action[$action_name];
if (isset
($action_obj['inspect']) &&
$action_obj['inspect']) {
$this->logger->log(LOG_DEBUG, "action [%s] is not defined -> try default", $action_name);
if (isset
($action_obj['class_name']) ==
false) {
if (isset
($action_obj['form_name']) ==
false) {
} else if (class_exists($action_obj['form_name']) ==
false) {
// 明示指定されたフォームクラスが定義されていない場合は警告
$this->logger->log(LOG_WARNING, 'stated form class is not defined [%s]', $action_obj['form_name']);
$this->logger->log(LOG_NOTICE, 'action class is not defined [%s]', $action_obj['class_name']);
$this->logger->log(LOG_DEBUG, 'form class is not defined [%s] -> falling back to default [%s]', $action_obj['form_name'], $class_name);
$action_obj['form_name'] =
$class_name;
$action_obj['inspect'] =
true;
$action[$action_name] =
$action_obj;
return $action[$action_name];
* アクション名とアクションクラスからの戻り値に基づいて遷移先を決定する
* @param string $action_name アクション名
* @param string $retval アクションクラスからの戻り値
foreach ($this->filter as $filter) {
$filter_plugin =
$this->plugin->getPlugin('Filter', $filter);
* アクション名が実行許可されているものかどうかを返す
* @param string $action_name リクエストされたアクション名
* @param array $default_action_name 許可されているアクション名
* @return bool true:許可 false:不許可
private function _isAcceptableActionName($action_name, $default_action_name)
foreach (to_array($default_action_name) as $name) {
if ($action_name ==
$name) {
} else if ($name{strlen($name)-
1} ==
'*') {
* 指定されたアクションのフォームクラス名を返す(オブジェクトの生成は行わない)
* @param string $action_name アクション名
* @return string アクションのフォームクラス名
return $action_obj['form_name'];
* アクションに対応するフォームクラス名が省略された場合のデフォルトクラス名を返す
* デフォルトでは[プロジェクトID]_Form_[アクション名]となるので好み応じてオーバライドする
* @param string $action_name アクション名
* @return string アクションフォーム名
$r =
sprintf("%s_%sForm_%s", $this->getAppId(), $gateway_prefix ?
$gateway_prefix .
"_" :
"", $postfix);
$this->logger->log(LOG_DEBUG, "default action class [%s]", $r);
* getDefaultFormClass()で取得したクラス名からアクション名を取得する
* getDefaultFormClass()をオーバーライドした場合、こちらも合わせてオーバーライド
* @param string $class_name フォームクラス名
if (preg_match("/$prefix(.*)/", $class_name, $match) ==
0) {
* アクションに対応するフォームパス名が省略された場合のデフォルトパス名を返す
* デフォルトでは_getDefaultActionPath()と同じ結果を返す(1ファイルに
* アクションクラスとフォームクラスが記述される)ので、好みに応じて
* @param string $action_name アクション名
* @return string form classが定義されるスクリプトのパス名
* 指定されたアクションのクラス名を返す(オブジェクトの生成は行わない)
* @param string $action_name アクションの名称
* @return string アクションのクラス名
if ($action_obj ==
null) {
return $action_obj['class_name'];
* アクションに対応するアクションクラス名が省略された場合のデフォルトクラス名を返す
* デフォルトでは[プロジェクトID]_Action_[アクション名]となるので好み応じてオーバライドする
* @param string $action_name アクション名
* @return string アクションクラス名
$r =
sprintf("%s_%sAction_%s", $this->getAppId(), $gateway_prefix ?
$gateway_prefix .
"_" :
"", $postfix);
$this->logger->log(LOG_DEBUG, "default action class [%s]", $r);
* getDefaultActionClass()で取得したクラス名からアクション名を取得する
* getDefaultActionClass()をオーバーライドした場合、こちらも合わせてオーバーライド
* @param string $class_name アクションクラス名
if (preg_match("/$prefix(.*)/", $class_name, $match) ==
0) {
* アクションに対応するアクションパス名が省略された場合のデフォルトパス名を返す
* デフォルトでは"foo_bar" -> "/Foo/Bar.php"となるので好み応じてオーバーライドする
* @param string $action_name アクション名
* @return string アクションクラスが定義されるスクリプトのパス名
$this->logger->log(LOG_DEBUG, "default action path [%s]", $r);
* 指定された遷移名に対応するビュークラス名を返す(オブジェクトの生成は行わない)
* @param string $forward_name 遷移先の名称
* @return string view classのクラス名
if ($forward_name ==
null) {
if (isset
($this->forward[$forward_name])) {
$forward_obj =
$this->forward[$forward_name];
if (isset
($forward_obj['view_name'])) {
$class_name =
$forward_obj['view_name'];
} else if (is_null($class_name) ==
false) {
$this->logger->log(LOG_WARNING, 'stated view class is not defined [%s] -> try default', $class_name);
$this->logger->log(LOG_DEBUG, 'view class is not defined for [%s] -> use default [%s]', $forward_name, $class_name);
* 遷移名に対応するビュークラス名が省略された場合のデフォルトクラス名を返す
* デフォルトでは[プロジェクトID]_View_[遷移名]となるので好み応じてオーバライドする
* @param string $forward_name forward名
* @return string view classクラス名
$r =
sprintf("%s_%sView_%s", $this->getAppId(), $gateway_prefix ?
$gateway_prefix .
"_" :
"", $postfix);
$this->logger->log(LOG_DEBUG, "default view class [%s]", $r);
* 遷移名に対応するビューパス名が省略された場合のデフォルトパス名を返す
* デフォルトでは"foo_bar" -> "/Foo/Bar.php"となるので好み応じてオーバーライドする
* @param string $forward_name forward名
* @return string view classが定義されるスクリプトのパス名
$this->logger->log(LOG_DEBUG, "default view path [%s]", $r);
* 遷移名に対応するテンプレートパス名が省略された場合のデフォルトパス名を返す
* デフォルトでは"foo_bar"というforward名が"foo/bar" + テンプレート拡張子となる
* @param string $forward_name forward名
* @return string forwardパス名
return str_replace('_', '/', $forward_name) .
'.' .
$this->ext['tpl'];
* getDefaultForwardPath()をオーバーライドした場合、こちらも合わせてオーバーライド
* @param string $forward_path テンプレートパス名
* 遷移名からテンプレートファイルのパス名を取得する
* @param string $forward_name forward名
* @return string テンプレートファイルのパス名
if (isset
($this->forward[$forward_name]) ==
false) {
$this->forward[$forward_name] =
array();
$forward_obj =
$this->forward[$forward_name];
if (isset
($forward_obj['forward_path']) ==
false) {
return $forward_obj['forward_path'];
* @return object Ethna_Renderer レンダラオブジェクト
// if action is __ethna_info__ or __ethna_unittest__, the renderer must be Smarty2
require_once ETHNA_BASE .
'/class/Renderer/Smarty.php';
// force update delimiter setting
$renderer_setting =
$this->getConfig()->get('renderer');
$smarty_setting =
(isset
($renreder_setting['smarty']) ?
$renderer_setting['smarty'] :
array());
'right_delimiter' =>
'}',
* テンプレートエンジン取得する (DEPRECATED)
* @return object Ethna_Renderer レンダラオブジェクト
trigger_error('Method ' . __METHOD__ .
' is depreacted. Use getRenderer() instead.', E_USER_DEPRECATED);
* テンプレートエンジンのデフォルト状態を設定する
* @param object Ethna_Renderer レンダラオブジェクト
* 条件によって使用言語、ロケールを切り替えたい場合は、
* @param string $locale ロケール名(ja_JP, en_US等)
* (ll_cc の形式。ll = 言語コード cc = 国コード)
* @param string $system_encoding システムエンコーディング名
* @param string $client_encoding クライアントエンコーディング(テンプレートのエンコーディングと考えれば良い)
* @see http://www.gnu.org/software/gettext/manual/html_node/Locale-Names.html
* @see Ethna_Controller#_getDefaultLanguage
protected function _setLanguage($locale, $system_encoding =
null, $client_encoding =
null)
// $this->locale, $this->client_encoding を書き換えた場合は
// 必ず Ethna_I18N クラスの setLanguageメソッドも呼ぶこと!
// さもないとカタログその他が再ロードされない!
$i18n->setLanguage($locale, $system_encoding, $client_encoding);
* 外部に出力されるEthnaのエラーメッセージ等のエンコーディングを
* 切り替えたい場合は、このメソッドをオーバーライドする。
* @return array ロケール名(e.x ja_JP, en_US 等),
* (= テンプレートのエンコーディングと考えてよい) の配列
* (ロケール名は ll_cc の形式。ll = 言語コード cc = 国コード)
* WARNING!! : クライアントエンコーディング名が、フレームワークの内部エンコーデ
* ィングとして設定されます。つまり、クライアントエンコーディングで
* ブラウザからの入力は入ってくるものと想定しています!
return array('ja_JP', 'UTF-8', 'UTF-8');
* @return int ゲートウェイ定義(GATEWAY_WWW, GATEWAY_CLI...)
if (is_null($GLOBALS['_Ethna_gateway']) ==
false) {
return $GLOBALS['_Ethna_gateway'];
* ゲートウェイに対応したクラス名のプレフィクスを取得する
* @param string $gateway ゲートウェイ
* @return string ゲートウェイクラスプレフィクス
* @param string $name マネージャキー
* @return string マネージャクラス名
// アプリケーションIDと、渡された名前のはじめを大文字にして、
* アプリケーションオブジェクトクラス名を取得する
* @param string $name アプリケーションオブジェクトキー
* @return string マネージャクラス名
// 引数のはじめの一文字目と、アンダーバー直後の
// 1文字を必ず大文字にする。アンダーバーは削除される。
// $name に foo_bar を渡し、AppID が Hogeの場合
* ただし、インクルードしたファイルにクラスが正しく定義されているかどうかは保証しない
* @param array $action_obj アクション定義
* @param string $action_name アクション名
$class_path =
$form_path =
null;
if (isset
($action_obj['class_path'])) {
$tmp_path =
$action_obj['class_path'];
$tmp_path =
$action_dir .
$tmp_path;
$this->logger->log(LOG_WARNING, 'class_path file not found [%s] -> try default', $tmp_path);
include_once $action_dir .
$class_path;
$this->logger->log(LOG_DEBUG, 'default action file not found [%s] -> try all files', $class_path);
if (isset
($action_obj['form_path'])) {
$tmp_path =
$action_obj['form_path'];
$tmp_path =
$action_dir .
$tmp_path;
if ($tmp_path ==
$class_path) {
$this->logger->log(LOG_WARNING, 'form_path file not found [%s] -> try default', $tmp_path);
if ($form_path ==
$class_path) {
include_once $action_dir .
$form_path;
$this->logger->log(LOG_DEBUG, 'default form file not found [%s] -> maybe falling back to default form class', $form_path);
* ただし、インクルードしたファイルにクラスが正しく定義されているかどうかは保証しない
* @param array $forward_obj 遷移定義
* @param string $forward_name 遷移名
if (isset
($forward_obj['view_path'])) {
$tmp_path =
$forward_obj['view_path'];
$tmp_path =
$view_dir .
$tmp_path;
$this->logger->log(LOG_WARNING, 'view_path file not found [%s] -> try default', $tmp_path);
include_once $view_dir .
$view_path;
$this->logger->log(LOG_DEBUG, 'default view file not found [%s]', $view_path);
* ディレクトリ以下の全てのスクリプトをインクルードする
$ext =
"." .
$this->ext['php'];
while (($file =
readdir($dh)) !==
false) {
if ($file !=
'.' &&
$file !=
'..' &&
is_dir("$dir/$file")) {
if (substr($file, -
$ext_len, $ext_len) !=
$ext) {
include_once $dir .
'/' .
$file;
* 設定ファイルのDSN定義から使用するデータを再構築する(スレーブアクセス分岐等)
* DSNの定義方法(デフォルト:設定ファイル)を変えたい場合はここをオーバーライドする
* @return array DSN定義(array('DBキー1' => 'dsn1', 'DBキー2' => 'dsn2', ...))
foreach ($this->db as $key =>
$value) {
$dsn =
$this->config->get($config_key);
// 種別1つにつき複数DSNが定義されている場合はアクセス分岐
* スレーブサーバへの振分け処理(デフォルト:ランダム)を変更したい場合はこのメソッドをオーバーライドする
* @param string $type DB種別
* @param array $dsn_list DSN一覧
* @return string 選択されたDSN
mt_srand($sec +
((float)
$usec *
100000));
* 不要な場合は空のメソッドとしてオーバーライドしてもよい
if ($this->config->get('debug') ==
false) {
require_once ETHNA_BASE .
'/class/InfoManager.php';
$this->action['__ethna_info__'] =
array(
'form_name' =>
'Ethna_Form_Info',
'class_name' =>
'Ethna_Action_Info',
$this->forward['__ethna_info__'] =
array(
'view_name' =>
'Ethna_View_Info',
// see if we have simpletest
require_once ETHNA_BASE .
'/class/UnitTestManager.php';
$this->action['__ethna_unittest__'] =
array(
'form_name' =>
'Ethna_Form_UnitTest',
'class_name' =>
'Ethna_Action_UnitTest',
$this->forward['__ethna_unittest__'] =
array(
'view_name' =>
'Ethna_View_UnitTest',
* Ethnaマネージャが実行可能かをチェックする
* Ethnaマネージャを実行するよう指示されているにも関わらず、
* debug が trueでない場合は実行を停止する。
if ($this->config->get('debug') ==
false
&&
($action_name ==
'__ethna_info__' ||
$action_name ==
'__ethna_unittest__'))
* Ethnaマネージャが実行不能な場合のエラーメッセージを
* 表示する。運用上の都合でこのメッセージを出力したくない
$run_action =
($action_name ==
'__ethna_info__')
?
' show Application Info List '
echo
"Ethna cannot {$run_action} under your application setting.<br>";
echo
"HINT: You must set {$appid}/etc/{$appid}-ini.php debug setting 'true'.<br>";
echo
"In {$appid}-ini.php, please set as follows :<br><br>";
echo
"\$config = array ( 'debug' => true, );";
$r =
$ctl->trigger_XMLRPC($method, $param);
'faultCode' =>
$r->getCode(),
'faultString' =>
$r->getMessage(),
Documentation generated on Fri, 11 Nov 2011 03:57:54 +0900 by phpDocumentor 1.4.3