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