concrete5で管理画面に独自ページ(シングルページ)を追加する
Posted by admin at 1:03 日時 2012/12/29
concrete5では管理画面にオリジナルの設定ページを作成するのもかんたんです。たとえば http://www.example.com/dashboard/test_single_page/ に管理画面を作るとしてざっくりと解説してみます。
PHPファイルの用意
まず2つのPHPファイルを作成します。太字の部分は管理画面に作成するページのURLと対応している必要があります。concrete5はMVC設計なので、このようにコントローラーとビューに分けて作成します。
- /controllers/dashboard/test_single_page.php (こっちがコントローラーのファイル)
- /single_page/dashbaord/test_single_page.php (こっちがビューのファイル)
ビュー
まずビューのサンプルコードです。
冒頭と末尾はお決まりです。t()関数はメッセージの国際化のためのものです。
<?php defined('C5_EXECUTE') or die("Access Denied.");?> <?php echo Loader::helper('concrete/dashboard')->getDashboardPaneHeaderWrapper(t('Single Page Name'), false, false, false)?> <form method="post" class="form-horizontal" action="<?php echo $this->action('save_settings')?>"> <?php // print access token echo $this->controller->token->output('save_settings')?> <div class="ccm-pane-body"> <fieldset> <legend><?php echo t('My Settings'); ?></legend> <div class="control-group"> <?php echo $form->label('my_setting', t('My Setting Label'))?> <div class="controls"> <?php echo $form->text('my_setting',$my_setting)?> </div> </div> </fieldset> </div> <div class="ccm-pane-footer"> <?php echo $interface->submit(t('Save'), 'site-form', 'right', 'primary')?> </div> </form> <?php echo Loader::helper('concrete/dashboard')->getDashboardPaneFooterWrapper(false)?>
アクセストークンを出力しているのに注意してください。これは保存の際に正しい操作で行われたかチェックするのに使います。
<?php echo $this->controller->token->output('save_settings'); ?>
divに付けられているクラス名はTwitter Bootstrapそのまんまなので、Twitter Bootstrapのドキュメントを読んでその通り書けばキレイな管理画面が簡単につけられます。
<div class="control-group">
$form 変数にはconcrete5のフォーム・ヘルパーがセットされているので、このようにフォーム部品をかんたんに出力できます。
<?php echo $form->text('my_setting',$my_setting)?>
これはテキストフォームの例ですが、この他の要素は公式ドキュメントの Forms > Standard Widgets のページに解説があります。
$interface 変数にはconcrete5のインターフェース・ヘルパーがセットされているので、ここから管理画面の部品を出力できます。
<?php echo $interface->submit(t('Save'), 'site-form', 'right', 'primary')?>
インターフェース・ヘルパーは公式ドキュメントの Helpers > Core User Interface のページに解説があります。
コントローラー
次にコントローラーのサンプルコードです。
<?php defined('C5_EXECUTE') or die("Access Denied."); class DashboardTestSinglePageController extends DashboardBaseController { public function view() { $my_setting = Config::get('my_setting'); $this->set('my_setting', $my_setting); } public function settings_saved() { $this->set('message', t("Your settings saved successfully.")); $this->view(); } public function save_settings() { if ($this->token->validate("save_settings")) { if ($this->isPost()) { Config::save('my_setting', $this->post('my_setting')); $this->redirect('/dashboard/test_single_page','settings_saved'); } } else { $this->set('error', array($this->token->getErrorMessage())); } } }
管理画面のページのコントローラーは、必ず DashboardBaseController クラスを継承します。クラス名の DashboardTestSinglePageController はページのURLと対応しています。今回は dashboard/test_single_page/ というページを作りますが、スラッシュとアンダースコアを削り、キャメルケースの形式に変換し末尾にControllerをつけます。これはお作法ではなく、このように書かないとこのクラスがロードされません。
view メソッドでは設定値を読み込みビューに渡しているだけです。
save_settings メソッドのメソッド名は決まっているものではなく、ビューファイルの下記のform要素のaction属性の記述と対応しています。
<?php echo $this->action('save_settings')?>
トークンとデータ送信の有無をチェックしたあと、Configにデータを保存する処理を書いています。結構ラクに保存処理が書けます。保存したら settings_saved メソッドへリダイレクトしています。
$this->redirect('/dashboard/test_single_page','settings_saved');
settings_saved メソッドでは画面に保存完了のメッセージを出して、あとは view メソッドの処理を呼び出しています。
$this->set('message', t("Your settings saved successfully."));
実にシンプルに書けることがお分かりいただけるかと思います。
シングルページの登録
さて、コントローラーとビューが用意できたら、シングルページを管理画面から登録します。この登録処理が無いと、実際にアクセスできるようにはなりません。
シングルページを登録したら、念のためキャッシュをクリアしましょう。
完成
他にも色んなUIが使えます。便利ですねー。
<div class="control-group"> <?php echo $form->label('select', t('select'))?> <div class="controls"> <?php echo $form->select('select', array('apple'=>t('Apple'),'orange'=>t('Orange')))?> </div> </div> <div class="control-group"> <?php echo $form->label('color_select',t('Select Color'))?> <div class="controls"> <?php $fh = Loader::helper('form/color'); echo $fh->output('color_select', '', $color ); ?> </div> </div> <div class="control-group"> <?php echo $form->label('page_select',t('Select Page'))?> <div class="controls"> <?php $pageSelector = Loader::helper('form/page_selector'); echo $pageSelector->selectPage('page_select', $cid ); ?> </div> </div> <div class="control-group"> <?php echo $form->label('file',t('Select File'))?> <div class="controls"> <?php $al = Loader::helper('concrete/asset_library'); echo $al->file('file', 'fid', t('Select File')); ?> </div> </div> <div class="control-group"> <?php echo $form->label('user',t('Select User'))?> <div class="controls"> <?php $uh = Loader::helper('form/user_selector'); print $uh->selectUser('user', $uID); ?> </div> </div>