6月 02

08.フォームの見た目を変える

go @ 3:13 AM

ということで無事 members の会員登録部分が動くようになりました。
ブラウザから、

http://localhost/~bob/cake/index.php/members

を開いて、いろいろ登録したりしてみます。
すぐに気づくことですが、デフォルトのテンプレートの見た目が気に入らないです。
会員の一覧画面はともかく、 /members/add の登録画面とか、 /members/view/1 の詳細画面とか。
見た目の整形は最後にまとめてやっても構わない訳ですが、なんだかこのまま作業するのも気が重い。
ここでちょっといじりたい、というのが人情でしょう。
とりあえず、アクション add の場合で言うと、今自動生成されたテンプレートはこうなっています。

	<fieldset>
 		<legend><?php __('Add Member');?></legend>
	<?php
		echo $form->input('email');
		echo $form->input('password');
		echo $form->input('type_id');
		echo $form->input('birthday');
		echo $form->input('img1');
		echo $form->input('img2');
		echo $form->input('Favorite');
	?>
	</fieldset>

fieldset とか legend が気に入らないですね。
ということで、本家サイトのドキュメントにあるとおり、デフォルトのテンプレートをコピーして、編集します。

cd Sites/cake/cake/console/libs/templates/
cp -r views /Users/bob/Sites/cake/app/vendors/shells/templates/views

上記 views の中にある form.ctp を開いて、

	<fieldset>
 		<legend><?php echo "<?php __('".Inflector::humanize($action)." {$singularHumanName}');?>";?></legend>
<?php
		echo "\t<?php\n";
		foreach ($fields as $field) {
			if ($action == 'add' && $field == $primaryKey) {
				continue;
			} elseif (!in_array($field, array('created', 'modified', 'updated'))) {
				echo "\t\techo \$form->input('{$field}');\n";
			}
		}
		if (!empty($associations['hasAndBelongsToMany'])) {
			foreach ($associations['hasAndBelongsToMany'] as $assocName => $assocData) {
				echo "\t\techo \$form->input('{$assocName}');\n";
			}
		}
		echo "\t?>\n";
?>
	</fieldset>

こうなっているところを、

	<h2><?php echo "<?php __('".Inflector::humanize($action)." {$singularHumanName}');?>";?></h2>
<?php
		echo "\t<?php\n";
		foreach ($fields as $field) {
			if ($action == 'add' && $field == $primaryKey) {
				continue;
			} elseif (!in_array($field, array('created', 'modified', 'updated'))) {
				echo "\t\techo \$form->input('{$field}');\n";
			}
		}
		if (!empty($associations['hasAndBelongsToMany'])) {
			foreach ($associations['hasAndBelongsToMany'] as $assocName => $assocData) {
				echo "\t\techo \$form->input('{$assocName}');\n";
			}
		}
		echo "\t?>\n";
?>

こうします。 h2 に変えたってだけです。
再度 cake bake でビューを作り直します。
出力されるテンプレートは以下のようになります。

	<h2><?php __('Add Member');?></h2>
	<?php
		echo $form->input('email');
		echo $form->input('password');
		echo $form->input('type_id');
		echo $form->input('birthday');
		echo $form->input('img1');
		echo $form->input('img2');
		echo $form->input('Favorite');
	?>

あとは view.ctp の dt dd タグになってる部分を tr td のテーブルタグに変えたりとか、まあ、その辺は人それぞれ趣味なので。
特に view.ctp はデフォルトだと、以下のようなソースをはき出すので、

	<dl><?php $i = 0; $class = ' class="altrow"';?>
		<dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Id'); ?></dt>
		<dd<?php if ($i++ % 2 == 0) echo $class;?>>
			<?php echo $member['Member']['id']; ?>
			&nbsp;
		</dd>

こりゃー一体なんでしょう。一行おきにスタイルを変えてるんですよね。これを後からちまちま削除するのは果てしなくだるいので、大元をいじっておいた方がよいと思います。

いろんな議論があるとは思いますが、やっぱり管理画面の表示はテーブルで整形した方が見やすいですよね。
と言う訳で私は view.ctp は以下のようにしてみました。

<div class="<?php echo $pluralVar;?> view">
<h2><?php echo "<?php  __('{$singularHumanName}');?>";?></h2>
	<table>
<?php
foreach ($fields as $field) {
	$isKey = false;
	if (!empty($associations['belongsTo'])) {
		foreach ($associations['belongsTo'] as $alias => $details) {
			if ($field === $details['foreignKey']) {
				$isKey = true;
				echo "\t\t<tr>\n\t\t\t<th><?php __('".Inflector::humanize(Inflector::underscore($alias))."'); ?></th>\n";
				echo "\t\t\t<td>\n\t\t\t\t<?php echo \$html->link(\${$singularVar}['{$alias}']['{$details['displayField']}'], array('controller'=> '{$details['controller']}', 'action'=>'view', \${$singularVar}['{$alias}']['{$details['primaryKey']}'])); ?>\n\t\t\t&nbsp;\n\t\t\t</td>\n\t\t</tr>\n";
				break;
			}
		}
	}
	if ($isKey !== true) {
		echo "\t\t<tr>\n\t\t\t<th><?php __('".Inflector::humanize($field)."'); ?></th>\n";
		echo "\t\t\t<td>\n\t\t\t\t<?php echo \${$singularVar}['{$modelClass}']['{$field}']; ?>\n\t\t\t&nbsp;\n\t\t\t</td>\n\t\t</tr>\n";
	}
}
?>
	</table>
</div>

>>次のページ「レイアウト」へ

Comments are closed.

here comes