Posts tagged action

CakePHP 管理画面を作成する方法

2

CakePHP で管理画面を作成する方法です。
管理画面も 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 静的なページの作成方法

2

CakePHP で静的なページを作成する方法です。
正確には 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

CakePHP 携帯でセションを有効にする

2

CakePHP で携帯サイトの開発をしています。
ドコモなどはクッキーが使用できないのでセションID を URL で引き継がないといけないのですが、PC サイトではクッキーでセションID を保持したいところです。

携帯サイトと PC サイトが共存しているときの携帯用のビューを表示させる方法は下記が参考になります。
CakePHP 携帯用ビューを表示する | Shin x blog

また、携帯でのアクセス時にクッキーを使用せずにセション を保持するのは下記が参考になります。
Docomoとセッション フォーラム – CakePHP Users in Japan

私は上記の方法に
ini_set('session.use_trans_sid', 1);を入れて使用しています。

全てのリンク、フォームにセションID が付加されるので便利です。
ただリダイレクトするときだけ、
$this->redirect('/controller/action/'.session_name().'='.session_id());のようにセションIDを入れました。

あとビューを書くときに覚えておくとよいのが、ini_set(‘session.use_trans_sid’, 1); を指定したときにリンクを http:// から始まる URL を書くとセションID は当然ですが付加されません。相対パス、絶対パスなどの自サイト内へのリンクのみセションIDが付加されます。
自サイト内のリンクに http:// から書くとセションID が付かないのではまらないように。

OpenPNEでのSmarty の覚書

1

OpenPNE PHP で作成したプログラムを組み込む」で書いたように、

/openpne/webapp_ext/modules/pc/page/hoge_foo.php に

class pc_page_hoge_foo extends OpenPNE_Action
{
    function execute($requests)
    {
    	// ここに処理を書く
    }
}

のようにすると ?m=pc&a=page_hoge_foo でアクセスできるようになります。
このときにどうやって Smarty に値を渡すのか少し戸惑ったのでメモしておきます。

Smarty タグ

通常は 「{」「}」 ですが、OpenPNE では 「({」「})」 です。

assign

$smarty->assign("var", $var);
のようにして Smarty に値を渡したいときは execute メソッド内で
$this->view->set("var", $var);
とすればOK。

display

$smarty->display("hoge_foo.tpl");
は自動的にやってくれます。

default_modifiers (escape)

また、OpenPNE の smarty オブジェクトはオブジェクト生成時に
$smarty->default_modifiers に escpae 修飾子が設定されているので、
テンプレート変数に HTML タグが設定されていて HTMLタグを出力したい場合は
({$var|smarty:nodefaults})
とすれば、escape 処理されずに出力されます。

私は HTML_QuickForm をよく使うので、form タグ関係を出したいことがありますので、その場合に使用しています。

OpenPNE PHP で作成したプログラムを組み込む

1

OpenPNE PHP で作成したプログラムを組み込むときのメモです。
基本的に、/openpne/webapp_ext/ 以下に追加するファイルを置きます。

URLのパターン

OpenPNE の URL は下記のようになります。

  • ?m=pc&a=page_hoge_foo
  • ?m=pc&a=do_hoge_foo

携帯だと m=ktai とかになりますが、今回はPC のみ考えます。

page_hoge_foo のパターンはページを表示する
do_hoge_foo のパターンはモデルに対して処理を行う

page_hoge_foo でモデルに対して処理を行うこともできるが
MVC の意味がないかも。

?m=pc&a=do_hoge_foo のURL を追加する

/openpne/webapp_ext/modules/pc/do 以下に
hoge_foo.php を作成
hoge_foo.php

class pc_do_hoge_foo extends OpenPNE_Action
{
    function execute($requests)
    {
    	// ここに処理を書く
    }
}

/openpne/webapp_ext/modules/pc/validate/do 以下に
hoge_foo.ini を作成
例えば ?m=pc&a=do_hoge_foo&id=10&no=20 のように id, no を GET で渡したい場合は

[id]
type = "int"
required = 1
[no]
type = "int"
required = 1

のように定義する。

こうしておくと do/hoge_foo.php 内で
$id = $requests["id"];
のようにバリデーションを通して値を取得できる。

?m=pc&a=page_hoge_foo のURL を追加する

/openpne/webapp_ext/modules/pc/page 以下に
hoge_foo.php を作成
hoge_foo.php

class pc_page_hoge_foo extends OpenPNE_Action
{
    function execute($requests)
    {
    	// ここに処理を書く
    }
}

/openpne/webapp_ext/modules/pc/validate/page 以下に
hoge_foo.ini を作成
中身は do_hoge_foo の場合と同じ。

その他

/openpne/webapp_ext/lib
クラスファイルなどを置きました

自分で作成クラスをインクルードしたいときは /openpne/webapp_ext/lib
からインクルードします。

optionタグを選択不可にする disabled 属性

2

フォーム画面を動的に表示してある条件のときにはラジオボタンなどを disabled にしたりします。
今回もあるフォームを作成していて在庫が0のときに select タグで表示する項目を選択できないようにしたかったので調べてみたところ、option タグにも disabled 属性がありました。

そこで下記のようにしてみたところ

<form action="">
<select>
<option>オプション1</option>
<option disabled="disabled">オプション2</option>
<option>オプション3</option>
<option>オプション4</option>
</select>
<input type="submit">
</form>

option-desiabled

うまく選択不可になりました。
ところが Firefox では OK だったのですが、IE6では選択可能に。。。

調べてみると
Disable Option’s In A Select (Dropdown) Element ? Post Archive ? www.lattimore.id.au

It never ceases to amaze me how a browser like IE6, managed to not implement something as trivial as an attribute like disabled. The IE team managed to implement it against the <select> element, but some how overlooked the <option> element. They implement the readonly attribute against the appropriate elements – yet some how the disabled attribute managed to be overlooked when they implemented it. More surprising is that, since the HTML4.01 specification came out in late 1999, IE has been updated and upgraded for various things literally hundreds of times. Why hasn’t this made it into an update? You’d begin to think that Microsoft aren’t aware of it, however the thought of that just seems too far fetched.

どうも IE6 のバグのようです。

PHP の便利な関数 output_add_rewrite_var

1

PHP から出力する HTML に最終的に a タグや form タグを見つけ出し、自動で指定した変数をクエリストリングや hidden 属性で挿入してくれる関数です。

PHP4.3 から追加されたようなのですが知らなかったです。
昔から、session.use_trans_sid というセションID を a タグや form タグの hidden 属性に追加してくれるのはありましたが、それをセションID 以外にも使用できるように関数化したもののようです。

URL リライト機構に新しい名前/値の組を追加します。 名前および値は、URL (GET パラメータとして) およびフォーム (hidden フィールドとして) で追加されます。これは、session.use_trans_sid で透過的 URL リライティングが有効になっている場合に セッション ID が渡される方法と同じです。 絶対 URL (http://example.com/..) はリライトされないことに注意しましょう。

- PHP マニュアルより

userid の値 $userid を全てのリンクに付与したい場合は、
output_add_rewite_var('userid', $userid);と書くことにより
<a href="index.php">TOP</a>
<a href="index.php?userid=1">TOP</a>と出力されます。

form タグも
<form action="index.php" method="post">
<input type="hidden" name="userid" value="1">となります。

注意点としては絶対URLはりライトされないことです。
これがないと他サイトにまで、セションID などを渡してしまいますからね。

PHP マニュアル
output_add_rewrite_var

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>
Go to Top