PluginProbe
GiveWP – Donation Plugin and Fundraising Platform / 4.15.5
GiveWP – Donation Plugin and Fundraising Platform v4.15.5
4.18.0 4.17.0 4.16.9 4.16.8.1 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 All 257 releases
give / src / DonationForms / Actions / ConvertDonationAmountBlockToFieldsApi.php

ConvertDonationAmountBlockToFieldsApi.php in GiveWP – Donation Plugin and Fundraising Platform 4.15.5, at src/DonationForms/Actions/ConvertDonationAmountBlockToFieldsApi.php

213 lines 7.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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