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>タグなど必要なタグを入れたら完成です。これで自由に設定画面を組むことが出来ます。

あまり使用する機会は無さそうですが・・・

| comment(0)