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