データベースを使った商品レビュー管理システムを作ろう(5)~フロントエンド用PHPコードその2~
データベースを使った商品レビュー管理システム。
4回目の今回は、フロントエンド側のPHPコードを紹介その2となります。
フロントエンド側のコードはすべてdbinfoというフォルダーに入っています。
前回はdb_info.php,db_control.phpという2つのコードファイルを紹介しましたので、今回は残りの2つのコードファイルについて紹介ます。
|
|-index.html
|-style.css
|-review---admin---adduser.php
| |-dashboard/php
| |-delete.php
| |-display.php
| |-login.php
| |-logout.php
| |-modpass.pho
| |-reply.php
| |-update.php
| |-userdelete.php
| |-userlist.php
|
|-dbinfo----db_control.php
|-db_display.php <--今回解説するコード
|-db_info.php
|-db_input.php <----今回解説するコード
db_display.php
このコードは、フロントエンド部に以下の商品レビュー一覧を表示させるためのコードになります。
動作説明
レビュー一覧では、すべてのレビューを表示するのではなく、db_control.phpファイル内の変数review_per_pageで定めた1ページ当たりのレビュー数だけ表示させます。
これ以上にレビューがある場合は、「進む」「戻る」というボタンを表示させ、「進む」がクリックされたら次ページのレビューを、「戻る」がクリックされたら前ページのレビューを表示。
もちろん、最後のページが表示されたら「進む」ボタンは非表示。
最初のページが表示されたら「戻る」ボタンは非表示となります。
レビュー総数が1ページ当たりのレビュー数より少ない場合は「進む」「戻る」ボタンは表示させません。
また、以下の構造化データーも自動生成させています。
<!-- 構造化データー・商品レビュー -->
<div itemtype="https://schema.org/Product" itemscope>
<meta itemprop="name" content="sku" />
<meta itemprop="description" content="productdiscription" />
<div itemprop="aggregateRating" itemtype="https://schema.org/AggregateRating" itemscope>
<meta itemprop="reviewCount" content="10" />
<meta itemprop="ratingValue" content="4.4" />
</div>
</div>
<!-- 構造化データーここまで -->
コードの解説
それでは、コードの解説をします。
<form action="#review_list" method="post" class="review_control">
<input type="hidden" name="page_number" value="<?= $page_number; ?>">
<div class="review_page_control">
<p class="review_page_count"><?= $review_starting_point; ?>~<?= $review_ending_point; ?>件(全<?= $review_number; ?>件)</p>
<?php if($page_number > 1): ?>
<div class="review_page_control_button">
<button type="submit" name="page_move" value="2"><<戻る</button>
</div>
<?php endif; ?>
<?php if($page_number < $review_page_max): ?>
<div class="review_page_control_button">
<button type="submit" name="page_move" value="1">進む>></button>
</div>
<?php endif; ?>
</div>
</form>
<?php if(empty($posts)): ?>
<p class="coution">まだレビューは投稿されておりません。</p>
<?php else: ?>
<ul class="review-list">
<?php
foreach($posts as $post):
switch($post['point']){
case '1';
$pointstar = '★☆☆☆☆';
break;
case '2';
$pointstar = '★★☆☆☆';
break;
case '3';
$pointstar = '★★★☆☆';
break;
case '4';
$pointstar = '★★★★☆';
break;
case '5';
$pointstar = '★★★★★';
}
?>
<li class="review-item">
<dl class="review-com">
<div class="review-data">
<dt>投稿日:<?= $post['posttime']; ?></dt>
<dt>投稿者:<?= $post['name']; ?></dt>
<dt >評価点:<?= $pointstar; ?></dt>
</div>
<dd class="review-text"><?= nl2br($post['review']); ?></dd>
</dl>
<?php if(!empty($post['reply'])): ?>
<dl class="review-reply">
<dt class="review-title">販売店から</dt>
<dd><?= nl2br($post['reply']); ?></dd>
</dl>
<?php endif; ?>
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<!-- 構造化データー・商品レビュー -->
<div itemtype="https://schema.org/Product" itemscope>
<meta itemprop="name" content="<?= $sku; ?>" />
<meta itemprop="description" content="productdiscription" />
<div itemprop="aggregateRating" itemtype="https://schema.org/AggregateRating" itemscope>
<meta itemprop="reviewCount" content="<?= $review_number; ?>" />
<meta itemprop="ratingValue" content="<?= $rev_avg; ?>" />
</div>
</div>
<!-- 構造化データーここまで -->
以上がすべてのコードです。
次に、各部分ごとに解説をします。
<form action="#review_list" method="post" class="review_control">
<input type="hidden" name="page_number" value="<?= $page_number; ?>">
<div class="review_page_control">
<p class="review_page_count"><?= $review_starting_point; ?>~<?= $review_ending_point; ?>件(全<?= $review_number; ?>件)</p>
<?php if($page_number > 1): ?>
<div class="review_page_control_button">
<button type="submit" name="page_move" value="2"><<戻る</button>
</div>
<?php endif; ?>
<?php if($page_number < $review_page_max): ?>
<div class="review_page_control_button">
<button type="submit" name="page_move" value="1">進む>></button>
</div>
<?php endif; ?>
</div>
</form>
現在表示しているレビュー番号とレビュー総数、そしてページ送りボタンを表示させるコードです。
ページ送りボタンはformコードを使い、ボタンがクリックされるとそのボタンに対応した数値をpostで飛ばし、db_control.php部で表示させるページ数とレビュー番号を計算します。
表示ページ数に応じてif文でボタンの表示・非表示を行っています。
<?php if(empty($posts)): ?>
<p class="coution">まだレビューは投稿されておりません。</p>
<?php else: ?>
レビューデーターは配列変数posts内に格納されていますが、すべてのレビューデーターが格納されているわけではなく、表示されるデーターのみ抽出して格納しています。
もし、この商品のレビューがまだなかったら、postsは空になるので、if文を使いレビューがない旨表示させ、動作は終了します。
<ul class="review-list">
<?php
foreach($posts as $post):
postsにデーターがあったら、以降のコードでレビューを表示させます。
foreach文を使い、posts内からレビューデータをひとつづつ読み出し表示。
posts内のデーターをすべて呼び出したら動作は終了となります。
switch($post['point']){
case '1';
$pointstar = '★☆☆☆☆';
break;
case '2';
$pointstar = '★★☆☆☆';
break;
case '3';
$pointstar = '★★★☆☆';
break;
case '4';
$pointstar = '★★★★☆';
break;
case '5';
$pointstar = '★★★★★';
}
?>
最初にレビュー評価点を★マークに変換。
レビュー評価点は数値でデータ化されていますので、その数値に応じて変数pointstarに★マークを入れていきます。
<li class="review-item">
<dl class="review-com">
<div class="review-data">
<dt>投稿日:<?= $post['posttime']; ?></dt>
<dt>投稿者:<?= $post['name']; ?></dt>
<dt >評価点:<?= $pointstar; ?></dt>
</div>
<dd class="review-text"><?= nl2br($post['review']); ?></dd>
</dl>
<?php if(!empty($post['reply'])): ?>
<dl class="review-reply">
<dt class="review-title">販売店から</dt>
<dd><?= nl2br($post['reply']); ?></dd>
</dl>
<?php endif; ?>
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
pointstarのほか、データーベースから読みだしたレビューデーターをliタグを使い表示させていきます。
これをposts内にデーターが無くなるまで繰り返します。
<!-- 構造化データー・商品レビュー -->
<div itemtype="https://schema.org/Product" itemscope>
<meta itemprop="name" content="<?= $sku; ?>" />
<meta itemprop="description" content="productdiscription" />
<div itemprop="aggregateRating" itemtype="https://schema.org/AggregateRating" itemscope>
<meta itemprop="reviewCount" content="<?= $review_number; ?>" />
<meta itemprop="ratingValue" content="<?= $rev_avg; ?>" />
</div>
</div>
<!-- 構造化データーここまで -->
最後に構造化データーの自動生成部となります。
db_control.phpで算出したレビュー総数review_numberとレビュー平均点rev_avgを表示させます。
この部分はコードは生成しますが、ページ上では表示しません。
db_input.php
次に、レビューデーター入力部の解説をします。
動作説明
名前、メールアドレス、評価点(満足度)、レビューを入力し「レビューを送信する」をクリックすると、データーをpost送信します。
コードの解説
<?php if(!empty($error) || !empty($success)): ?>
<div class="form_comment">
<?php if(!empty($error)): ?>
<p class="error">エラー</p>
<p><?= $error; ?></p>
<?php else: ?>
<p><?= $success; ?></p>
<?php endif; ?>
</div>
<?php endif; ?>
<form action="#review_input" method="post" class="review_form">
<table class="review__form_table">
<tr>
<td class="label"><label>お名前</label></td>
<td><input type="text" name="name" value="<?= $name; ?>"></td>
</tr>
<tr>
<td class="label"><label>メールアドレス</label></td>
<td><input type="email" name="email" value="<?= $email; ?>"></td>
</tr>
<tr>
<td class="label"><label>満足度</label></td>
<td>
<ul class="review__radio">
<?php $checed = 'checked'; ?>
<li><input type="radio" name="review_point" value="1" <? if($review_point === '1'){echo $checed;} ?>>★☆☆☆☆</li>
<li><input type="radio" name="review_point" value="2" <? if($review_point === '2'){echo $checed;} ?>>★★☆☆☆</li>
<li><input type="radio" name="review_point" value="3" <? if($review_point === '3'){echo $checed;} ?>>★★★☆☆</li>
<li><input type="radio" name="review_point" value="4" <? if($review_point === '4'){echo $checed;} ?>>★★★★☆</li>
<li><input type="radio" name="review_point" value="5" <? if($review_point === '5'){echo $checed;} ?>>★★★★★</li>
</ul>
</td>
</tr>
<tr>
<td class="label"><label>レビュー</label></td>
<td><textarea name="review" rows="8" cols="80" ><?= $review; ?></textarea><br><p>レビューは1000文字以内でお願いします</p></td>
</tr>
</table>
<p class="review_button"><input type="submit" name="submit" value="レビューを送信する"></p>
</form>
こちらがコードになります。
各部の解説をします。
<?php if(!empty($error) || !empty($success)): ?>
<div class="form_comment">
<?php if(!empty($error)): ?>
<p class="error">エラー</p>
<p><?= $error; ?></p>
<?php else: ?>
<p><?= $success; ?></p>
<?php endif; ?>
</div>
<?php endif; ?>
送信したレビューデーターに空白があると、変数errorにエラーメッセージが入ります。
データーに問題がなく、データベースにデーターが格納されると変数successに完了メッセージが入ります。
このエラーメッセージか完了メッセージを表示させる部分です。
<form action="#review_input" method="post" class="review_form">
<table class="review__form_table">
<tr>
<td class="label"><label>お名前</label></td>
<td><input type="text" name="name" value="<?= $name; ?>"></td>
</tr>
<tr>
<td class="label"><label>メールアドレス</label></td>
<td><input type="email" name="email" value="<?= $email; ?>"></td>
</tr>
<tr>
<td class="label"><label>満足度</label></td>
<td>
<ul class="review__radio">
<?php $checed = 'checked'; ?>
<li><input type="radio" name="review_point" value="1" <? if($review_point === '1'){echo $checed;} ?>>★☆☆☆☆</li>
<li><input type="radio" name="review_point" value="2" <? if($review_point === '2'){echo $checed;} ?>>★★☆☆☆</li>
<li><input type="radio" name="review_point" value="3" <? if($review_point === '3'){echo $checed;} ?>>★★★☆☆</li>
<li><input type="radio" name="review_point" value="4" <? if($review_point === '4'){echo $checed;} ?>>★★★★☆</li>
<li><input type="radio" name="review_point" value="5" <? if($review_point === '5'){echo $checed;} ?>>★★★★★</li>
</ul>
</td>
</tr>
<tr>
<td class="label"><label>レビュー</label></td>
<td><textarea name="review" rows="8" cols="80" ><?= $review; ?></textarea><br><p>レビューは1000文字以内でお願いします</p></td>
</tr>
</table>
<p class="review_button"><input type="submit" name="submit" value="レビューを送信する"></p>
</form>
formタグを使い、レビューデーターを入力、post送信します。
フロントエンド部の制御コードの解説は以上です。
とりあえず、これでレビュー管理は動きますが、スパムの削除やレビューの修正などバックエンド部(管理画面)も必要ですので、次回からはこのバックエンド部について解説します。
この記事が気に入ったらサポートをしてみませんか?