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