PluginProbe
Site Reviews / trunk
Site Reviews vtrunk
8.3.1 8.3.0 8.2.2 8.2.1 8.2.0 8.1.0 8.0.13 8.0.12 8.0.11 trunk 1.2.2 2.17.1 3.5.4 4.7.0 5.25.1 6.11.8 7.0.10 7.0.11 7.0.12 7.0.13 7.0.14 7.0.15 7.0.16 7.0.17 7.0.18 All 54 releases
site-reviews / plugin / Controllers / PublicController.php

PublicController.php in Site Reviews trunk, at plugin/Controllers/PublicController.php

123 lines 3.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace GeminiLabs\SiteReviews\Controllers;
4
5 use GeminiLabs\SiteReviews\Commands\CreateReview;
6 use GeminiLabs\SiteReviews\Commands\EnqueuePublicAssets;
7 use GeminiLabs\SiteReviews\Commands\FetchPagedReviews;
8 use GeminiLabs\SiteReviews\Contracts\BuilderContract;
9 use GeminiLabs\SiteReviews\Helpers\Arr;
10 use GeminiLabs\SiteReviews\Modules\Encryption;
11 use GeminiLabs\SiteReviews\Modules\Html\Builder;
12 use GeminiLabs\SiteReviews\Modules\Schema;
13 use GeminiLabs\SiteReviews\Modules\Style;
14 use GeminiLabs\SiteReviews\Request;
15
16 class PublicController extends AbstractController
17 {
18 /**
19 * @action site-reviews/route/ajax/approved-review
20 */
21 public function approvedReviewAjax(Request $request): void
22 {
23 $reviewId = $request->cast('review_id', 'int');
24 $review = glsr_get_review($reviewId);
25 if (!$review->isValid() || !$review->is_approved) {
26 wp_send_json_error();
27 }
28 $html = $review->build($request->toArray());
29 wp_send_json_success([
30 'attributes' => $html->attributes(),
31 'review' => (string) $html,
32 ]);
33 }
34
35 /**
36 * @action wp_enqueue_scripts
37 */
38 public function enqueueAssets(): void
39 {
40 $this->execute(new EnqueuePublicAssets());
41 }
42
43 /**
44 * @action site-reviews/route/ajax/fetch-paged-reviews
45 */
46 public function fetchPagedReviewsAjax(Request $request): void
47 {
48 $this->execute(new FetchPagedReviews($request))->sendJsonResponse();
49 }
50
51 /**
52 * @filter site-reviews/render/view
53 */
54 public function filterRenderView(string $view): string
55 {
56 return glsr(Style::class)->view($view);
57 }
58
59 /**
60 * @action wp_footer
61 */
62 public function renderSchema(): void
63 {
64 if (empty(glsr_get_option('schema.integration.plugin'))) {
65 glsr(Schema::class)->render();
66 }
67 }
68
69 /**
70 * @action site-reviews/route/public/submit-review
71 */
72 public function submitReview(Request $request): void
73 {
74 $command = new CreateReview($request);
75 $this->execute($command);
76 if ($command->successful()) {
77 $redirect = $command->referer();
78 $review = $command->review();
79 if ($review->isValid()) {
80 // carry the success message across the redirect for the no-JS form
81 $token = glsr(Encryption::class)->encryptRequest('submitted', [$review->ID, time()]);
82 if (!empty($token)) {
83 $redirect = add_query_arg(glsr()->prefix, $token, $redirect);
84 }
85 }
86 wp_safe_redirect($redirect);
87 glsr_exit();
88 }
89 }
90
91 /**
92 * @action site-reviews/route/ajax/submit-review
93 */
94 public function submitReviewAjax(Request $request): void
95 {
96 $command = $this->execute(new CreateReview($request));
97 $command->sendJsonResponse();
98 }
99
100 /**
101 * A no-JS form submission redirects back with an encrypted token in the URL.
102 * This stores the success message in the session before the form renders.
103 * The token expires so that a shared or cached URL does not replay the message.
104 *
105 * @action site-reviews/route/get/public/submitted
106 */
107 public function submittedReview(Request $request): void
108 {
109 $review = glsr_get_review(Arr::getAs('int', $request->data, 0));
110 if (!$review->isValid()) {
111 return;
112 }
113 if (time() - Arr::getAs('int', $request->data, 1) > 5 * \MINUTE_IN_SECONDS) {
114 return;
115 }
116 $message = $review->is_approved
117 ? __('Your review has been submitted!', 'site-reviews')
118 : __('Your review has been submitted and is pending approval.', 'site-reviews');
119 glsr()->sessionSet('form_message', $message);
120 glsr()->sessionSet('form_success', true);
121 }
122 }
123