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