Posts tagged conf
CakePHP1.2 文字コードを EUC-JP に設定する
1現在開発しているシステムが文字コードを EUC-JP で制作しなければいけないのですが、今まで CakePHP は UTF-8 でしか制作したことがなく、設定方法などメモしておきます。開発に使用しているのは CakePHP1.2 です。
データベースの文字コード
app/config/database.php
var $default = array( 'driver' => 'mysql', 'persistent' => false, 'host' => 'localhost', 'port' => '', 'login' => 'user', 'password' => 'password', 'database' => 'database_name', 'schema' => '', 'prefix' => '', 'encoding' => 'ujis' );
EUC のときは encoding に ujis と設定します。
ちなみに
Shift-JIS のときは sjis
UTF-8 のときは utf8
とします。
これは MySQL の SET NAMES でそのまま使用されるためです。
システムの文字コード
CakePHP1.2 では下記のように設定します。
app/config/core.php
Configure::write('App.encoding', 'euc-jp');
CakePHP 1.1 の方法はちょっとコードを調べたのですが、 core.php などにも特に設定するところがなく分かりませんでした。分かる方いらっしゃったら教えてください。
CakePHP1.2 のバリデーション
12CakePHP 1.2 を使用してフォームを作成してバリデーションを使用したメモです。
下記サイトを参考にさせていただきました。
cakePHP 1.2のバリデーションを理解する – cakephp – クロアチアで働くプログラマー日記
例としてメールアドレスを2回入力させるフォームを考えて見ます。
バリデーションルールとして
- 必須項目
- メールアドレスとして正しい
- メールアドレスがユニーク
- 2回入力したメールアドレスが一致する
モデルにバリデーションを定義する
var $validate = array( 'email' => array( 'unique' => array( 'rule' => array('checkUnique', 'email'), 'message' => 'メールアドレスは既に登録されています' ), 'rule1' => array( 'rule' => array('email'), 'message'=>'メールアドレスが正しくありません' ), 'required' => array( 'rule'=>VALID_NOT_EMPTY , 'message' => '必須項目です' ), ), 'email_confirm' => array( 'rule1' => array( 'rule'=> array('checkCompare'), 'message'=>'一致しません' ), ), );
私はエラーメッセージをバリデーション定義にまとめておきたいので、上記のように各ルールに
'message' => 'エラーメッセージ'
として定義しています。
ここで定義しておけば、後でビューに書くフォームヘルパーでフォームを出力するときに引っかかったエラーを自動的に出力することができます。
また、自分でバリデーション関数を作成してチェックすることもできます。それが checkUnique と checkCompare です。
メールのユニークチェックは参考サイトを参考にさせていただきました。
function checkUnique($field){ foreach( $field as $key => $value ){ $this->recursive = -1; $found = $this->find(array("{$this->name}.$key" => $value)); return !$found; } }
次にメールアドレスを2回入れたものが一致するかのチェックです。
これはパスワードなどでもたまに使用するので汎用性を持たせてあります。
例えばメールアドレスのフィールド名が email の場合、確認用のフィールド名は ‘_confirm’を付けて email_confirm としておけばこの2つが一致するかチェックします。
function checkCompare($field) { foreach( $field as $key => $value ){ if (preg_match('/^(.+)_confirm$/', $key, $regs)) { return $this->data[$this->name][$regs[1]] == $this->data[$this->name][$key]; } } }
ビューでフォームを設定
<?php echo $form->input('User/email', array('type'=>'text')); ?> <?php echo $form->input('User/email_confirm', array('type'=>'text')); ?>
このように書いておけばバリデーションエラーがある場合は、モデルのバリデーションに定義したエラーメッセージを自動的に出力してくれます。
ちなみに上記のように書くと input タグの前に email などのフィールド名が出力されます。これを消したい場合は
<?php echo $form->input('User/email', array('type'=>'text', 'label'=>'')); ?>
と書くと表示されなくなります。
追記:
コメントで教えていただきました。label=>” だと表示されないが、label タグは残るので
<?php echo $form->input('User/email', array('type'=>'text', 'label'=>false)); ?>
とするとラベルタグも出力されなくなります。
コントローラでバリデーションチェック
以下のようになります。
function action() { if ($this->data) { if ($this->User->create($this->data) && $this->User->validates()) { // バリデーションOK } } }
他にもいろいろフォーム気がついた点があったのでそれはまた後でまとめます。
CakePHP HTML ヘルパーで出力するラジオボタンにラベルを付ける方法
2CakePHP 1.1 の HTML ヘルパーが出力するラジオボタンにはラベルが付いていないのでラジオボタン以外の文字の部分をクリックしてもチェックができません。そこで CakePHP HTML ヘルパーで出力されるタグを変更する方法 のエントリーの方法を使用してラジオボタンにラベルを付加してみました。
app/config/tags.ini.php
radio = <label><input type="radio" name="data[%s][%s]" id="%s" %s />%s</label>
あとは普通に $html->radio() を使用して出力すればラベルが付加されています。
CakePHP 1.2 ではラジオボタンにラベルがついた状態で出力されていました。
CakePHP HTML ヘルパーで出力されるタグを変更する方法
2ヘルパーで出力されるタグを変更する方法です。
やりたいこと
ビューで
< ?php echo $html->link('Love CakePHP', 'http://www.cakephp.org'); ?>
と書くと
<div class="link"><a href="http://www.cakephp.org" >Love CakePHP</a></div>
と div タグで囲んで表示するようにしたい。
概要
app/config 内に変更したいタグを定義してヘルパーの親クラス(AppHelper) で定義したタグを読み込むという方法です。
CakePHP1.1 と 1.2 で少し方法が違います。
CakePHP1.1
app/config に tags.ini.php というファイルを作成しここにタグを定義すると自動的に反映されます。
app/config/tags.ini.php
link = <div class="link"><a href="%s" %s>%s</a></div>
CakePHP1.2
app/config/tags.php
< ?php $tags = array( 'link' => '<div class="link"><a href="%s" %s>%s</a></div>' ); ?>
app/app_helper.php
< ?php class AppHelper extends Helper { function __construct() { parent::__construct(); $this->loadConfig(); } } ?>
CakePHP 1.2 の AppHelper::loadConfig は以下のようになっていてデフォルトでは app/config/tags.php を読み込み $this->tags にマージします。
function loadConfig($name = 'tags') { if (file_exists(APP . 'config' . DS . $name .'.php')) { require(APP . 'config' . DS . $name .'.php'); if (isset($tags)) { $this->tags = array_merge($this->tags, $tags); } } return $this->tags; }
AppHelper のコンストラクタで
$this->loadConfig("hoge.php");
とすれば hoge.php のように任意のファイルを読み込んでマージすることができます。
HTML ヘルパーが使用するタグは cake/libs/view/helpers/html.php で $tags として定義されています。
この中のフォーム関連のタグは Form ヘルパーでも使用していますので、上記の方法で Formヘルパーで使用するタグも変更できます。
phpPgAdmin でログインできない
0普段は MySQL ばかり使用しているのですが、PostgreSQL を使用する必要があり、phpPgAdmin を使うことにした。
開発用のサーバには phpPgAdmin がインストールされているが、ブラウザで閲覧できるようにはまだしていなかった。
Open Tech Press | phpPgAdmin:Web開発者向けのPostgresクライアントツール を参考に /usr/share/phpPgAdmin にインストールされている phpPgAdmin をブラウザでアクセス可能にした。
/etc/http/conf/httpd.conf に下記を追加
Alias /phppgadmin /usr/share/phppgadmin/ <DirectoryMatch /usr/share/phppgadmin/> Options +FollowSymLinks AllowOverride None order deny,allow deny from all allow from localhost </DirectoryMatch>
これでブラウザから http://example.com/phpPgAdmin/ でアクセスできるようになった。
しかし、PostgreSQL のユーザでログインしようとするとエラーになる。
これは シン石丸の電脳芸事ニッキ: debian 3.1へのphppgadminのインストール後の設定 を参考にして解決。
/etc/postgresql/pg_hba.conf に下記を追加
host all all 127.0.0.1 255.255.255.255 trust
これで無事 phpPgAdmin にログインできました。
CakePHP 環境によってデータベースを切り替える
2テストデータを入れるなどテストと環境でデータベースを切り替えたいときがあります。
CakePHP でそれをやる方法です。
モデルの $useDbConfig に app/config/database.php で定義されている $default がデフォルトで使用されます。
database.php に $test など使用したいデータベースの分だけ定義を増やし、
それをモデルで
$this->useDbConfig = 'test';
のように指定すればいいだけです。
app/app_model.php のコンストラクタで設定するのが一番簡単かもしれません。
CakePHP 環境に応じてDBの設定を変える | Shin x blog
で色々な方法が紹介されています。
“CakePHPで超簡単スケーラビリティ” フォーラム – CakePHP Users in Japan
また、この $useDbConfig を使用して
「マスターとスレーブのMYSQLサーバがあります。レプリケーション機能で、マスターからスレーブにデータが常にコピーされています。データの更新・追加はマスターに対して行い、データの検索はスレーブで、という場合にはどうすればよいでしょうか?」
というような場合のすごく簡単な方法が紹介されています。
モデルの beforeSave,afterSave,beforeDelete,afterDelete を使用してマスターとスレーブを切り替えています。
CakePHP MySQL で文字化けを防ぐ設定
4MySQL で文字化けを防ぐためには
SET NAMES utf8
のように SET NAMES を実行するのが有効なのですが、これを app/config/database.php で設定する方法です。
'encoding'=>'文字コード'
をデータベースの設定項目に追加してやるだけです。
具体的には app/config/database.php が下記のようになります。
var $default = array( 'driver' => 'mysql', 'connect' => 'mysql_connect', 'host' => 'localhost', 'login' => 'user', 'password' => 'password', 'database' => 'dbname', 'prefix' => '', 'encoding' => 'utf8' );
cake/libs/model/dbo/dbo_mysql.php で下記のように実行されています。
function connect() { (略) if (isset($config['encoding']) && !empty($config['encoding'])) { $this->setEncoding($config['encoding']); } return $this->connected; }
function setEncoding($enc) { return $this->_execute('SET NAMES ' . $enc) != false; }
CakePHP ログ出力
2CakePHP でログ出力させるメモです。
$this->log(ログに出力するメッセージ, ログ種別);
出力するメッセージは文字列でも配列でもかまいません。配列の場合は print_r されたものが出力されます。
ログの種別は LOG_DEBUG で debug.log 、 LOG_ERROR で error.log に出力されます。デフォルトは LOG_ERROR です。
ログファイルは LOGS で指定されたディレクトリへ出力されます。
デフォルトは /app/tmp/logs です。
ただこの定数 LOGS は cake/config/paths.php で指定されているので、app/config/core.php で定義されている定数のように気軽に変更しない方がいいかもしれません。
ログファイルが存在しない場合はファイルを作成してくれます。
出力されるログは下記のようになります。
2007-11-11 06:54:54 Error: メッセージ
LOG_DEBUG を指定するとログの “Error” の部分が “Debug” になります。
この log メソッドは Object クラスにあります。Object クラスは CakePHP の全てのクラスで継承されるクラスなので、コントローラ、モデル、ビューどこからでも $this->log() でログに出力させることができます。
CakePHP 管理画面を作成する方法
2CakePHP で管理画面を作成する方法です。
管理画面も CakePHP では簡単に作成することができます。
設定
/app/config/core.php の下記のコメントアウトをはずします。
define('CAKE_ADMIN', 'admin');
これで http://www.example.com/admin/controller/action という URL でアクセスできるようになります。
CAKE_ADMIN の値を変更すれば URL の /admin/ の値が変わります。
コントローラ
管理画面で使用するコントローラに管理画面用のアクションを追加します。
管理画面用のアクション名は admin_index のように admin_ が付きます。
この ‘admin’ の部分も CAKE_ADMIN によって変わります。
ビュー
管理画面用のアクションで表示するデフォルトのビューはアクション名と同じです。admin_index.thtml のように admin_ を付けます。
レイアウト
ユーザサイドの画面レイアウトと管理画面はレイアウトが違うことが多いかと思います。管理画面用のレイアウトを admin.thtml のように views/layouts/ に作成します。
管理画面へのアクセス時の共通処理
管理画面のアクセス時の共通処理として、アクセス制限をしたり、画面レイアウトの変更などがあります。
個別にアクションに追加してもいいのですが漏れなどがあるとまずいのでコントローラの beforeFilter メソッドを使用するといいかと思います。
管理画面で使用するコントローラ全てに共通して処理させるために、 /app/app_controller.php の beforeFilter に処理を追加します。
http://www.example.com/admin/contoller/action にアクセスすると
$this->params['admin'] = 'admin'
がセットされます。管理者用URL かどうかにはこれを使用します。また、’admin’ の値は CAKE_ADMIN で指定した値になります。たとえば CAKE_ADMIN を hoge にすると
$this->params['hoge'] = 'hoge'
になります。
if (defined('CAKE_ADMIN') && !empty($this->params[CAKE_ADMIN])) { // 管理者用のレイアウトを指定 $this->layout = "admin"; // 管理者用ログインチェックなどを行う }
CakePHP 静的なページの作成方法
2CakePHP で静的なページを作成する方法です。
正確には CakePHP が出力するページなので静的ではなく動的なのですが、ページを簡単に作成することができます。
- 出力するページをテンプレートとして /views/pages/ ディレクトリ以下に作成します。
- 作成したテンプレートが hoge.thtml だとすると http://exmaple.com/pages/hoge でアクセスできます。
これだけで簡単にページを追加することができます。
コンテンツは静的なものですが、ビューなので例えばログイン状態によって表示を変更したりなどできますね。
なぜ /pages/hoge でアクセスできるかというと /app/config/routes.php で
$Route->connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));
と定義されているからです。
pages_controller.php は /cake/libs/controller/pages_controller.php にあります。
上のルーティングで pages コントローラへのアクセスは全て pages コントローラの display アクションに渡されます。
また、/views/pages/hoge/foo/fuga.thtml というテンプレートを作成すると
http://example.com/pages/hoge/foo/fuga という URL でアクセスすることができます。
ちなみにページタイトルはテンプレートの名前が title タグに入れられます。
タイトルを指定する場合は
<? $this->pageTitle = 'ここにタイトルを指定する'; ?>
とビューでタイトルを指定します。
参考サイト:21 things I learned about CakePHP – Avatar Financial Group