[Site] データが無いときの処理

タグ :

作成サイト「koweboo」についてまとめるシリーズです。
今回は一覧などのデータ表示するときに取得データが無かった場合の表示処理についてまとめます。

取得データが無い状況とは

サイトにおいて、取得データが無い状況というのは多々あると思います。
例えば以下の様なこと。

  • 日付指定で取得してくるデータ
  • 新規作成したデータ
  • 何かしらの理由で付属情報を削除したデータ
  • …etc

日付指定で取得するデータでは、一定の期間誰もデータを追加しなければ、その期間内でのデータが取得できないという結果になります。
人気の無くなったサイト等でよく見られる現象ですが、このような状態は避けたいですね。

新規作成したデータの例として、新規登録した音声データには当然コメントデータはありません。
そのような時はデータが無いことを表示しておくか、コメント表示自体を非表示にする必要があると思います。

付属データを削除したデータとは、色々と事情があって削除されるデータというものがあると思います。
そのようなデータの表示では新規作成時と同じようにする必要があると思います。

これら以外にもデータが無い状態というのは多々あるはずです。
このデータが無い状態での表示をまとめたいと思います。

データが無いときの処理

今回は例として、お題データが無いときの処理の表示です。
お題のジャンルによってはデータが無い場合があるので、その無い場合の表示を補います。

処理としては至って簡単です。
ビューファイルに分岐処理にて無い場合の表示を追加するだけです。
過去記事「お題投稿機能 その2」を使ってジャンル別表示を追加した改良版を作成します。

<h3><?php echo __('Genre'); ?></h3>
<ul>
<li><a href="<?php echo PAGE_REQUEST ?>">すべて</a></li>
<li><a href="<?php echo PAGE_REQUEST.'/index/1' ?>">セリフ</a></li>
<li><a href="<?php echo PAGE_REQUEST.'/index/2' ?>">歌</a></li>
<li><a href="<?php echo PAGE_REQUEST.'/index/3' ?>">朗読</a></li>
<li><a href="<?php echo PAGE_REQUEST.'/index/4' ?>">BGM</a></li>
</ul>
<h2><?php echo __('Request List'); ?></h2>
<?php if ($requests): ?>
<table cellpadding="0" cellspacing="0">
<tr>
<th><?php echo __('Id'); ?></th>
<th><?php echo __('Username'); ?></th>
<th><?php echo __('title'); ?></th>
</tr>
<?php foreach ($requests as $request): ?>
<tr>
<td><?php echo h($request['Request']['id']); ?></td>
<td><?php
	echo $this->Html->link(
		$user[$request['User']['id']]['name'],
		array(
			'controller' => 'users',
			'action' => 'view',
			$request['User']['id']
		)
	);
?></td>
<td><?php
	echo $this->Html->link(
		$request['Request']['title'],
		array(
			'controller' => 'requests',
			'action' => 'view',
			$request['Request']['id']
		)
	);
?></td>
</tr>
<?php endforeach; ?>
<?php else: ?>
<h4><?php echo __('Data Nothing.'); ?></h4>
<?php endif; ?>
</table>
<?php if ($requests): ?>
<p><?php
	echo $this->Paginator->counter(array(
		'format' => __('Page {:page} of {:pages},
			showing {:current} records out of {:count} total,
			starting on record {:start},
			ending on {:end}')
	));
?></p>
<div class="paging">
<?php
	echo $this->Paginator->prev(
		'< ' . __('previous'),
		array(),
		null,
		array('class' => 'prev disabled')
	);
	echo $this->Paginator->numbers(
		array('separator' => '')
	);
	echo $this->Paginator->next(
		__('next') . ' >',
		array(),
		null,
		array('class' => 'next disabled')
	);
?>
</div>
<?php endif; ?>

コントローラ側は一切変更する必要はありません。

1行目〜8行目は、ジャンル指定用のリンク箇所になります。
クリックしたジャンルに応じたデータ取得を行い、そのジャンルのみを表示します。

9行目〜45行目で一覧表示をしています。

10行目の分岐処理にてお題データが取得できているかを判定しています。
取得出来ていればそれ以下の11行目〜41行目の一覧表示処理を行います。

42行目にてお題データが無かった場合の処理を分岐しています。
データが無かった場合はそれ以下の43行目の文字列表示処理を行います。

46行目のページネート部分も同じようにデータがある時は表示し、無い時には非表示にするように分岐処理を追加します。

表示してみると以下のようになります。

site_data_nothning_1

上は、お題一覧ページのジャンル指定で「BGM」を指定してみたときの表示です。
ジャンルの「BGM」にはお題投稿が無かったため、このような表示になりました。
データが無いので、テーブル、ページネートも表示する必要がないので、非表示にしてあることが分かります。

まとめ

今回のデータが無い場合の表示は、ビューファイルに直接処理命令を記述して対応しましたが、処理というのは全てコントローラへ記述するのが理想とされています。
ですが、一番簡単なのはこのやり方です。
デザイナーと分業している場合には、このようなビューファイルでは文句を言われる可能性がありますので、控えましょう。

コントローラへ記述する場合に面倒なのは、今回のようにテーブルやページネートを非表示にするという処理が難しいということです。
やり方としては色々あると思いますが、一番簡単なのは、div 要素の style の display を none にするという方法かなと思います。
一番良い処理というのは分からないですが、バグの無い確実な処理にするということが一番大切だと思います。

デザイナー兼業者やデザインを先に作成してもらってから CakePHP の変数コードを埋め込んでいくというやり方をする場合には、今回の手法がてっとり早くて良いと思います。

Share

  • このエントリーをはてなブックマークに追加

Comment

コメントを残す

*がついている欄は必須項目です。

  • Twitter
  • Facebook
  • Google Plus
  • RSS Feed