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