1 | <?php
|
---|
2 | require_once('./inc/common.php');
|
---|
3 |
|
---|
4 | /**
|
---|
5 | * Check whether the required parameter ID is sent. Go back with an error message if not.
|
---|
6 | */
|
---|
7 | if ((! isset($_GET['id'])) || (empty($_GET['id'])) || (! is_numeric($_GET['id']))) {
|
---|
8 | header('Location: /businesses.php?err=no_id');
|
---|
9 | exit();
|
---|
10 | }
|
---|
11 | $business_id = $_GET['id'];
|
---|
12 |
|
---|
13 | /**
|
---|
14 | * Get the name of this business (needed for the page title).
|
---|
15 | */
|
---|
16 | $sql = 'SELECT business_name FROM business WHERE business_id = :id';
|
---|
17 | $stm = $conn->prepare($sql);
|
---|
18 | $stm->execute([':id' => $business_id]);
|
---|
19 | $business_name = $stm->fetch()[0];
|
---|
20 | /**
|
---|
21 | * Go back with an error message if the business with this id does not exist.
|
---|
22 | */
|
---|
23 | if (empty($business_name)) {
|
---|
24 | header('Location: /businesses.php?err=bad_id');
|
---|
25 | exit();
|
---|
26 | }
|
---|
27 |
|
---|
28 | $pageTitle = 'Business: ' . $business_name;
|
---|
29 | $pageSlug = 'businesses';
|
---|
30 |
|
---|
31 | require_once('./inc/head.php');
|
---|
32 | require_once('./inc/header.php');
|
---|
33 | ?>
|
---|
34 | <div class="container">
|
---|
35 | <h1 class="mt-5"><?= $business_name ?></h1>
|
---|
36 |
|
---|
37 | <?php require_once('./inc/alerts-msg.php'); ?>
|
---|
38 |
|
---|
39 | <?php
|
---|
40 | /**
|
---|
41 | * Fetch the details of the business with the given business id.
|
---|
42 | */
|
---|
43 | $sql = '
|
---|
44 | select
|
---|
45 | b.business_name,
|
---|
46 | (
|
---|
47 | select avg(r.review_stars)
|
---|
48 | from review r
|
---|
49 | where r.business_id = b.business_id
|
---|
50 | ) as business_avg_stars,
|
---|
51 | c.category_name,
|
---|
52 | b.business_hours,
|
---|
53 | b.business_descr,
|
---|
54 | b.business_phone
|
---|
55 | from
|
---|
56 | business b
|
---|
57 | join category c on
|
---|
58 | b.category_id = c.category_id
|
---|
59 | where
|
---|
60 | b.business_id = :id';
|
---|
61 | $stm = $conn->prepare($sql);
|
---|
62 | $stm->execute([':id' => $business_id]);
|
---|
63 | $business = $stm->fetch();
|
---|
64 |
|
---|
65 | /**
|
---|
66 | * Fetch all services that this business offers and concatenate them in a single string.
|
---|
67 | */
|
---|
68 | $sql = '
|
---|
69 | select
|
---|
70 | string_agg(s.service_name, \'; \') as services
|
---|
71 | from
|
---|
72 | business_service bs
|
---|
73 | join service s on
|
---|
74 | bs.service_id = s.service_id
|
---|
75 | where business_id = :id';
|
---|
76 | $stm = $conn->prepare($sql);
|
---|
77 | $stm->execute([':id' => $business_id]);
|
---|
78 | $services = $stm->fetch()[0];
|
---|
79 | ?>
|
---|
80 | <div class="row">
|
---|
81 | <div class="col-md-6">
|
---|
82 | <?= outputStars($business['business_avg_stars'], 48) ?>
|
---|
83 |
|
---|
84 | <div class="lead my-3"><strong>Category:</strong> <?= $business['category_name'] ?></div>
|
---|
85 |
|
---|
86 | <div class="fw-light my-3"><strong>Service(s):</strong> <?= $services ?></div>
|
---|
87 |
|
---|
88 | <div class="fw-light my-3"><strong>Description:</strong> <?= $business['business_descr'] ?></div>
|
---|
89 | </div>
|
---|
90 | <div class="col-md-6">
|
---|
91 | <div class="fw-light my-3"><strong>Phone:</strong> <?= $business['business_phone'] ?></div>
|
---|
92 |
|
---|
93 | <div class="fw-light my-3"><strong>Work hours:</strong> <?= $business['business_hours'] ?></div>
|
---|
94 |
|
---|
95 | <div class="fw-light my-3">
|
---|
96 | <strong>Address(es):</strong>
|
---|
97 | <ul>
|
---|
98 | <?php
|
---|
99 | /**
|
---|
100 | * Get all addresses of this business and display them in a list.
|
---|
101 | */
|
---|
102 | $sql = '
|
---|
103 | select
|
---|
104 | address_id,
|
---|
105 | address_street,
|
---|
106 | address_postal_code,
|
---|
107 | address_city
|
---|
108 | from address
|
---|
109 | where business_id = :id';
|
---|
110 | $stm = $conn->prepare($sql);
|
---|
111 | $stm->execute([':id' => $business_id]);
|
---|
112 | $addresses = $stm->fetchAll();
|
---|
113 | foreach ($addresses as $row) {
|
---|
114 | ?>
|
---|
115 | <li>
|
---|
116 | <?= $row['address_street'] ?><br>
|
---|
117 | <?= $row['address_postal_code'] . ' ' . $row['address_city'] ?>
|
---|
118 | </li>
|
---|
119 | <?php } ?>
|
---|
120 | </ul>
|
---|
121 | </div>
|
---|
122 | </div>
|
---|
123 | </div>
|
---|
124 |
|
---|
125 | <hr class="my-5">
|
---|
126 |
|
---|
127 | <h3>Reviews</h3>
|
---|
128 |
|
---|
129 | <?php
|
---|
130 | /**
|
---|
131 | * Get all reviews for this business and display them in a list.
|
---|
132 | */
|
---|
133 | $sql = '
|
---|
134 | select
|
---|
135 | r.reviewer_name,
|
---|
136 | r.reviewer_verified,
|
---|
137 | rv.review_title,
|
---|
138 | rv.review_text,
|
---|
139 | rv.review_stars,
|
---|
140 | rv.address_id,
|
---|
141 | rv.review_timestamp
|
---|
142 | from review rv
|
---|
143 | join reviewer r on
|
---|
144 | rv.reviewer_id = r.reviewer_id
|
---|
145 | where
|
---|
146 | rv.business_id = :id
|
---|
147 | order by
|
---|
148 | rv.review_timestamp';
|
---|
149 | $stm = $conn->prepare($sql);
|
---|
150 | $stm->execute([':id' => $business_id]);
|
---|
151 | $reviews = $stm->fetchAll();
|
---|
152 | foreach ($reviews as $row) {
|
---|
153 | ?>
|
---|
154 | <div class="card shadow-sm mb-3">
|
---|
155 | <div class="card-body">
|
---|
156 | <div class="row">
|
---|
157 | <div class="col-lg-8">
|
---|
158 | <h5 class="card-title">
|
---|
159 | <?= $row['reviewer_name'] ?>
|
---|
160 | <?php if ($row['reviewer_verified']) {
|
---|
161 | echo '<small class="ms-5 text-success"><small>✅ Verified</small></small>';
|
---|
162 | } else {
|
---|
163 | echo '<small class="ms-5 text-muted"><small><span class="opacity-25">☑️</span> Not verified</small></small>';
|
---|
164 | } ?>
|
---|
165 | </h5>
|
---|
166 | </div>
|
---|
167 | <div class="col-lg-4 text-lg-end"><?= outputStars($row['review_stars'], 24) ?></div>
|
---|
168 | </div>
|
---|
169 |
|
---|
170 | <div class="card-text">
|
---|
171 | <div class="lead fw-bold"><?= $row['review_title'] ?></div>
|
---|
172 | <div class="mb-3"><?= $row['review_text'] ?></div>
|
---|
173 | <?php
|
---|
174 | $aid = $row['address_id'];
|
---|
175 | $location = array_values(array_filter($addresses, function($item) use ($aid) {
|
---|
176 | return $item[0] == $aid;
|
---|
177 | }))[0];
|
---|
178 | ?>
|
---|
179 | <div class="text-muted"><small><strong>Location:</strong> <?= $location[1] . ', ' . $location[2] . ' ' . $location[3] ?></small></div>
|
---|
180 | <div class="text-muted"><small><strong>Reviewed at:</strong> <?= date('d.m.Y H:i', strtotime($row['review_timestamp'])) ?></small></div>
|
---|
181 | </div>
|
---|
182 | </div>
|
---|
183 | </div>
|
---|
184 | <?php } ?>
|
---|
185 |
|
---|
186 | <?php
|
---|
187 | /**
|
---|
188 | * If the person viewing this page is logged in as a reviewer, display a form from where
|
---|
189 | * the reviewer can add a review.
|
---|
190 | */
|
---|
191 | ?>
|
---|
192 | <?php if (isset($_SESSION['is_reviewer'])) { ?>
|
---|
193 | <hr id="add-review" class="my-5">
|
---|
194 |
|
---|
195 | <h3 class="text-center pt-3">Add review</h3>
|
---|
196 |
|
---|
197 | <div class="row justify-content-center mt-3">
|
---|
198 | <div class="col-md-8 col-lg-6 col-xl-5">
|
---|
199 | <div class="card shadow-sm p-3">
|
---|
200 | <?php require_once('./inc/alerts-err.php'); ?>
|
---|
201 |
|
---|
202 | <form action="review-add.php" method="POST">
|
---|
203 | <input type="hidden" name="business" value="<?= $business_id ?>">
|
---|
204 | <div class="mb-3">
|
---|
205 | <label class="form-label">Location</label>
|
---|
206 | <div>
|
---|
207 | <?php foreach ($addresses as $i => $row) { ?>
|
---|
208 | <div class="form-check">
|
---|
209 | <input class="form-check-input" type="radio" name="address" id="address<?= $i ?>" value="<?= $row['address_id'] ?>" <?= ($i == 0) ? 'checked' : '' ?>>
|
---|
210 | <label class="form-check-label" for="address<?= $i ?>"><?= $row['address_street'] . ', ' . $row['address_postal_code'] . ' ' . $row['address_city'] ?></label>
|
---|
211 | </div>
|
---|
212 | <?php } ?>
|
---|
213 | </div>
|
---|
214 | </div>
|
---|
215 | <div class="mb-3">
|
---|
216 | <label class="form-label">Star rating</label>
|
---|
217 | <div>
|
---|
218 | <?php for ($i = 1; $i < 6; $i++) { ?>
|
---|
219 | <div class="form-check form-check-inline">
|
---|
220 | <input class="form-check-input" type="radio" name="rating" id="rating<?= $i ?>" value="<?= $i ?>" <?= ($i == 3) ? 'checked' : '' ?>>
|
---|
221 | <label class="form-check-label" for="rating<?= $i ?>"><?= $i ?></label>
|
---|
222 | </div>
|
---|
223 | <?php } ?>
|
---|
224 | </div>
|
---|
225 | </div>
|
---|
226 | <div class="mb-3">
|
---|
227 | <label for="title" class="form-label">Review title</label>
|
---|
228 | <?php
|
---|
229 | /**
|
---|
230 | * Value by default holds the "old" value, i.e. when the user submits
|
---|
231 | * the form, but it has errors, we don't want to lose reviewer's review.
|
---|
232 | */
|
---|
233 | ?>
|
---|
234 | <input type="text" id="title" name="title" class="form-control" minlength="2" maxlength="150" value="<?= (isset($_REQUEST["title"])) ? strip_tags($_REQUEST["title"]) : '' ?>" required>
|
---|
235 | </div>
|
---|
236 | <div class="mb-3">
|
---|
237 | <label for="text" class="form-label">Your review</label>
|
---|
238 | <textarea id="text" name="text" class="form-control" rows="7" minlength="2" maxlength="1000" required><?= (isset($_REQUEST["title"])) ? strip_tags($_REQUEST["title"]) : '' ?></textarea>
|
---|
239 | </div>
|
---|
240 | <button type="submit" class="btn btn-success">Submit</button>
|
---|
241 | </form>
|
---|
242 | </div>
|
---|
243 | </div>
|
---|
244 | </div>
|
---|
245 | <?php } ?>
|
---|
246 | </div>
|
---|
247 | <?php
|
---|
248 | require_once('./inc/footer.php');
|
---|