CakePHPにはapp/views/errors
という、エラーファイルを配置するフォルダがある。
ここに、独自のエラーファイルをおく事が可能。
if (条件分)
{
$this->viewPath = 'errors';
$this->render('エラーファイル名');
exit;
}
の様にすると、呼び出される。
正規の方法がこれであっているかは不明・・・
CakePHPにはapp/views/errors
という、エラーファイルを配置するフォルダがある。
ここに、独自のエラーファイルをおく事が可能。
if (条件分)
{
$this->viewPath = 'errors';
$this->render('エラーファイル名');
exit;
}
の様にすると、呼び出される。
正規の方法がこれであっているかは不明・・・
CakePHP(1.1)で多言語対応してみる。
adminルーティングで振り分けも考えたけれど、ちょっと用途が違うみたい。
ページは、ルーティングで切り替える。
/servie/index
で日本語
/en/servie/index
で英語
を表示したい場合。
app/config/routes.php
に、
$Route->connect('/en/:controller/:action/*', array('controller' => ':controller', 'action' => ':action', '*'));
を追加。
これで
en/service/index
にアクセスすると、
serviceアクションのindexが呼ばれる。
次に、読み込む言語ファイルを設定したいので、
app/config/bootstrap.php
に、
$bits = explode('/', $_GET['url'], 2);
$GLOBALS['lang'] = ($bits[0] == 'en')? 'en' : 'ja';
とグローバル変数に言語変数を入れる。
その言語変数により、各設定ファイルを読み込む。
コントローラーのリダイレクト($this->redirect)を修正
app/app_controller.php
で、redirect関数をオーバーライドする。
function redirect($url, $status = null)
{
if ($GLOBALS['lang'] != 'ja')
{
$url = "/" . $GLOBALS['lang'] . $url;
}
parent::redirect($url, $status);
}
また、テンプレートの各リンクは、htmlヘルパーで、
$html->url()で記述。
app/view/helper/html.phpの、
url()関数の、
if (isset($this->plugin)) {
$base = strip_plugin($this->base, $this->plugin);
} else {
$base = $this->base;
}
の下に、
if ($GLOBALS['lang'] != 'ja')
{
$base .= '/'.$GLOBALS['lang'];
}
を追加。
また、各言語毎にレイアウト/テンプレートファイルがある場合、render関数をオーバーライドする必要がある。
画面のレンダリング時に、適切な言語のテンプレートを読んでくれないので、
app/app_controller
にrender()関数を追加。
function render($action = null, $layout = null, $file = null)
{
if (!$action)
{
$action = $this->action;
}
if (!$layout)
{
$layout = $this->layout;
}
if ($GLOBALS['lang'] != 'ja')
{
$action = sprintf('%s/%s', $GLOBALS['lang'], $action);
$layout = sprintf('%s/%s', $GLOBALS['lang'], $layout);
}
parent::render($action, $layout, $file);
}
これでひとまずは、日本語版と英語版が同じコントローラーで切り替え出来た。
※補足
CakePHPで現在の実行中のアクションの取得は、$this->action
beforeRender()関数で、var_dump($this)を実行すると、色々と出て来た。
pear upgrade PEAR
を実行すると、
HTTP error, got response: HTTP/1.1 404 Not Found
Didn't receive 200 OK from remote server. (HTTP/1.1 404 Not Found)
とエラーが出される。
調べてみると、どうやらpearに変更があったらしい。
[January 3, 2008]
As promised, XML-RPC has been disabled at pear.php.net. Information is now served via REST files at pear.php.net/rest. If you are using a PEAR version earlier than 1.4.0, you will need to manually upgrade PEAR using direct URLs. To upgrade to the latest PEAR, you can either use go-pear (http://pear.php.net/go-pear) or upgrade using direct URLs:
pear upgrade --force http://pear.php.net/get/Archive_Tar http://pear.php.net/get/XML_Parser http://pear.php.net/get/Console_Getopt
pear upgrade --force http://pear.php.net/get/PEAR-1.4.3.tar
pear upgrade PEAR
解決する為には、上記では駄目で、バージョン依存のエラーが出ました。
下記で、OKでした。色々アップデートして準備しないと駄目なんですね。
# pear upgrade --force http://pear.php.net/get/XML_RPC-1.4.0.tar
# pear upgrade --force http://pear.php.net/get/Archive_Tar
# pear upgrade --force http://pear.php.net/get/PEAR-1.4.0.tar
# pear upgrade --force http://pear.php.net/get/XML_Parser http://pear.php.net/get/Console_Getopt
'/SourceCache/apache_mod_php/apache_mod_php-43/php/configure' '--prefix=/usr' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--disable-dependency-tracking' '--with-apxs2=/usr/sbin/apxs' '--with-ldap=/usr' '--with-kerberos=/usr' '--enable-cli' '--with-zlib-dir=/usr' '--enable-trans-sid' '--with-xml' '--enable-exif' '--enable-ftp' '--enable-mbstring' '--enable-mbregex' '--enable-dbx' '--enable-sockets' '--with-iodbc=/usr' '--with-curl=/usr' '--with-config-file-path=/etc' '--sysconfdir=/private/etc' '--with-mysql-sock=/var/mysql' '--with-mysqli=/usr/bin/mysql_config' '--with-mysql=/usr' '--with-openssl' '--with-xmlrpc' '--with-xsl=/usr' '--without-pear'
phpのセッション時間の設定は、
session.gc_probability(デフォルト1)
session.gc_divisor(デフォルト100)
session.gc_maxlifetime(デフォルト1440秒)
で設定する。
時間の有効期限は、gc_maxlifetime
gc(ガベージコレクション)が行われる頻度が
gc_probability/gc_divisor %
という事は、デフォルトでは、1440秒を超えても、
1/100の確率でしかセッションが破棄されない?
大規模サイトの場合は、よいかもしれないが、中小サイトはなかなかセッションが切れないのでは
ないかな。。。
session.gc_probability 100
session.gc_divisor 100
session.gc_maxlifetime 30
でテストした結果、1人でサイトにアクセスしていると、
31秒後に1度アクセスしたときに、セッションが切れるっぽい。
2人でアクセスしていると、どちらかがアクセスしたときに、セッションが切れるような
動作をしている。
難しい。。。
php -f ファイル名
でコマンドラインで実行可能。
ファイルの先頭には、
#!/usr/local/bin/php
とperlと同じようにphpへのパスを記述しておく。
http://www.php.net/manual/ja/features.commandline.php
.htaccessファイルに
直接記述できる。
<IfModule mod_php4.c>
php_value include_path ".:/usr/local/lib/php"
</IfModule>
自分の環境では<ifModule mod_php4.c></ifModule>
タグは必要なく設定した。(逆にあると動かなかった。)
http://www.shigeweb.jp/php/project_p/?section=setup&page=htaccess
php4.4.2をインストールしてもソースにバグがあるらしく、pearがインストールされない。
links -source http://go-pear.org | php
よりインストールが可能
ただし、eLinks(テキストブラウザ)がインストールされていないとLinksコマンドは動作しない。
PHPファイルの先頭に
header('Content-type: text/xml; charset=utf-8');
が必要。
これがないと文字コードがおかしく、JavaScriptエラーが出てしまう。
(サーバの設定によると思うが。)
また、日本語を扱う場合は、mb_convert_encoding($xxx, "UTF-8")にする必要がある。
渡される値は
x,y
name属性が指定してあった場合、
name.x, name.y