PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.33.0
GiveWP – Donation Plugin and Fundraising Platform v2.33.0
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 / Views / IframeView.php
give / src / Views Last commit date
Admin 3 years ago Components 3 years ago Form 2 years ago Admin.php 4 years ago IframeContentView.php 3 years ago IframeView.php 4 years ago Views.php 4 years ago
IframeView.php
370 lines
1 <?php
2 /**
3 * Handle iframe skin.
4 *
5 * @package Give
6 */
7
8 namespace Give\Views;
9
10 use Give\Form\Template;
11 use Give\Helpers\Form\Template as FormTemplateUtils;
12 use Give\Helpers\Form\Utils as FormUtils;
13 use Give\Helpers\Utils as GlobalUtils;
14
15 /**
16 * Class IframeView
17 *
18 * Note: only for internal use.
19 *
20 * @package Give
21 * @since 2.7.0
22 */
23 class IframeView
24 {
25 /**
26 * Iframe URL.
27 *
28 * This will be use to setup src attribute.
29 *
30 * @since 2.7.0
31 * @var string
32 */
33 protected $url;
34
35 /**
36 * Flag to check whether show modal or iframe on page.
37 *
38 * @since 2.7.0
39 * @var bool
40 */
41 protected $modal = false;
42
43 /**
44 * Flag to check whether on not auto scroll page to iframe.
45 *
46 * @since 2.7.0
47 * @var int
48 */
49 protected $autoScroll = 0;
50
51 /**
52 * Iframe minimum height.
53 *
54 * @since 2.7.0
55 * @var bool
56 */
57 protected $minHeight = null;
58
59 /**
60 * Unique identifier.
61 *
62 * @var string|null
63 */
64 protected $uniqueId = null;
65
66 /**
67 * Button title.
68 *
69 * @var string|null
70 */
71 protected $buttonTitle = null;
72
73 /**
74 * Button color.
75 *
76 * @var string|null
77 */
78 protected $buttonColor = null;
79
80 /**
81 * Form template.
82 *
83 * @var Template
84 */
85 protected $template = null;
86
87 /**
88 * Form id.
89 *
90 * @var int
91 */
92 protected $formId = 0;
93
94 /**
95 * IframeView Constructor
96 *
97 * @param Template $template
98 */
99 public function __construct($template = null)
100 {
101 $this->uniqueId = uniqid('give-');
102 $this->buttonTitle = esc_html__('Click to donate', 'give');
103 }
104
105 /**
106 * Set iframe URL.
107 *
108 * @param string $url
109 *
110 * @return $this
111 */
112 public function setURL($url = null)
113 {
114 $this->url = esc_url(
115 add_query_arg(
116 ['giveDonationFormInIframe' => 1],
117 $url
118 )
119 );
120
121 return $this;
122 }
123
124 /**
125 * Set whether or not show modal.
126 *
127 * @param bool $set
128 *
129 * @return $this
130 */
131 public function showInModal($set)
132 {
133 $this->modal = $set;
134
135 return $this;
136 }
137
138 /**
139 * Button title.
140 *
141 * @param string $title
142 *
143 * @return $this
144 */
145 public function setButtonTitle($title)
146 {
147 $this->buttonTitle = $title;
148
149 return $this;
150 }
151
152 /**
153 * Button color.
154 *
155 * @param string $color
156 *
157 * @return $this
158 */
159 public function setButtonColor($color)
160 {
161 $this->buttonColor = $color;
162
163 return $this;
164 }
165
166 /**
167 * Form id.
168 *
169 * @param int $id
170 *
171 * @return $this
172 */
173 public function setFormId($id)
174 {
175 $this->formId = $id;
176
177 return $this;
178 }
179
180 /**
181 * Return whether or not rest api request to render donation form block.
182 *
183 * @since 2.7.0
184 * @return bool
185 */
186 private function isDonationFormBlockRendererApiRequest()
187 {
188 return false !== strpos(
189 $_SERVER['REQUEST_URI'],
190 rest_get_url_prefix() . '/wp/v2/block-renderer/give/donation-form'
191 );
192 }
193
194 /**
195 * Extra extra query param to iframe url.
196 *
197 * @since 2.7.0
198 */
199 private function addExtraQueryParams()
200 {
201 // We can prevent live donation on in appropriate situation like: previewing donation form (with draft status)
202 if (FormTemplateUtils\Utils\Frontend::getPreviewDonationFormId(
203 ) || $this->isDonationFormBlockRendererApiRequest()) {
204 $this->url = esc_url(
205 add_query_arg(
206 ['giveDisableDonateNowButton' => 1],
207 $this->url
208 )
209 );
210 }
211 }
212
213 /**
214 * Get iframe HTML.
215 *
216 * @return string
217 */
218 private function getIframeHTML()
219 {
220 ob_start();
221
222 $this->template->renderLoadingView($this->formId);
223
224 $loader = sprintf(
225 '<div class="iframe-loader">%1$s</div>',
226 ob_get_clean()
227 );
228
229 $iframe = sprintf(
230 '<iframe
231 name="give-embed-form"
232 %1$s
233 %4$s
234 data-autoScroll="%2$s"
235 onload="if( \'undefined\' !== typeof Give ) { Give.initializeIframeResize(this) }"
236 style="border: 0;visibility: hidden;%3$s"></iframe>%5$s',
237 $this->modal ? "data-src=\"{$this->url}\"" : "src=\"{$this->url}\"",
238 $this->autoScroll,
239 $this->minHeight ? "min-height: {$this->minHeight}px;" : '',
240 $this->modal ? 'class="in-modal"' : '',
241 $loader
242 );
243
244 if ($this->modal) {
245 $iframe = sprintf(
246 '<div class="modal-inner-wrap">
247 <div class="modal-content">
248 <a href="#" class="close-btn js-give-embed-form-modal-closer" aria-label="%3$s" data-form-id="%3$s" rel="nofollow">%2$s<span>&times;</span></a>
249 %1$s
250 </div>
251 </div>',
252 $iframe,
253 esc_html__('Close', 'give'),
254 $this->uniqueId
255 );
256 }
257
258 return $iframe;
259 }
260
261 /**
262 * Get button HTML.
263 *
264 * @return string
265 */
266 private function getButtonHTML()
267 {
268 return sprintf(
269 '<div class="js-give-embed-form-modal-launcher-wrap">
270 <button
271 type="button"
272 class="js-give-embed-form-modal-opener"
273 data-form-id="%1$s"%3$s>%2$s</button>
274 </div>',
275 $this->uniqueId,
276 $this->buttonTitle,
277 $this->buttonColor ? " style=\"background-color: {$this->buttonColor}\"" : ''
278 );
279 }
280
281 /**
282 * Get iframe URL.
283 *
284 * @return string
285 */
286 private function getIframeURL()
287 {
288 $query_string = array_map('give_clean', wp_parse_args($_SERVER['QUERY_STRING']));
289 $donationHistory = give_get_purchase_session();
290 $hasAction = !empty($query_string['giveDonationAction']);
291 $this->autoScroll = absint($hasAction);
292 $donationFormHasSession = null;
293
294 if ($donationHistory) {
295 $donationFormHasSession = $this->formId === absint($donationHistory['post_data'] ['give-form-id']);
296 }
297
298 // Do not pass donation acton by query param if does not belong to current form.
299 if (
300 $hasAction &&
301 !empty($donationHistory) &&
302 !$donationFormHasSession
303 ) {
304 unset($query_string['giveDonationAction']);
305 $hasAction = false;
306 $this->autoScroll = 0;
307 }
308
309 // Build iframe url.
310 $url = Give()->routeForm->getURL(get_post_field('post_name', $this->formId));
311
312 if (($hasAction && 'showReceipt' === $query_string['giveDonationAction']) || FormUtils::isViewingFormReceipt(
313 )) {
314 $url = FormUtils::getSuccessPageURL();
315 } elseif (($hasAction && 'failedDonation' === $query_string['giveDonationAction'])) {
316 $url = $this->template->getFailedPageURL($this->formId);
317 $query_string['showFailedDonationError'] = 1;
318 }
319
320 $iframe_url = add_query_arg(
321 array_merge(['giveDonationFormInIframe' => 1], $query_string),
322 $url
323 );
324
325 return GlobalUtils::removeDonationAction($iframe_url);
326 }
327
328 /**
329 * Setup Default config.
330 */
331 private function loadDefaultConfig()
332 {
333 $activeFormTemplate = FormTemplateUtils::getActiveID($this->formId);
334 $this->template = Give()->templates->getTemplate($activeFormTemplate);
335 $this->minHeight = $this->template->getFormStartingHeight($this->formId);
336
337 $this->url = $this->url ?: $this->getIframeURL();
338
339 $this->addExtraQueryParams();
340 }
341
342 /**
343 * Render view.
344 *
345 * Note: if you want to overwrite this function then do not forget to add action hook in footer and header.
346 * We use these hooks to manipulated donation form related actions.
347 *
348 * @since 2.7.0
349 */
350 public function render()
351 {
352 ob_start();
353
354 $this->loadDefaultConfig();
355
356 if ($this->modal) {
357 echo $this->getButtonHTML();
358 }
359
360 printf(
361 '<div class="give-embed-form-wrapper%1$s" id="%2$s">%3$s</div>',
362 $this->modal ? ' is-hide' : '',
363 $this->uniqueId,
364 $this->getIframeHTML()
365 );
366
367 return ob_get_clean();
368 }
369 }
370