PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.16.8
GiveWP – Donation Plugin and Fundraising Platform v4.16.8
4.16.8 4.16.7.2 4.16.7.1 4.16.7 4.16.6.1 4.16.6 4.16.5.1 4.16.5 4.16.4 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 3 days ago ConvertDonationFormBlocksToFieldsApi.php 6 months ago ConvertQueryDataToDonationForm.php 2 years ago DispatchDonateControllerDonationCreatedListeners.php 2 years 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 IsolateEnqueuedFormViewAssets.php 2 weeks ago PrintFormMetaTags.php 1 year ago ReplaceGiveReceiptShortcodeViewWithDonationConfirmationIframe.php 2 years ago SanitizeDonationFormPreviewRequest.php 2 years ago StoreBackwardsCompatibleFormMeta.php 2 years ago ValidateDonationFormRequest.php 1 week ago ValidateReceiptViewPermission.php 1 year ago
ConvertDonationAmountBlockToFieldsApi.php
231 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.16.8 Exempt admin-defined amounts from the custom amount minimum and maximum, and fall back
32 * to the lowest admin-defined amount when no custom amount minimum applies.
33 * @since 4.16.5 Set default value for the levelId hidden field.
34 * @since 4.10.0 Replaced generic 'currency' rule with custom CurrencyRule that uses GiveWP's currency list
35 * @since 3.0.0
36 *
37 * @throws EmptyNameException
38 * @throws NameCollisionException
39 */
40 public function __invoke(DonationAmountBlockModel $block, string $currency): DonationAmount
41 {
42 $amountField = DonationAmount::make('donationAmount')->tap(function (Group $group) use ($block, $currency) {
43 $amountRules = ['required', 'numeric'];
44 $exemptAmounts = $block->getAdminDefinedAmounts();
45
46 if (!$block->isCustomAmountEnabled() &&
47 $block->getPriceOption() === 'set') {
48 $size = $block->getSetPrice();
49
50 $amountRules[] = new Size($size);
51 } else {
52 $minimum = $block->getMinimumAmount();
53
54 if ($minimum !== null) {
55 $amountRules[] = (new Min($minimum))->exemptAmounts(...$exemptAmounts);
56 }
57 }
58
59 if ($block->isCustomAmountEnabled() && $block->getCustomAmountMax() > 0) {
60 $amountRules[] = (new Max($block->getCustomAmountMax()))->exemptAmounts(...$exemptAmounts);
61 }
62
63 /** @var Amount $amountNode */
64 $amountNode = $group->getNodeByName('amount');
65 $amountNode
66 ->label($block->getLabel())
67 ->allowCustomAmount($block->isCustomAmountEnabled())
68 ->rules(...$amountRules);
69
70 $priceOptions = $block->getPriceOption();
71 $defaultLevelId = '';
72 if ($priceOptions === 'multi') {
73 ['levels' => $levels, 'checked' => $checked] = $this->prepareLevelsArray($block);
74
75 $amountNode
76 ->allowLevels()
77 ->levels(...$levels)
78 ->defaultValue($checked);
79
80 foreach ($levels as $index => $level) {
81 if ($level['checked']) {
82 $defaultLevelId = (string)$index;
83 break;
84 }
85 }
86 } else {
87 $amountNode
88 ->fixedAmountValue($block->getSetPrice())
89 ->defaultValue($block->getSetPrice());
90 }
91
92 /** @var Hidden $levelIdNode */
93 $levelIdNode = $group->getNodeByName('levelId');
94 $levelIdNode->defaultValue($defaultLevelId);
95
96 /** @var Hidden $currencyNode */
97 $currencyNode = $group->getNodeByName('currency');
98 $currencyNode
99 ->defaultValue($currency)
100 ->rules('required', new CurrencyRule());
101 });
102
103 if (!$block->isRecurringEnabled()) {
104 $donationType = Hidden::make('donationType')
105 ->defaultValue(DonationType::SINGLE()->getValue())
106 ->rules(new DonationTypeRule());
107
108 $amountField->donationType($donationType);
109 } else {
110 $subscriptionPeriod = $this->getRecurringAmountPeriodField($block);
111
112 $donationTypeDefault = $subscriptionPeriod->getDefaultValue() === 'one-time' ? DonationType::SINGLE(
113 )->getValue() : DonationType::SUBSCRIPTION()->getValue();
114
115 $donationType = Hidden::make('donationType')
116 ->defaultValue($donationTypeDefault)
117 ->rules(new DonationTypeRule());
118
119 $subscriptionFrequency = Hidden::make('subscriptionFrequency')
120 ->defaultValue($block->getRecurringBillingInterval())
121 ->rules(new SubscriptionFrequencyRule());
122
123 $subscriptionInstallments = Hidden::make('subscriptionInstallments')
124 ->defaultValue($block->getRecurringLengthOfTime())
125 ->rules(new SubscriptionInstallmentsRule());
126
127 $amountField
128 ->enableSubscriptions()
129 ->subscriptionDetailsAreFixed($block->isRecurringFixed())
130 ->donationType($donationType)
131 ->subscriptionPeriod($subscriptionPeriod)
132 ->subscriptionFrequency($subscriptionFrequency)
133 ->subscriptionInstallments($subscriptionInstallments);
134 }
135
136 return $amountField;
137 }
138
139 /**
140 * @since 3.0.0
141 *
142 * @throws EmptyNameException
143 */
144 protected function getRecurringAmountPeriodField(DonationAmountBlockModel $block): Field
145 {
146 $recurringBillingPeriodOptions = $block->getRecurringBillingPeriodOptions();
147
148 // if recurring is fixed - fields are all hidden
149 if ($block->isRecurringFixed()) {
150 $fixedBillingPeriod = $recurringBillingPeriodOptions[0];
151
152 $subscriptionPeriodDefaultValue = SubscriptionPeriod::isValid(
153 $fixedBillingPeriod
154 ) ? (new SubscriptionPeriod($fixedBillingPeriod))->getValue() : SubscriptionPeriod::MONTH()->getValue();
155
156 return Hidden::make('subscriptionPeriod')
157 ->defaultValue($subscriptionPeriodDefaultValue)
158 ->rules(new SubscriptionPeriodRule());
159 }
160
161 if ($block->isRecurringEnableOneTimeDonations()) {
162 $recurringBillingPeriodOptions = array_merge(['one-time'], $recurringBillingPeriodOptions);
163 }
164
165 $options = array_map(static function ($option) {
166 if (SubscriptionPeriod::isValid($option)) {
167 $subscriptionPeriod = new SubscriptionPeriod($option);
168
169 return new Option($subscriptionPeriod->getValue(), $subscriptionPeriod->label(0));
170 }
171
172 return new Option($option, $option === 'one-time' ? __('One Time', 'give') : ucfirst($option));
173 }, $recurringBillingPeriodOptions);
174
175 $recurringOptInDefault = $block->getRecurringOptInDefaultBillingPeriod();
176
177 if (SubscriptionPeriod::isValid($recurringOptInDefault)) {
178 $subscriptionPeriod = new SubscriptionPeriod($recurringOptInDefault);
179
180 $defaultValue = $subscriptionPeriod->getValue();
181 } else {
182 $defaultValue = 'one-time';
183 }
184
185 return Radio::make('subscriptionPeriod')
186 ->defaultValue($defaultValue)
187 ->label(__('Choose your donation frequency', 'give'))
188 ->options(...$options)
189 ->rules(new SubscriptionPeriodRule());
190 }
191
192 /**
193 * Prepares the options array to be used in the field.
194 *
195 * @since 4.16.5 Add per-level "checked" flag.
196 * @since 3.12.0
197 *
198 * @return array ['levels' => ['label' => string, 'value' => string, 'checked' => bool][], 'checked' => string|null]
199 */
200 private function prepareLevelsArray(DonationAmountBlockModel $block): array
201 {
202 $checked = null;
203 $levels = array_values(
204 array_filter(
205 array_map(
206 function ($item) use (&$checked, $block) {
207 if (isset($item['checked']) && $item['checked']) {
208 $checked = $item['value'];
209 }
210
211 return [
212 'value' => $item['value'] ?? '',
213 'label' => $block->isDescriptionEnabled() ? $item['label'] : '',
214 'checked' => isset($item['checked']) && $item['checked'],
215 ];
216 },
217 $block->getLevels()
218 ),
219 function ($item) {
220 return $item['value'] !== '';
221 }
222 )
223 );
224
225 return [
226 'levels' => $levels,
227 'checked' => $checked,
228 ];
229 }
230 }
231