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