Jul 29
逆引きrhaco79: project.xmlのinput要素のみ設定する画面を作る
マイナーネタ。
Webアプリ作ってると、管理者が何タイプか居て、rhacoのsetup画面のようにデータベース設定とかまで変更されたくないけど、project.xmlで設定した定数は変更できる管理者を作りたい場合があります。
そういった場合はrhacoのsetup機能を参考に(パクり)、テンプレートで設定したい項目だけ表示すれば良いです。管理画面になるので、管理者のログインとか作る必要はあると思いますが、それは認証設定の逆引き(後日書きます)に書きます。
今回はViewsとUrlsを使って設定画面を作ってみます。
index.php (該当箇所のみ。Urlsを使います)
Rhaco::import("setup.model.ProjectModel");
Rhaco::import("SettingViews");
$projectModel = new ProjectModel();
$projectModel->start(Rhaco::setuppath("project.xml"));
$pattern = array("^setting$"=>
array("class"=>"SettingViews","method"=>"generate","args"=>$projectModel)
);
$parser = Urls::parser($pattern);
$parser->write();
独自ViewsはViewsをextendして次のように書きます
library/SettingViews.php
Rhaco::import("setup.util.SetupView");
class SettingViews extends SetupView {
function generate($projectModel){
$projectModel->setRhacopath(Rhaco::rhacopath());
parent::generate($projectModel);
$this->setVariable(ObjectUtil::objectConvHash($projectModel));
$this->setTemplate(Rhaco::templatepath("setup.html"));
return $this->parser();
}
}
resources/templates/setup.html
rhacoのパス/setup/resources/templates/setup/setup.htmlを参考に必要な箇所を取り出す。例えばアプリケーションで指定するデータだけ取り出したい場合は、<rt:loop param="formList" var="defineData">のループ箇所を取り出します
<form method="post" name="frm" rt:reference="true">
<table id="settings">
<!-- define -->
<thead>
<tr><th colspan="2" title="_("basic data peculiar to application is defined")">_("the setup of the application data")</th></tr>
</thead>
<tbody>
<rt:if param="{$isinit}">
<tr>
<th>_("アプリケーションの初期処理")</th>
<td>
<input type="submit" name="setting_init" value="_('実行')" />
</td>
</tr>
</rt:if>
<rt:loop param="formList" var="defineData">
<tr>
<th title="{$f.text2html({$defineData.description})}">
{$defineData.title}
<div>{$defineData.description}</div>
</th>
<td>
<rt:if param="{$defineData.type}" value="select">
<select name="formList[{$defineData.name}].value">
<rt:loop param="{$defineData.dataList}" var="data" key="caption">
<option value="{$data}">{$caption}</option>
</rt:loop>
</select>
</rt:if>
<rt:if param="{$defineData.type}" value="input">
<input type="text" name="formList[{$defineData.name}].value" />
</rt:if>
<rt:if param="{$defineData.type}" value="text">
<textarea type="text" name="formList[{$defineData.name}].value" rows="10" cols="40"></textarea>
</rt:if>
<rt:if param="{$defineData.type}" value="password">
<input type="password" name="formList[{$defineData.name}].value" />
</rt:if>
</td>
</tr>
</rt:loop>
</tbody>
</form>
あとは<html>タグなど必要なタグを入れたら完成です。これで自由に設定画面を組むことが出来ます。
あまり使用する機会は無さそうですが・・・