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