Posts tagged HTML
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 モデルの validation の拡張 同じ項目で違うメッセージを出す
1CakePHP のモデルの validation の拡張のメモの続きです。
同じフォームの項目で違うエラーメッセージを出したいときがあります。
例えばユーザ登録フォームでユーザID がフォーマットエラーなのか、既に使用されているのかなどです。
models/users.php
var $validate = array( 'loginid' => '/^[0-9a-zA-Z]{8}$/', ); function validates($data=array()) { if(empty($data)) { $data = $this->data; } parent::validates($data); // loginid のユニークチェック if ($this->findByLoginid($data["User"]["loginid"])) { $this->invalidate("loginid_unique"); } if (count($this->validationErrors)>0) { return false; } else { return true; } }
既にloginid が登録済みの場合は
$this->invalidate('loginid_unique');
としています。
invalidate に指定するのは実際に存在しないものでも大丈夫なのでそれを使用して view でエラーメッセージを分けて表示します。
views/users/regist.thtml
ID:< ?php echo $html->password('User/loginid'); ?> < ?php echo $html->tagErrorMsg("User/loginid", "IDは英数字8文字で入力してください"); ?> < ?php echo $html->tagErrorMsg("User/loginid_unique", "IDは既に使用されています。他のID を指定してください"); ?>
CakePHP モデルの validation の拡張
1CakePHP のモデルの validation の拡張のメモです。
ユーザ登録フォームなどでパスワードの再確認のバリデーションを行うときの方法です。
views/users/regist.thtml
パスワード:< ?php echo $html->password('User/password'); ?> 確認用パスワード:< ?php echo $html->password('User/password2'); ?> < ?php echo $html->tagErrorMsg('User/password2', 'パスワードが一致しません');
※users テーブルにpassword2 のカラムはなくてかまいません。
models/users.php
function validates($data=array()) { if(empty($data)) { $data = $this->data; } parent::validates($data); if ($data["User"]["password"]!==$data["User"]["password2"]) { $this->invalidate("password2"); } if (count($this->validationErrors)>0) { return false; } else { return true; } }
AppModel クラスの validation メソッドも実行する必要があるので、必ず
parent::validates($data);
を書かないといけません。
CakePHP findBy で複数条件の指定で OR も指定可能
2[cakephp]findByで複数条件の指定 | blog.hereticsintheworld
で紹介されていた
$this->Model->findByIdAndName( $id, $name )
が気になりソースを調べてみたところ OR も指定可能でした。
$this->Model->findByIdOrName( $id, $name )
ちなみに findAll でも同様に指定可能です。
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
Firefox タブを新しいウィンドウで開くTab Mix Plus のショートカット Ctrl + Shift+ N
1Going My Way: 今開いているタブを新しいウィンドウで開く、Tab Mix Plus のショートカット Ctrl + Shift+ N
Going My Way さんで紹介されていた Firefox で現在開いているタブを新しいウィンドウで開くショートカットが紹介されていました。
Tax Mix Plus が必要ですが、Ctrl + Shift + N で出来ます。
これやりたいことが多かったです。
いつもCtrl + N で新しいウィンドウを開いてから URL をコピペしてました。。。
CakePHP select タグの選択していないときの状態を指定する
0Cute CakePHP Trick of the Day – GenerateList Empty Slot In List | Web Development 2.0: Web Design, CakePHP, Javascript
で select タグの選択していないときの状態の値を指定する方法が書かれていますが、この方法は間違っています。
元のエントリのコメントでも指摘されていますが、ヘルパーのメソッドの使い方が違います。コードを実際に書いて検証してみれば、動かないのがすぐに分かります。
元の紹介されている方法はそもそも PHP の文法的におかしいのでそこは適当に修正して紹介します。(変数名に $ がなかったり、generateList() を出力をどこにも保存していないかったりします。)
コントローラで下記のように generateList でリストを取得して
$state_id = $this->State->generateList();
ビューで
echo $form->input($state_id, array('empty' => '--'));
と紹介されています。
CakePHP1.1 の Formヘルパーには input メソッドがないので CakePHP 1.2 でのやり方だと思いますが、実際に Form ヘルパーの input メソッドは
function input($fieldName, $options = array())
と定義されています。上記のように書くと
で、実際にはどう書けばいいかというと
echo $form->input('Model/Field', array('empty'=>'---', 'type'=>'select', 'options'=>$state_list));
または、
echo $form->select('Model/Field', $state_list, null, null, array('empty'=>'---'));
と書けば select タグの先頭に
<option value=''>---</option>
と入ります。
CakePHP1.1 では 「CakePHP HTMLヘルパーで select タグを表示する」のエントリで書いたように結構面倒だったので新しい Form ヘルパーは使いやすいですね。
10月に読んだ本
1先月少なかった分、今月は結構読めました。
なぜ、週4時間働くだけでお金持ちになれるのか?
ダメなら、さっさとやめなさい! ~No.1になるための成功法則~
レバレッジ勉強法
スタバではグランデを買え! ―価格と生活の経済学
佐藤可士和の超整理術
パーソナルブランディング 最強のビジネスツール「自分ブランド」を作り出す
SAMURAI佐藤可士和のつくり方
無理なく続けられる年収10倍アップ時間投資法
勝手サイト 先駆者が明かすケータイビジネスの新機軸 (ソフトバンク新書 52) (ソフトバンク新書 52)
プログラマー現役続行 (技評SE新書 12)
月に100万稼げるドロップシッピング
図解 SEO対策がわかる (知りたい!テクノロジー)
ネット未来地図 ポスト・グーグル時代 20の論点 (文春新書 595)
ケータイハックス-いつでもどこでも仕事術 [マイコミ新書] (マイコミ新書)
OpenPNE 管理画面を別ディレクトリにする
1OpenPNE の管理画面の URL は
http://www.example.com/?m=admin
という URL になります。
これは SNS の URL
http://www.example.com/?m=pc
などと同じ index.php を使用しています。
このため、管理画面だけ IP アドレス制限をしたいなどという場合に、.htaccess などで制限ができません。
OpenPNE のセットアップマニュアルには 「6-3. 管理画面を別ドメインで運用する (オプション)」という内容で別ドメインで運用する方法が紹介されています。
しかし、レンタルサーバなどでバーチャルドメインなどが使用できない場合に管理画面を別ディレクトリにして .htaccess などでIPアドレス制限や Basic 認証をかけられるようにする方法です。
- OPENPNE_DIR ├ bin ├ lib ├ var ├ webapp ├ webapp_ext ├ webapp_biz └ config.php - public_html ├ config.inc.php ├ index.php
の public_html 以下のファイルを public_html/admin ディレクトリ以下にコピーする
-public_html ├ admin (管理画面のディレクトリ名) ├ config.inc.php ├ index.php ・ ・ ・
コピーした public_html/admin/config.inc.php を書き換える
< ?php /** * @copyright 2005-2007 OpenPNE Project * @license http://www.php.net/license/3_01.txt PHP License 3.01 */ define('OPENPNE_DIR', realpath('../../')); // ディレクトリ階層が違うので合わせるために変更する require_once OPENPNE_DIR . '/config.php'; // 管理画面のベースURL設定 define('OPENPNE_ADMIN_URL', 'http://www.exmaple.com/admin/'); // 無効にするモジュール $GLOBALS['_OPENPNE_DISABLE_MODULES'] = array('pc', 'ktai'); ?>
これで、htt://www.exmple.com/admin/?m=admin でアクセスできるようになります。
注意点は ?m=admin をつけないとアクセスできません。
また、元の http://www.example.com/?m=admin でアクセスできないように
// 無効にするモジュール $GLOBALS['_OPENPNE_DISABLE_MODULES'] = array('admin', 'setup');
を public_html/config.inc.php に追加してください。
また、前回のエントリで紹介した 「特定ページを SSL で接続する」 で管理画面を SSL で接続する設定をしている場合は
// 管理画面のベースURL設定 define('OPENPNE_ADMIN_URL', 'https://www.exmaple.com/admin/');
のように URL も忘れずに https にしておかないとアクセスできなくなります。