管理者用画面を用意する:ログイン画面とアドミンジェネレーター
入力されたレコードの削除などを行う管理者用画面として、モジュール「bbsdatakanri」を生成します。ここでは、さまざまな管理機能を備えたモジュールを自動生成する、アドミンジェネレーターを使用してみましょう。
アドミンジェネレーター
symfonyには、generate-crudと似た管理者向けのモジュールを自動生成する機能が備わっています。アドミンジェネレーターと呼ばれるもので、次のようにコマンドを入力する事で生成されます(パラメータはpropel-generate-crudと同様です)。
symfony propel-init-admin keijiban bbsdatakanri Bbsdata
これによりテーブル管理に必要な機能が備わったモジュールが自動生成されます。しかしscaffolding機能を使用した時と異なり、「bbsdatakanri」フォルダを覗いてみても、それらしいファイルは見当たりません。それどころか「actions.class.php」の中身は空のクラスがあるだけで、「templates」フォルダは存在すらしません。
これはsymfony本体のファイル/クラスを継承している為です。一度使用したものであれば、キャッシュフォルダ「<プロジェクトフォルダ>/cache/<アプリケーション名>/<prod,devなどの環境名>/modules/auto<モジュール名(最初大文字)>/」内に存在しています。アクションは基本的にscaffolding機能による自動生成のものとほぼ同様です。ビューはlistとeditの2つのみ使用しています。
アクション名 | 役割 |
index | listアクションへフォワードされる |
list | レコード一覧の表示 |
edit | レコードの編集 |
save | レコードの書き込み |
delete | レコードの削除 |
create | レコードの新規作成 |
テンプレート名 | 役割 |
list | すべてのレコードの一覧表示 |
edit | レコード編集のためのフォーム群 |
generator.yml編集
アドミンジェネレーターにより生成された管理モジュールの機能は、「bbsdatakanri/config/generator.yml」を編集することにより行います。今回、以下を追記します。
generator: class: sfPropelAdminGenerator # この内側でカスタマイズを行う param: # モデルクラス名 model_class: Bbsdata # 使用するテーマ。テンプレートとスタイルシートの組み合わせで、 # <dataフォルダ>/generator/sfPropelAdmin/defaultが指名されている) theme: default # listアクションについてのカスタマイズ list: # フィルタリングの指定 filters: [author, id, parent_id]
上記ではlist画面でAUTHOR
、ID
、PARENT_ID
でフィルタリング(つまり検索)を行う機能が付加されます。これ以外にもさまざまな項目が設定可能です。詳細はsymfony book内「The admin generator」の項を参照してください。
管理者ログイン用設定
ここまででアドミンジェネレーターにより管理モジュールを作成しましたが、管理者画面に誰でもアクセスできるようでは困るので、ごく簡単ですがログイン機能を実装します。ここでは、symfonyにおける認証管理について紹介します(アドミンジェネレーター側でも認証の設定が可能ですが、ここでは敢えてsymfonyアプリ一般の認証管理を使用します)。
管理者画面への誘導:bbsdataモジュール内listSuccess.php追記
まず掲示板本体の一覧表示画面(「bbsdata」モジュールの「listSuccess.php」)において、管理者ページへのリンクを張ります。といっても直接「bbsdatakanri/list」にリンクするわけではなく、bbsdatakanriモジュールにloginアクションを実装し、そこへ繋がるようにします。「bbsdata/templates/listSuccess.php」に、以下を追加します。
<?php echo link_to('管理者ページへ', '/bbsdatakanri/login') ?>
以降は、「bbsdatakanri」モジュール内のファイルを扱います。
ログイン機能の実装:executeLogin(actions.class.php)
管理モジュールの方にログイン機能を実装します。まずはアクション(executeLogin)からです。
<?php /** * bbsdatakanri actions. * * @package mysite * @subpackage bbsdatakanri * @author Your name here * @version SVN: $Id: actions.class.php 2288 * 2006-10-02 15:22:13Z fabien $ */ class bbsdatakanriActions extends autobbsdatakanriActions { public function executeLogin() { if ($this->getRequestParameter('username') == 'kanri') { if ($this->getRequestParameter('password') == 'kanri') { $this->getUser()->setAuthenticated(true); $this->getUser()->addCredential('admin'); return $this->forward('bbsdatakanri','list'); } } $this->getUser()->setAuthenticated(false); } public function executeLogout() { $this->getUser()->setAuthenticated(false); } }
ここでは管理者ユーザー名とパスワードを共に「kanri」とし、かつアクション内に記述/認証処理を行っていますが、実際はユーザー名/パスワードは別の場所(user
テーブルなど)に保存し、なおかつ暗号化などを行い慎重に管理すべきなのは言うまでもありません。
ここで注目すべきは$this->getUser()->setAuthenticated(true)
の部分です。認証がOKだった場合に、認証の完了をセットしています。続く$this->getUser()->addCredential('admin')
では、「admin」という権限を付与しています。この認証がsymfonyでどのように作用するのかは、後述する「security.yml」で設定します。
同時にログアウト用のアクション(executeLogout)も実装していますが、ここでは「$this->getUser()->setAuthenticated(false)
」とすることで、認証を解除しています。
ログイン用画面作成:loginSuccess.php
ユーザー名とパスワードを入力するテンプレート「loginSuccess.php」を作成します。「templates」フォルダはモジュール生成直後存在しないので、作成してそこにテンプレートを配置します。
<?php echo form_tag('bbsdatakanri/login') ?> <fieldset> <div class="form-row"> <label for="nickname">管理者名:</label> <?php echo input_tag('username', $sf_params->get('username')) ?> </div> <div class="form-row"> <label for="password">パスワード:</label> <?php echo input_password_tag('password') ?> </div> </fieldset> <?php echo submit_tag('ログイン') ?> </form>
![管理者ログイン画面 管理者ログイン画面](http://cz-cdn.shoeisha.jp/static/images/article/911/911_06.gif)
security.yml作成
さて、先程loginアクションで指定した$this->getUser()->setAuthenticated(true)
、$this->getUser()->addCredential('admin')
は、ここで生きてきます。以下のファイルを「<モジュールフォルダ(今回はbbsdatakanri)>/config」内に作成します。ファイルの適用範囲はモジュール単位となります。
login: # アクション名 is_secure: off # セキュリティOFF:誰でもアクセス可能 logout: is_secure: off all: # 上記login、logoutアクション以外すべて is_secure: on # セキュリティON credentials: admin # adminのみがアクセス可能
このようにして当該モジュールにおけるアクションごとにアクセス権限を設定します。ここではlogin、logoutアクション以外は$this->getUser()->addCredential('admin')
で指定した「admin」のみがアクセス可能という設定を行っています。
ログアウト処理へのリンク:_list_footer.php
さて、管理者画面から抜けるためにリスト画面の末尾にログアウト機能を実装したいところですが、「listSuccess.php」は見当たりません。ここで、「templates」フォルダ内に「_list_footer.php」というファイルを以下の内容で作成し、logoutアクションへのリンクを作ります。
<?php echo link_to('log out', 'bbsdatakanri/logout') ?>
ファイル名から推測がつくかと思いますが、このファイルはlistテンプレートのフッターとなります。同様に次のようなカスタムヘッダー/フッターが作成可能です。
- _list_header.php(listテンプレートのヘッダー)
- _edit_header.php(editテンプレートのヘッダー)
- _edit_footer.php(editテンプレートのフッター)
この他にも非常に柔軟なビューのカスタマイズが可能です。詳細はsymfony book内「The admin generator」の項を参照してください。
ログアウト完了画面:logoutSuccess.php
logoutアクション実行時に表示されるビューを作成します。
<h2>ログアウトしました</h2> <?php echo link_to('戻る', 'bbsdata/list') ?>
セッションの有効期限(settings.yml)
ここまででログイン機能は実装しましたが、セッションの有効期限も決める必要があるでしょう。セッションの有効期限はアプリケーションフォルダ内の「config/settings.yml」で設定することができます。このファイル内の以下をコメントインします(デフォルトは30分)。
# timeout: 1800 # Session timeout, in seconds
コメントにも書いてありますが、秒単位でセッションの有効期限を設定できます。
今回のまとめ
前回より作成を始めた掲示板アプリケーションに、今回は削除、ページャー、検索の各機能を実装し、また入力値検証と管理者用画面の作成を行いました。そして不要なアクション/ビューを削除し、(MVCの)モデルとコントロールの分離も行いました。
今回も結構な量になってしまいましたが、symfonyの各機能を紹介しながら実際のアプリケーション作成の様子を垣間見る事ができたのではないかと思います。次回以降は、今回までで紹介しきれなかった各機能に触れていく予定です。
次の記事
参考文献
- admin generator commented
- Escaping output in symfony