Smartyのようなテンプレートエンジンを使わずにプレゼンテーションとロジックを分離しようとしています。私がこれまで行ってきたことは動いていますが、私が望むよりも多くのPHPを自分のプレゼンテーションに入れずに、特定のことをどうやって行うのかはわかりません。例えば、今、私はこのようなものがあります:プレゼンテーション(HTML)とロジック(PHP)を別々に保つ
product_list.php
try {
$query = $conn->prepare("SELECT p.id, p.name, p.description, IFNULL(url, title) AS url, GROUP_CONCAT(c.category SEPARATOR ', ') AS category,
FROM products p
LEFT JOIN product_categories pc ON p.id = pc.product_id
LEFT JOIN categories c ON pc.category_id = c.id
WHERE p.active = 1
GROUP BY p.id");
$query->execute();
$result = $query->fetchAll(PDO::FETCH_ASSOC);
}
catch (PDOException $e) {
echo $e->getMessage();
}
include('templates/product_list_tpl.php');
product_list_tpl.php
<div class="card">
<div class="product-list with-header">
<div class="product-list-header center-align">
<h2><?= $header_title; ?></h2>
</div>
<?php foreach ($result as $row): ?>
<!-- Some Product Info -->
Category: <?= $row['category']; ?>
<?php endforeach; ?>
</div>
</div>
上記の例では、いくつかの製品が一つのカテゴリを持つことになりますが、いくつかは複数あります。カンマ区切りのリストでうまく表示されますが、カテゴリ名をリンクにしたいと考えています。私は私が以下のようなことをすることができることを知っているが、それは私にとっては厄介なようだ。
<div class="card">
<div class="product-list with-header">
<div class="product-list-header center-align">
<h2><?= $div_title; ?></h2>
</div>
<?php foreach ($result as $row): ?>
<?php $categories = explode(', ', $row['category']); ?>
<div class="product-list-item avatar">
<img src="img/product/<?= $row['id']; ?>.jpg" alt="<?= $row['title']; ?>" class="square">
<a href="product/<?= generate_link($row['url']); ?>" class="title bold"><?= $row['title']; ?></a>
<p class="caption"><?= $row['caption']; ?></p>
<div class="item-bottom">
<span class="responsive"><?= $row['description']; ?></span>
<p>
Category:
<?php foreach ($categories as $key => $category): ?>
<a href="category/<?= strtolower($category); ?>"><?= $category; ?></a>
<?= (sizeof($categories) > 1 && $key == end($categories)) ? ', ' : ''; ?>
<?php endforeach; ?>
</p>
<p>
<span>Rating: <?= $row['rating']; ?></span>
<span class="right">Rated <?= $row['rated']; echo ($row['rated'] == 1) ? ' time' : ' times'; ?></span>
</p>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
ありがとうございます。また、私がサンプルコードで使用した一般的な分離形式の入力を誰かが持っているなら、それを聞いてみたいと思います。私はちょうど8年の休憩の後にコーディングに戻っています。
編集:コメントが示唆した@Devonによると、endforeach
が追加され、3番目のコードブロックのインデントが改善されました。
EDIT:私が以前に除外したHTMLを含むように3番目のコードブロックを更新し、探している出力を得るために必要なすべてのPHP機能を追加しました。それは動作しますが、IMOはこのようにして、私が持っていた小さな分離を取り除きます。私は今、基本的には、私のデータベース呼び出しで1つのファイルと、この混乱で別のファイルを持っています。私は、適切なビジネスロジック/プレゼンテーションロジック分離のために正しい方向に進まないような気がします。
どこが間違っていますか?
phpの代わりに、これはちょうどわずかに異なる構文で、これに似ています。 IMOは、テンプレート言語を使用する唯一の本当の利点は、特定のセクションでPHPへのアクセスを制限することです。 – jeroen
私はあなたの例に何か間違っているとは思わない。 foreachで反復することは完全に正常です。インデントを修正して読みやすくし、2番目のforeachを閉じるようにしてください。 – Devon
@jeroenテンプレート言語には他にも多くの利点があります。レイアウトを拡張し、コンテンツのセクションと定義するセクションを定義することは、巨大なものです。また、プレゼンテーション層の依存関係としてPHPを削除したい人もいます。 – Devon