PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.16.3
GiveWP – Donation Plugin and Fundraising Platform v4.16.3
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 / DonationForms / Actions / ConvertDonationAmountBlockToFieldsApi.php
give / src / DonationForms / Actions Last commit date
AddHoneyPotFieldToDonationForms.php 1 year ago ConvertConsentBlockToFieldsApi.php 2 years ago ConvertDonationAmountBlockToFieldsApi.php 9 months ago ConvertDonationFormBlocksToFieldsApi.php 4 months ago ConvertQueryDataToDonationForm.php 2 years ago DispatchDonateControllerDonationCreatedListeners.php 1 year ago DispatchDonateControllerSubscriptionCreatedListeners.php 2 years ago GenerateAuthUrl.php 2 years ago GenerateDonateRouteSignatureArgs.php 2 years ago GenerateDonateRouteUrl.php 2 years ago GenerateDonationConfirmationReceiptUrl.php 2 years ago GenerateDonationConfirmationReceiptViewRouteUrl.php 2 years ago GenerateDonationFormPreviewRouteUrl.php 2 years ago GenerateDonationFormValidationRouteUrl.php 2 years ago GenerateDonationFormViewRouteUrl.php 2 years ago GetOrCreateDonor.php 2 years ago PrintFormMetaTags.php 1 year ago ReplaceGiveReceiptShortcodeViewWithDonationConfirmationIframe.php 1 year ago SanitizeDonationFormPreviewRequest.php 2 years ago StoreBackwardsCompatibleFormMeta.php 2 years ago ValidateReceiptViewPermission.php 1 year ago
ConvertDonationAmountBlockToFieldsApi.php
213 lines
1 <?php
2
3 namespace Give\DonationForms\Actions;
4
5 use Give\DonationForms\Rules\CurrencyRule;
6 use Give\DonationForms\Rules\DonationTypeRule;
7 use Give\DonationForms\Rules\Max;
8 use Give\DonationForms\Rules\Min;
9 use Give\DonationForms\Rules\Size;
10 use Give\DonationForms\Rules\SubscriptionFrequencyRule;
11 use Give\DonationForms\Rules\SubscriptionInstallmentsRule;
12 use Give\DonationForms\Rules\SubscriptionPeriodRule;
13 use Give\Donations\ValueObjects\DonationType;
14 use Give\FormBuilder\BlockModels\DonationAmountBlockModel;
15 use Give\Framework\FieldsAPI\Amount;
16 use Give\Framework\FieldsAPI\DonationAmount;
17 use Give\Framework\FieldsAPI\Exceptions\EmptyNameException;
18 use Give\Framework\FieldsAPI\Exceptions\NameCollisionException;
19 use Give\Framework\FieldsAPI\Field;
20 use Give\Framework\FieldsAPI\Group;
21 use Give\Framework\FieldsAPI\Hidden;
22 use Give\Framework\FieldsAPI\Option;
23 use Give\Framework\FieldsAPI\Radio;
24 use Give\Subscriptions\ValueObjects\SubscriptionPeriod;
25
26
27 class ConvertDonationAmountBlockToFieldsApi
28 {
29
30 /**
31 * @since 4.10.0: Replaced generic 'currency' rule with custom CurrencyRule that uses GiveWP's currency list
32 * @since 3.0.0
33 *
34 * @throws EmptyNameException
35 * @throws NameCollisionException
36 */
37 public function __invoke(DonationAmountBlockModel $block, string $currency): DonationAmount
38 {
39 $amountField = DonationAmount::make('donationAmount')->tap(function (Group $group) use ($block, $currency) {
40 $amountRules = ['required', 'numeric'];
41
42 if (!$block->isCustomAmountEnabled() &&
43 $block->getPriceOption() === 'set') {
44 $size = $block->getSetPrice();
45
46 $amountRules[] = new Size($size);
47 }
48
49 if ($block->isCustomAmountEnabled()) {
50 if ($block->hasAttribute('customAmountMin')) {
51 $amountRules[] = new Min($block->getAttribute('customAmountMin'));
52 }
53
54 if ($block->hasAttribute('customAmountMax') && $block->getAttribute('customAmountMax') > 0) {
55 $amountRules[] = new Max($block->getAttribute('customAmountMax'));
56 }
57 }
58
59 /** @var Amount $amountNode */
60 $amountNode = $group->getNodeByName('amount');
61 $amountNode
62 ->label($block->getLabel())
63 ->allowCustomAmount($block->isCustomAmountEnabled())
64 ->rules(...$amountRules);
65
66 $priceOptions = $block->getPriceOption();
67 if ($priceOptions === 'multi') {
68 ['levels' => $levels, 'checked' => $checked] = $this->prepareLevelsArray($block);
69
70 $amountNode
71 ->allowLevels()
72 ->levels(...$levels)
73 ->defaultValue($checked);
74 } else {
75 $amountNode
76 ->fixedAmountValue($block->getSetPrice())
77 ->defaultValue($block->getSetPrice());
78 }
79
80 /** @var Hidden $currencyNode */
81 $currencyNode = $group->getNodeByName('currency');
82 $currencyNode
83 ->defaultValue($currency)
84 ->rules('required', new CurrencyRule());
85 });
86
87 if (!$block->isRecurringEnabled()) {
88 $donationType = Hidden::make('donationType')
89 ->defaultValue(DonationType::SINGLE()->getValue())
90 ->rules(new DonationTypeRule());
91
92 $amountField->donationType($donationType);
93 } else {
94 $subscriptionPeriod = $this->getRecurringAmountPeriodField($block);
95
96 $donationTypeDefault = $subscriptionPeriod->getDefaultValue() === 'one-time' ? DonationType::SINGLE(
97 )->getValue() : DonationType::SUBSCRIPTION()->getValue();
98
99 $donationType = Hidden::make('donationType')
100 ->defaultValue($donationTypeDefault)
101 ->rules(new DonationTypeRule());
102
103 $subscriptionFrequency = Hidden::make('subscriptionFrequency')
104 ->defaultValue($block->getRecurringBillingInterval())
105 ->rules(new SubscriptionFrequencyRule());
106
107 $subscriptionInstallments = Hidden::make('subscriptionInstallments')
108 ->defaultValue($block->getRecurringLengthOfTime())
109 ->rules(new SubscriptionInstallmentsRule());
110
111 $amountField
112 ->enableSubscriptions()
113 ->subscriptionDetailsAreFixed($block->isRecurringFixed())
114 ->donationType($donationType)
115 ->subscriptionPeriod($subscriptionPeriod)
116 ->subscriptionFrequency($subscriptionFrequency)
117 ->subscriptionInstallments($subscriptionInstallments);
118 }
119
120 return $amountField;
121 }
122
123 /**
124 * @since 3.0.0
125 *
126 * @throws EmptyNameException
127 */
128 protected function getRecurringAmountPeriodField(DonationAmountBlockModel $block): Field
129 {
130 $recurringBillingPeriodOptions = $block->getRecurringBillingPeriodOptions();
131
132 // if recurring is fixed - fields are all hidden
133 if ($block->isRecurringFixed()) {
134 $fixedBillingPeriod = $recurringBillingPeriodOptions[0];
135
136 $subscriptionPeriodDefaultValue = SubscriptionPeriod::isValid(
137 $fixedBillingPeriod
138 ) ? (new SubscriptionPeriod($fixedBillingPeriod))->getValue() : SubscriptionPeriod::MONTH()->getValue();
139
140 return Hidden::make('subscriptionPeriod')
141 ->defaultValue($subscriptionPeriodDefaultValue)
142 ->rules(new SubscriptionPeriodRule());
143 }
144
145 if ($block->isRecurringEnableOneTimeDonations()) {
146 $recurringBillingPeriodOptions = array_merge(['one-time'], $recurringBillingPeriodOptions);
147 }
148
149 $options = array_map(static function ($option) {
150 if (SubscriptionPeriod::isValid($option)) {
151 $subscriptionPeriod = new SubscriptionPeriod($option);
152
153 return new Option($subscriptionPeriod->getValue(), $subscriptionPeriod->label(0));
154 }
155
156 return new Option($option, $option === 'one-time' ? __('One Time', 'give') : ucfirst($option));
157 }, $recurringBillingPeriodOptions);
158
159 $recurringOptInDefault = $block->getRecurringOptInDefaultBillingPeriod();
160
161 if (SubscriptionPeriod::isValid($recurringOptInDefault)) {
162 $subscriptionPeriod = new SubscriptionPeriod($recurringOptInDefault);
163
164 $defaultValue = $subscriptionPeriod->getValue();
165 } else {
166 $defaultValue = 'one-time';
167 }
168
169 return Radio::make('subscriptionPeriod')
170 ->defaultValue($defaultValue)
171 ->label(__('Choose your donation frequency', 'give'))
172 ->options(...$options)
173 ->rules(new SubscriptionPeriodRule());
174 }
175
176 /**
177 * Prepares the options array to be used in the field.
178 *
179 * @since 3.12.0
180 *
181 * @return array ['options' => ['label' => string, 'value' => string][], 'checked' => string]
182 */
183 private function prepareLevelsArray(DonationAmountBlockModel $block): array
184 {
185 $checked = null;
186 $levels = array_values(
187 array_filter(
188 array_map(
189 function ($item) use (&$checked, $block) {
190 if (isset($item['checked']) && $item['checked']) {
191 $checked = $item['value'];
192 }
193
194 return [
195 'value' => $item['value'] ?? '',
196 'label' => $block->isDescriptionEnabled() ? $item['label'] : '',
197 ];
198 },
199 $block->getLevels()
200 ),
201 function ($item) {
202 return $item['value'] !== '';
203 }
204 )
205 );
206
207 return [
208 'levels' => $levels,
209 'checked' => $checked,
210 ];
211 }
212 }
213