PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.15.4
GiveWP – Donation Plugin and Fundraising Platform v4.15.4
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 / FormBuilder / ViewModels / FormBuilderViewModel.php
give / src / FormBuilder / ViewModels Last commit date
FormBuilderViewModel.php 5 months ago
FormBuilderViewModel.php
416 lines
1 <?php
2
3 namespace Give\FormBuilder\ViewModels;
4
5 use Give\Campaigns\Models\Campaign;
6 use Give\DonationForms\Actions\GenerateDonationFormPreviewRouteUrl;
7 use Give\DonationForms\Models\DonationForm;
8 use Give\DonationForms\ValueObjects\GoalProgressType;
9 use Give\DonationForms\ValueObjects\GoalSource;
10 use Give\DonationForms\ValueObjects\GoalType;
11 use Give\Donations\Models\Donation;
12 use Give\Donations\ValueObjects\DonationMetaKeys;
13 use Give\Donors\Models\Donor;
14 use Give\Donors\ValueObjects\DonorMetaKeys;
15 use Give\FormBuilder\DataTransferObjects\EmailNotificationData;
16 use Give\FormBuilder\ValueObjects\FormBuilderRestRouteConfig;
17 use Give\Framework\FormDesigns\FormDesign;
18 use Give\Framework\FormDesigns\Registrars\FormDesignRegistrar;
19 use Give\Framework\PaymentGateways\PaymentGateway;
20 use Give\Framework\Support\Facades\Scripts\ScriptAsset;
21 use Give\Helpers\IntlTelInput;
22 use Give\Subscriptions\Models\Subscription;
23 use Give_License;
24
25 class FormBuilderViewModel
26 {
27 /**
28 * @since 4.14.0 Add countries key to the returned array
29 * @since 3.12.0 Add goalProgressOptions key to the returned array
30 * @since 3.9.0 Add support to intlTelInputSettings key in the returned array
31 * @since 3.7.0 Add support to isExcerptEnabled key in the returned array
32 * @since 3.2.0 Add nameTitlePrefixes key to the returned array
33 * @since 3.0.0
34 */
35 public function storageData(int $donationFormId): array
36 {
37 /** @var DonationForm $donationForm */
38 $donationForm = DonationForm::find($donationFormId);
39
40 return [
41 'formId' => $donationFormId,
42 'resourceURL' => rest_url(FormBuilderRestRouteConfig::NAMESPACE . '/form/' . $donationFormId),
43 'previewURL' => (new GenerateDonationFormPreviewRouteUrl())($donationFormId),
44 'nonce' => wp_create_nonce('wp_rest'),
45 'blockData' => $donationForm->blocks->toJson(),
46 'settings' => $donationForm->settings->toJson(),
47 'currency' => give_get_currency(),
48 'formDesigns' => array_map(static function ($designClass) {
49 /** @var FormDesign $design */
50 $design = give($designClass);
51
52 return [
53 'id' => $design::id(),
54 'name' => $design::name(),
55 'isMultiStep' => $design->isMultiStep(),
56 ];
57 }, give(FormDesignRegistrar::class)->getDesigns()),
58 'formPage' => [
59 'isEnabled' => give_is_setting_enabled(give_get_option('forms_singular')),
60 // Note: Boolean values must be nested in an array to maintain boolean type, see \WP_Scripts::localize().
61 'permalink' => add_query_arg(['p' => $donationFormId], site_url('?post_type=give_forms')),
62 'rewriteSlug' => get_post_type_object('give_forms')->rewrite['slug'],
63 'baseUrl' => preg_replace('/^https?:\/\//', '', site_url()),
64 ],
65 'gateways' => $this->getGateways(),
66 'gatewaySettingsUrl' => admin_url('edit.php?post_type=give_forms&page=give-settings&tab=gateways'),
67 'isRecurringEnabled' => defined('GIVE_RECURRING_VERSION') ? GIVE_RECURRING_VERSION : null,
68 'recurringAddonData' => [
69 'isInstalled' => defined('GIVE_RECURRING_VERSION'),
70 ],
71 'formFieldManagerData' => [
72 'isInstalled' => defined('GIVE_FFM_VERSION'),
73 'isLicensed' => (Give_License::get_license_by_plugin_dirname('give-form-field-manager')['license'] ?? '') === 'valid',
74 ],
75 'emailTemplateTags' => $this->getEmailTemplateTags(),
76 'emailNotifications' => array_map(static function ($notification) {
77 return EmailNotificationData::fromLegacyNotification($notification);
78 }, apply_filters('give_email_notification_options_metabox_fields', [], $donationFormId)),
79 'emailPreviewURL' => rest_url('givewp/form-builder/email-preview'),
80 'emailDefaultAddress' => get_option('admin_email'),
81 'disallowedFieldNames' => $this->getDisallowedFieldNames(),
82 'donationConfirmationTemplateTags' => $this->getDonationConfirmationPageTemplateTags(),
83 'termsAndConditions' => [
84 'checkboxLabel' => give_get_option('agree_to_terms_label'),
85 'agreementText' => give_get_option('agreement_text'),
86 ],
87 'goalTypeOptions' => $this->getGoalTypeOptions(),
88 'goalSourceOptions' => $this->getGoalSourceOptions(),
89 'goalProgressOptions' => $this->getGoalProgressOptions(),
90 'nameTitlePrefixes' => give_get_option('title_prefixes', array_values(give_get_default_title_prefixes())),
91 'isExcerptEnabled' => give_is_setting_enabled(give_get_option('forms_excerpt')),
92 'intlTelInputSettings' => IntlTelInput::getSettings(),
93 'campaignColors' => $this->getCampaignColors($donationFormId),
94 'showFormGoalNotice' => !get_user_meta(get_current_user_id(), 'givewp_campaign_form_goal_notice', true),
95 'countries' => give_get_country_list(),
96 ];
97 }
98
99 /**
100 * @since 3.0.0
101 */
102 public function isRecurringEnabled(): bool
103 {
104 return defined('GIVE_RECURRING_VERSION') && GIVE_RECURRING_VERSION;
105 }
106
107 /**
108 * @since 3.0.0
109 */
110 public function getGoalTypeOption(
111 string $value,
112 string $label,
113 string $description,
114 bool $isCurrency = false
115 ): array
116 {
117 return [
118 'value' => $value,
119 'label' => $label,
120 'description' => $description,
121 'isCurrency' => $isCurrency,
122 ];
123 }
124
125
126 /**
127 * @since 4.1.0
128 */
129 public function getGoalSourceOption(
130 string $value,
131 string $label,
132 string $description
133 ): array
134 {
135 return [
136 'value' => $value,
137 'label' => $label,
138 'description' => $description,
139 ];
140 }
141
142
143 /**
144 * @since 3.12.0
145 */
146 public function getGoalProgressOption(
147 string $value,
148 string $label,
149 string $description
150 ): array
151 {
152 return [
153 'value' => $value,
154 'label' => $label,
155 'description' => $description
156 ];
157 }
158
159
160 /**
161 * @since 3.0.0
162 */
163 public function getGoalTypeOptions(): array
164 {
165 $options = [
166 $this->getGoalTypeOption(
167 GoalType::AMOUNT,
168 __('Amount Raised', 'give'),
169 __('The total amount raised for the form', 'give'),
170 true
171 ),
172 $this->getGoalTypeOption(
173 GoalType::DONATIONS,
174 __('Number of Donations', 'give'),
175 __('The total number of donations made for the form', 'give')
176 ),
177 $this->getGoalTypeOption(
178 GoalType::DONORS,
179 __('Number of Donors', 'give'),
180 __('The total number of unique donors who have donated to the form', 'give')
181 ),
182 ];
183
184 if ($this->isRecurringEnabled()) {
185 return array_merge($options, [
186 $this->getGoalTypeOption(
187 GoalType::AMOUNT_FROM_SUBSCRIPTIONS,
188 __('Subscription Amount Raised', 'give'),
189 __('The total amount raised for the form through subscriptions', 'give'),
190 true
191 ),
192 $this->getGoalTypeOption(
193 GoalType::SUBSCRIPTIONS,
194 __('Number of Subscriptions', 'give'),
195 __('The total number of subscriptions made for the form', 'give')
196 ),
197 $this->getGoalTypeOption(
198 GoalType::DONORS_FROM_SUBSCRIPTIONS,
199 __('Number of Subscribers', 'give'),
200 __('The total number of unique donors who have donated to the form through subscriptions', 'give')
201 ),
202 ]);
203 }
204
205 return $options;
206 }
207
208 /**
209 * @since 4.1.0
210 */
211 public function getGoalSourceOptions(): array
212 {
213 return [
214 $this->getGoalTypeOption(
215 GoalSource::CAMPAIGN,
216 __('Campaign', 'give'),
217 __('The goal for this form will automatically adjust according to the campaign goal. Change campaign goal.', 'give')
218 ),
219 $this->getGoalTypeOption(
220 GoalSource::FORM,
221 __('Custom', 'give'),
222 __('Set the custom goal for this form', 'give')
223 ),
224 ];
225 }
226
227 /**
228 * @since 3.12.0
229 */
230 public function getGoalProgressOptions(): array
231 {
232 return [
233 $this->getGoalProgressOption(
234 GoalProgressType::ALL_TIME,
235 __('All time', 'give'),
236 __('Displays the goal progress for a lifetime, starting from when this form was published.', 'give')
237 ),
238 $this->getGoalProgressOption(
239 GoalProgressType::CUSTOM,
240 __('Custom', 'give'),
241 __('Displays the goal progress from the start date to the end date.', 'give')
242 )
243 ];
244 }
245
246 /**
247 * @since 3.0.0
248 */
249 public function getEmailTemplateTags(array $tags = []): array
250 {
251 return array_map(static function ($tag) {
252 $tag['id'] = $tag['tag'];
253 $tag['desc'] = html_entity_decode($tag['desc'], ENT_QUOTES);
254 $tag['description'] = html_entity_decode($tag['description'], ENT_QUOTES);
255
256 return $tag;
257 }, array_merge($tags, array_values(give()->email_tags->get_tags())));
258 }
259
260 /**
261 * @since 3.0.0
262 */
263 public function getDonationConfirmationPageTemplateTags(): array
264 {
265 $templateTags = $this->getEmailTemplateTags([
266 [
267 'tag' => 'first_name',
268 'desc' => __('The first name supplied by the donor during their donation.', 'give'),
269 'description' => __('The first name supplied by the donor during their donation.', 'give'),
270 'func' => null,
271 "context" => 'donation',
272 ],
273 [
274 'tag' => 'last_name',
275 'desc' => __('The last name supplied by the donor during their donation.', 'give'),
276 'description' => __('The last name supplied by the donor during their donation.', 'give'),
277 'func' => null,
278 "context" => 'donation',
279 ],
280 [
281 'tag' => 'email',
282 'desc' => __('The email supplied by the donor during their donation.', 'give'),
283 'description' => __('The email supplied by the donor during their donation.', 'give'),
284 'func' => null,
285 "context" => 'donation',
286 ],
287 ]);
288
289 $supportedContexts = [
290 "general",
291 "form",
292 "donation",
293 "donor",
294 "subscription",
295 ];
296
297 array_multisort($templateTags, SORT_ASC);
298
299 return array_values(
300 array_filter($templateTags, static function ($tag) use ($supportedContexts) {
301 return !empty($tag['description']) && in_array((string)$tag['context'], $supportedContexts, true);
302 })
303 );
304 }
305
306 /**
307 * @since 3.0.0
308 */
309 public function jsPathFromPluginRoot(): string
310 {
311 return GIVE_PLUGIN_URL . 'build/formBuilderApp.js';
312 }
313
314 /**
315 * @since 3.0.0
316 */
317 public function jsPathToRegistrars(): string
318 {
319 return GIVE_PLUGIN_URL . 'build/formBuilderRegistrars.js';
320 }
321
322 /**
323 * @since 3.0.0
324 */
325 public function jsRegistrarsDependencies(): array
326 {
327 return ScriptAsset::getDependencies(GIVE_PLUGIN_DIR . 'build/formBuilderRegistrars.asset.php');
328 }
329
330 /**
331 * @since 3.0.0
332 */
333 public function jsDependencies(): array
334 {
335 $dependencies = ScriptAsset::getDependencies(GIVE_PLUGIN_DIR . 'build/formBuilderApp.asset.php');
336
337 return array_merge($dependencies, ['@givewp/form-builder/registrars']);
338 }
339
340 /**
341 * @since 3.0.0
342 */
343 public function getGateways(): array
344 {
345 $enabledGateways = array_keys(give_get_option('gateways_v3', []));
346
347 $builderPaymentGatewayData = array_map(static function ($gatewayClass) use ($enabledGateways) {
348 /** @var PaymentGateway $gateway */
349 $gateway = give($gatewayClass);
350
351 return [
352 'id' => $gateway::id(),
353 'enabled' => in_array($gateway::id(), $enabledGateways, true),
354 'label' => give_get_gateway_checkout_label($gateway::id(), 3) ?? $gateway->getPaymentMethodLabel(),
355 'supportsSubscriptions' => $gateway->supportsSubscriptions(),
356 ];
357 }, give()->gateways->getPaymentGateways(3));
358
359 return array_values($builderPaymentGatewayData);
360 }
361
362 /**
363 * In the Form Builder custom fields have meta keys. These meta keys are used for both the field name and the meta,
364 * as not to be too confusing. This array is used to prevent the user from creating meta keys that conflict with the
365 * existing meta or field names.
366 *
367 * @since 4.3.2 Add country, state, city, zip, address1, and address2 to the disallowed field names.
368 * @since 3.0.0
369 */
370 protected function getDisallowedFieldNames(): array
371 {
372 $disallowedFieldNames = array_merge(
373 Donation::propertyKeys(),
374 array_values(DonationMetaKeys::toArray()),
375 Donor::propertyKeys(),
376 array_values(DonorMetaKeys::toArray()),
377 Subscription::propertyKeys(),
378 [
379 'fund_id',
380 'login',
381 'consent',
382 'donation-summary',
383 'country',
384 'state',
385 'city',
386 'zip',
387 'address1',
388 'address2',
389 ]
390 );
391
392 return array_values(array_unique($disallowedFieldNames));
393 }
394
395 /**
396 * @since 4.1.0
397 */
398 private function getCampaignColors(int $formId): array
399 {
400 /** @var Campaign $campaign */
401 $campaign = give()->campaigns->getByFormId($formId);
402
403 if ($campaign) {
404 return [
405 'primaryColor' => $campaign->primaryColor,
406 'secondaryColor' => $campaign->secondaryColor,
407 ];
408 }
409
410 return [
411 'primaryColor' => '',
412 'secondaryColor' => '',
413 ];
414 }
415 }
416