Posts tagged IE
CakePHP でコントローラ名以外の view を指定する方法
3CakePHP では HogeController::foo() に対するビューは
/app/views/hoge/foo.thtml
になります。
このときに、/app/views/hoge/foo2.thtml というビューを使用したいときは
HogeController::foo() で
$this->render('foo2');
と指定すればOKです。
今回違うコントローラ名で管理しているビューを使用できないものかと
/cake/libs/view/view.php
を調べてみたところ
$this->render(null, 'layout', '/path/to/app/views/email/register.thtml');
という方法で
/app/views/email/register.thtml
のビューを HogeController::foo() から使用できました。
render の第3引数に絶対パスで使用したいビューを指定すればOKです。
第1引数でビュー名を指定しますが、第3引数が指定されていると無視されます。
また、レイアウトは第2引数でそのまま指定できます。
あまり他のコントローラのビューを使用することはないと思いますが、
例えば、メール送信時に使用するビューを
/app/views/email/
などのディレクトリ名で管理するなどが用途として考えられます。
CakePHP 入力フォームで確認画面を表示する方法
3フォームを入力後、すぐに保存ではなく一度確認画面を表示させたい場合のやり方。
こちらに詳しいやり方が書いてあります。
http://www12.atwiki.jp/nezox/pages/6.html
ポイントは
- 入力フォームで
<input type="hidden" name="mode" value="confirm">
とする。
- コントローラの add アクションでバリデーションチェック後に
if (@$_POST["mode"]=="confirm") { // 確認画面を表示する $this->render('confirm'); } else { // 保存処理 if ($this->User->save($this->data)) { $this->flash('Your post has been saved.', '/users'); } }
- 確認画面の view を confirm.thtml を作成
<h1>確認画面</h1> <form action="<?php echo $html->url('/users/add'); ?>" method="post"> ログインID: <?php echo $html->tagValue('Users/login_id'); ? <?php echo $html->hidden('Users/login_id', array('value'=>$html->tagValue('Users/login_id'))); ?> <input type="button" value="戻る" onclick="history.back();"> <input type="submit" value="新規登録"> </form>
CakePHP で Smarty を使用するメモ
3Smarty を CakePHP で使用する方法を調べたメモ
Smarty の用意
Smarty ディレクトリを/vendors ディレクトリへコピー
/vendors/smarty/Smarty.class.php
のようになる。
Smarty が使用するディレクトリを作成
/app/tmp/smarty/cache/ /app/tmp/smarty/compile/
Smarty 用の View クラスの準備
レンダリングを任せる Smarty View Class を設定します。
Smarty View Class をダウンロードして smarty.php とリネームして
/app/views/
に配置する。
smarty という名前のサブディレクトリを使用しないなら
$this->subDir = 'smarty'.DS;
をコメントアウトする。
また、
$this->Smarty->assign_by_ref('view', $this);
を
$this->Smarty->assign_by_ref('this', $this);
に変更する。
この変更はテンプレートの中で $this を .thtml と同じように使用したい場合に必要。
AppController の設定
/app/app_controller.php
を作成
class Appcontroller extends Controller{ var $view = "Smarty"; }
実際の使用
view に .tpl があれば Smarty テンプレートとして処理を行い、なければデフォルトの .thtml を表示するようになる。
.tpl の中では .thtml で使用できるヘルパーも使用できる。
.thtml の「<?php echo」を「{」、「;?>」を「}」にすればほぼそのまま利用できる。
ただ、.thtml で HTMLヘルパーを使用している場合
{$html->input('Post/name', array('size'=>'30'))}
のままでは、array(…) でエラーになる。
これを修正するには、Smarty のプラグインを使用して解決する。
プラグインをダウンロードして function.assign_assoc.php にリネームして
/vendors/samrty/libs/plugins/
に配置する。
テンプレートの先頭で
{assign_assoc var='ArrayName' value='size=>30'}
などとして
{$html->input('Post/name', $ArrayName)}
とすればOK.
ただ結構最後のやつが面倒かも。。。
CakePHP HTMLヘルパーで select タグを表示する
2HTML ヘルパーで select タグを表示したかったが、
マニュアルを見ても書かれていなかったので、調べたメモ
/cake/libs/view/helpers/html.php
を見ると selectTag というメソッドがり、
/** * Returns a formatted SELECT element. * * @param string $fieldName Name attribute of the SELECT * @param array $optionElements Array of the OPTION elements (as 'value'=>'Text' pairs) to be used in the SELECT element * @param mixed $selected Selected option * @param array $selectAttr Array of HTML options for the opening SELECT element * @param array $optionAttr Array of HTML options for the enclosed OPTION elements * @param boolean $show_empty If true, the empty select option is shown * @param boolean $return Whether this method should return a value * @return string Formatted SELECT element * @access public */ function selectTag($fieldName, $optionElements, $selected = null, $selectAttr = array(), $optionAttr = null, $showEmpty = true, $return = false) {
と定義されている。
よく指定しそうな引数は
- $fileName にフィールド名
- $optionElements に option タグに表示するもの配列
- $selected にデフォルトで選択状態にする $optionElements のキー
- $showEmpty は一番最初の option タグを空 <option value=”"> </option> で表示するか
コントローラで
$this->set('questions', array( '卒業した学校名', '好きなチーム名', 'ペットの名前', '両親の旧姓', '免許証の下4桁', '好きな映画の題名', ) );
として
<?php echo $html->selectTag('Post/question', $questions, null, null, null); ?>
とすればOK.
よく「選択してください」などの文言が option タグの先頭にある場合があるが、
そのように表示したい場合は
array( '選択してください', '卒業した学校名', '好きなチーム名', 'ペットの名前', '両親の旧姓', '免許証の下4桁', '好きな映画の題名', )
として、$html->selectTag の6番目の引数に false を指定すれば空の option タグが表示されなくなる。
必須選択にしたい場合は「選択してください」の値が0なので、0以外の数字でバリデーションチェックすればいい。
CakePHP のエレメント
2違うレイアウトでも同じデザインの部品を使用することがありますが、その場合に使用するといいのがエレメントです。
エレメントを使用するには
/app/views/elements/
の中に拡張子「.thtml」をつけたファイルを作成します。
エレメントを使用するレイアウト内で
<?php echo $this->renderElement('hoge'); ?>
と書くとエレメントが表示されます。
例えば、ログインフォーム用のエレメントを
/app/views/elements/login.thtml
と作成した場合は
<?php echo $this->renderElement('login'); ?>
と書きます。
また、エレメント内ではそのままではデータにアクセスできないため、
エレメント内でデータを参照したい場合はエレメンにデータを渡さないといけません。
<?php echo $this->renderElement('login', array("user" => $user)); ?>
と、データ配列を渡してエレメントを呼ぶことによりエレメント内で
<?php echo $user; ?>
のようにアクセスできます。
下記の記事が参考になります。
CakePHP の view の elements がアクセスできる変数
cakePHPのマニュアル 8.1.2 エレメント
CakePHP でレイアウトを変更する
1レイアウトを変更するには
/app/views/layouts/default.thtml
を変更すればOK。
コントローラ毎などにレイアウトを変更したいときは
/app/views/layouts/hoge.thtml
などとレイアウトを作成して、コントローラで
var $layout = "hoge.thtml";
とレイアウトを指定する。
このレイアウトの中でタイトルタグを
<title><?php echo $title_for_layout?></title>
としていれば、
$this->pageTitle('このページのタイトル');
とコントローラで指定すれば、アクション毎にタイトルを変更できる。