PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.3.2
GiveWP – Donation Plugin and Fundraising Platform v4.3.2
4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / src / DonationForms / Blocks / DonationFormBlock / Controllers / BlockRenderController.php
give / src / DonationForms / Blocks / DonationFormBlock / Controllers Last commit date
BlockRenderController.php 1 year ago
BlockRenderController.php
135 lines
1 <?php
2
3 namespace Give\DonationForms\Blocks\DonationFormBlock\Controllers;
4
5 use Give\DonationForms\Actions\GenerateDonationConfirmationReceiptViewRouteUrl;
6 use Give\DonationForms\Actions\GenerateDonationFormViewRouteUrl;
7 use Give\DonationForms\Blocks\DonationFormBlock\DataTransferObjects\BlockAttributes;
8 use Give\DonationForms\DataTransferObjects\DonationConfirmationReceiptViewRouteData;
9 use Give\DonationForms\Models\DonationForm;
10 use Give\Framework\EnqueueScript;
11 use Give\Framework\Routes\RouteListener;
12 use Give\Helpers\Language;
13
14 class BlockRenderController
15 {
16 /**
17 * @since 4.1.0
18 */
19 protected static int $embedInstance = 0;
20
21 /**
22 * @since 4.1.0 updated with embed ID instance fallback when block ID is not set.
23 * @since 3.22.0 Add locale support
24 * @since 3.2.0 include form url for new tab format.
25 * @since 3.0.0
26 *
27 * @return string|null
28 */
29 public function render(array $attributes)
30 {
31 // return early if we're still inside the editor to avoid server side effects
32 if (!empty($_REQUEST['post']) || !empty($_REQUEST['action']) || !empty($_REQUEST['_locale'])) {
33 return null;
34 }
35
36 static::$embedInstance++;
37
38 $blockAttributes = BlockAttributes::fromArray($attributes);
39
40 if (!$blockAttributes->formId) {
41 return null;
42 }
43
44 $this->loadEmbedScript();
45
46 /** @var DonationForm $donationForm */
47 $donationForm = DonationForm::find($blockAttributes->formId);
48
49 $embedId = $blockAttributes->blockId ?? 'givewp-embed-' . static::$embedInstance;
50
51 $locale = Language::getLocale();
52 $viewUrl = $this->getViewUrl($donationForm, $embedId);
53 $formUrl = esc_url(add_query_arg(['p' => $blockAttributes->formId], site_url('?post_type=give_forms')));
54 $formViewUrl = $this->getFormViewUrl($donationForm);
55
56 /**
57 * Note: iframe-resizer uses querySelectorAll so using a data attribute makes the most sense to target.
58 * It will also generate a dynamic ID - so when we have multiple embeds on a page there will be no conflict.
59 */
60 return "<div class='root-data-givewp-embed' data-form-locale='$locale' data-form-url='$formUrl' data-form-view-url='$formViewUrl' data-src='$viewUrl' data-givewp-embed-id='$embedId' data-form-format='$blockAttributes->formFormat' data-open-form-button='$blockAttributes->openFormButton'></div>";
61 }
62
63 /**
64 * If the page loads with our receipt route listener args then we need to render the receipt.
65 *
66 * @since 3.0.0
67 */
68 protected function shouldDisplayDonationConfirmationReceipt(string $embedId): bool
69 {
70 $routeListener = new RouteListener(
71 'donation-completed',
72 'show-donation-confirmation-receipt'
73 );
74
75 return $routeListener->isValid($_GET, function ($request) use ($embedId) {
76 $isset = isset($request['givewp-embed-id'], $request['givewp-receipt-id']);
77
78 return $isset && $request['givewp-embed-id'] === $embedId && DonationConfirmationReceiptViewRouteData::isReceiptIdValid(
79 $request['givewp-receipt-id']
80 );
81 });
82 }
83
84 /**
85 * Get the iframe URL.
86 * This could either be the donation form view or the donation confirmation receipt view.
87 *
88 * @since 3.0.0
89 */
90 private function getViewUrl(DonationForm $donationForm, string $embedId): string
91 {
92 if ($this->shouldDisplayDonationConfirmationReceipt($embedId)) {
93 $receiptId = give_clean($_GET['givewp-receipt-id']);
94
95 return (new GenerateDonationConfirmationReceiptViewRouteUrl())($receiptId);
96 }
97
98 return $this->getFormViewUrl($donationForm);
99 }
100
101 /**
102 * @since 3.4.0
103 */
104 private function getFormViewUrl(DonationForm $donationForm): string
105 {
106 return (new GenerateDonationFormViewRouteUrl())($donationForm->id);
107 }
108
109 /**
110 *
111 * Load embed givewp script to resize iframe
112 * @see https://github.com/davidjbradshaw/iframe-resizer
113 *
114 * @since 3.0.0
115 */
116 protected function loadEmbedScript()
117 {
118 (new EnqueueScript(
119 'givewp-donation-form-embed-app',
120 'build/donationFormBlockApp.js',
121 GIVE_PLUGIN_DIR,
122 GIVE_PLUGIN_URL,
123 'give'
124 ))
125 ->dependencies(['jquery'])
126 ->loadInFooter()
127 ->enqueue();
128
129 wp_enqueue_style(
130 'givewp-donation-form-embed-app',
131 GIVE_PLUGIN_URL . 'build/donationFormBlockApp.css'
132 );
133 }
134 }
135