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