PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 3.7.0
GiveWP – Donation Plugin and Fundraising Platform v3.7.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 2 years ago Form 2 years ago Admin.php 4 years ago IframeContentView.php 3 years ago IframeView.php 2 years ago Views.php 4 years ago
IframeView.php
372 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 * @since 3.7.0 Escape attributes
265 *
266 * @return string
267 */
268 private function getButtonHTML()
269 {
270 return sprintf(
271 '<div class="js-give-embed-form-modal-launcher-wrap">
272 <button
273 type="button"
274 class="js-give-embed-form-modal-opener"
275 data-form-id="%1$s"%3$s>%2$s</button>
276 </div>',
277 esc_attr($this->uniqueId),
278 esc_html($this->buttonTitle),
279 $this->buttonColor ? ' style="background-color: ' . esc_attr($this->buttonColor) . '"' : ''
280 );
281 }
282
283 /**
284 * Get iframe URL.
285 *
286 * @return string
287 */
288 private function getIframeURL()
289 {
290 $query_string = array_map('give_clean', wp_parse_args($_SERVER['QUERY_STRING']));
291 $donationHistory = give_get_purchase_session();
292 $hasAction = !empty($query_string['giveDonationAction']);
293 $this->autoScroll = absint($hasAction);
294 $donationFormHasSession = null;
295
296 if ($donationHistory) {
297 $donationFormHasSession = $this->formId === absint($donationHistory['post_data'] ['give-form-id']);
298 }
299
300 // Do not pass donation acton by query param if does not belong to current form.
301 if (
302 $hasAction &&
303 !empty($donationHistory) &&
304 !$donationFormHasSession
305 ) {
306 unset($query_string['giveDonationAction']);
307 $hasAction = false;
308 $this->autoScroll = 0;
309 }
310
311 // Build iframe url.
312 $url = Give()->routeForm->getURL(get_post_field('post_name', $this->formId));
313
314 if (($hasAction && 'showReceipt' === $query_string['giveDonationAction']) || FormUtils::isViewingFormReceipt(
315 )) {
316 $url = FormUtils::getSuccessPageURL();
317 } elseif (($hasAction && 'failedDonation' === $query_string['giveDonationAction'])) {
318 $url = $this->template->getFailedPageURL($this->formId);
319 $query_string['showFailedDonationError'] = 1;
320 }
321
322 $iframe_url = add_query_arg(
323 array_merge(['giveDonationFormInIframe' => 1], $query_string),
324 $url
325 );
326
327 return GlobalUtils::removeDonationAction($iframe_url);
328 }
329
330 /**
331 * Setup Default config.
332 */
333 private function loadDefaultConfig()
334 {
335 $activeFormTemplate = FormTemplateUtils::getActiveID($this->formId);
336 $this->template = Give()->templates->getTemplate($activeFormTemplate);
337 $this->minHeight = $this->template->getFormStartingHeight($this->formId);
338
339 $this->url = $this->url ?: $this->getIframeURL();
340
341 $this->addExtraQueryParams();
342 }
343
344 /**
345 * Render view.
346 *
347 * Note: if you want to overwrite this function then do not forget to add action hook in footer and header.
348 * We use these hooks to manipulated donation form related actions.
349 *
350 * @since 2.7.0
351 */
352 public function render()
353 {
354 ob_start();
355
356 $this->loadDefaultConfig();
357
358 if ($this->modal) {
359 echo $this->getButtonHTML();
360 }
361
362 printf(
363 '<div class="give-embed-form-wrapper%1$s" id="%2$s">%3$s</div>',
364 $this->modal ? ' is-hide' : '',
365 $this->uniqueId,
366 $this->getIframeHTML()
367 );
368
369 return ob_get_clean();
370 }
371 }
372