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