PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.14.2
GiveWP – Donation Plugin and Fundraising Platform v4.14.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 10 months ago
BlockRenderController.php
144 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.7.0 detach check for gutenberg editor to make this more reusable
23 * @since 4.1.0 updated with embed ID instance fallback when block ID is not set.
24 * @since 3.22.0 Add locale support
25 * @since 3.2.0 include form url for new tab format.
26 * @since 3.0.0
27 *
28 * @return string|null
29 */
30 public function render(array $attributes)
31 {
32 static::$embedInstance++;
33
34 $blockAttributes = BlockAttributes::fromArray($attributes);
35
36 if (!$blockAttributes->formId) {
37 return null;
38 }
39
40 $this->loadEmbedScript();
41
42 /** @var DonationForm $donationForm */
43 $donationForm = DonationForm::find($blockAttributes->formId);
44
45 $embedId = $blockAttributes->blockId ?? 'givewp-embed-' . static::$embedInstance;
46
47 $locale = Language::getLocale();
48 $viewUrl = $this->getViewUrl($donationForm, $embedId);
49 $formUrl = esc_url(add_query_arg(['p' => $blockAttributes->formId], site_url('?post_type=give_forms')));
50 $formViewUrl = $this->getFormViewUrl($donationForm);
51 $colorSettings = $donationForm->getColorSettings();
52
53 /**
54 * Note: iframe-resizer uses querySelectorAll so using a data attribute makes the most sense to target.
55 * It will also generate a dynamic ID - so when we have multiple embeds on a page there will be no conflict.
56 */
57 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' style='--givewp-primary-color: {$colorSettings['primaryColor']}; --givewp-secondary-color: {$colorSettings['secondaryColor']};'></div>";
58 }
59
60 /**
61 * Return early if we're still inside the editor to avoid server side effects
62 *
63 * @since 4.7.0
64 *
65 * @return boolean
66 */
67 public function isGutenbergEditor(): bool
68 {
69 return !empty($_REQUEST['post']) || !empty($_REQUEST['action']) || !empty($_REQUEST['_locale']);
70 }
71
72 /**
73 * If the page loads with our receipt route listener args then we need to render the receipt.
74 *
75 * @since 3.0.0
76 */
77 protected function shouldDisplayDonationConfirmationReceipt(string $embedId): bool
78 {
79 $routeListener = new RouteListener(
80 'donation-completed',
81 'show-donation-confirmation-receipt'
82 );
83
84 return $routeListener->isValid($_GET, function ($request) use ($embedId) {
85 $isset = isset($request['givewp-embed-id'], $request['givewp-receipt-id']);
86
87 return $isset && $request['givewp-embed-id'] === $embedId && DonationConfirmationReceiptViewRouteData::isReceiptIdValid(
88 $request['givewp-receipt-id']
89 );
90 });
91 }
92
93 /**
94 * Get the iframe URL.
95 * This could either be the donation form view or the donation confirmation receipt view.
96 *
97 * @since 3.0.0
98 */
99 private function getViewUrl(DonationForm $donationForm, string $embedId): string
100 {
101 if ($this->shouldDisplayDonationConfirmationReceipt($embedId)) {
102 $receiptId = give_clean($_GET['givewp-receipt-id']);
103
104 return (new GenerateDonationConfirmationReceiptViewRouteUrl())($receiptId);
105 }
106
107 return $this->getFormViewUrl($donationForm);
108 }
109
110 /**
111 * @since 3.4.0
112 */
113 private function getFormViewUrl(DonationForm $donationForm): string
114 {
115 return (new GenerateDonationFormViewRouteUrl())($donationForm->id);
116 }
117
118 /**
119 *
120 * Load embed givewp script to resize iframe
121 * @see https://github.com/davidjbradshaw/iframe-resizer
122 *
123 * @since 3.0.0
124 */
125 protected function loadEmbedScript()
126 {
127 (new EnqueueScript(
128 'givewp-donation-form-embed-app',
129 'build/donationFormBlockApp.js',
130 GIVE_PLUGIN_DIR,
131 GIVE_PLUGIN_URL,
132 'give'
133 ))
134 ->dependencies(['jquery'])
135 ->loadInFooter()
136 ->enqueue();
137
138 wp_enqueue_style(
139 'givewp-donation-form-embed-app',
140 GIVE_PLUGIN_URL . 'build/donationFormBlockApp.css'
141 );
142 }
143 }
144