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