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