PluginProbe
GiveWP – Donation Plugin and Fundraising Platform / 4.18.0
GiveWP – Donation Plugin and Fundraising Platform v4.18.0
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 / ServiceProvider.php

ServiceProvider.php in GiveWP – Donation Plugin and Fundraising Platform 4.18.0, at src/DonationForms/ServiceProvider.php

366 lines 13.2 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;
4
5 use Exception;
6 use Give\DonationForms\OrphanedForms\Actions\Assets as OrphanedFormsAssets;
7 use Give\DonationForms\Actions\AddHoneyPotFieldToDonationForms;
8 use Give\DonationForms\Actions\DispatchDonateControllerDonationCreatedListeners;
9 use Give\DonationForms\Actions\GenerateExternalEmbedScriptUrl;
10 use Give\DonationForms\Actions\GetExternalEmbedScriptData;
11 use Give\DonationForms\Actions\DispatchDonateControllerSubscriptionCreatedListeners;
12 use Give\DonationForms\Actions\PrintFormMetaTags;
13 use Give\DonationForms\Actions\RegisterFormEntity;
14 use Give\DonationForms\Actions\ReplaceGiveReceiptShortcodeViewWithDonationConfirmationIframe;
15 use Give\DonationForms\Actions\SanitizeDonationFormPreviewRequest;
16 use Give\DonationForms\Actions\StoreBackwardsCompatibleFormMeta;
17 use Give\DonationForms\Actions\ValidateReceiptViewPermission;
18 use Give\DonationForms\AsyncData\Actions\GetAsyncFormDataForListView;
19 use Give\DonationForms\AsyncData\Actions\GiveGoalProgressStats;
20 use Give\DonationForms\AsyncData\Actions\LoadAsyncDataAssets;
21 use Give\DonationForms\AsyncData\AdminFormListView\AdminFormListView;
22 use Give\DonationForms\AsyncData\AsyncDataHelpers;
23 use Give\DonationForms\AsyncData\FormGrid\FormGridView;
24 use Give\DonationForms\Blocks\DonationFormBlock\Block as DonationFormBlock;
25 use Give\DonationForms\Controllers\DonationConfirmationReceiptViewController;
26 use Give\DonationForms\Controllers\DonationFormViewController;
27 use Give\DonationForms\DataTransferObjects\DonationConfirmationReceiptViewRouteData;
28 use Give\DonationForms\DataTransferObjects\DonationFormPreviewRouteData;
29 use Give\DonationForms\DataTransferObjects\DonationFormViewRouteData;
30 use Give\DonationForms\FormDesigns\ClassicFormDesign\ClassicFormDesign;
31 use Give\DonationForms\FormDesigns\MultiStepFormDesign\MultiStepFormDesign;
32 use Give\DonationForms\FormDesigns\TwoPanelStepsFormLayout\TwoPanelStepsFormLayout;
33 use Give\DonationForms\FormPage\TemplateHandler;
34 use Give\DonationForms\Migrations\CleanMultipleSlashesOnDB;
35 use Give\DonationForms\Migrations\RemoveDuplicateMeta;
36 use Give\DonationForms\Migrations\UpdateDonationLevelsSchema;
37 use Give\DonationForms\Repositories\DonationFormRepository;
38 use Give\DonationForms\Routes\AuthenticationRoute;
39 use Give\DonationForms\Routes\DonateRoute;
40 use Give\DonationForms\Routes\DonationFormsEntityRoute;
41 use Give\DonationForms\Routes\ValidationRoute;
42 use Give\DonationForms\Shortcodes\GiveFormShortcode;
43 use Give\DonationForms\V2\ListTable\Columns\DonationCountColumn;
44 use Give\DonationForms\V2\ListTable\Columns\DonationRevenueColumn;
45 use Give\DonationForms\V2\ListTable\Columns\GoalColumn;
46 use Give\DonationForms\V2\Models\DonationForm;
47 use Give\DonationForms\ValueObjects\DonationFormStatus;
48 use Give\Framework\FieldsAPI\DonationForm as DonationFormModel;
49 use Give\Framework\FieldsAPI\Exceptions\EmptyNameException;
50 use Give\Framework\FormDesigns\Registrars\FormDesignRegistrar;
51 use Give\Framework\Migrations\MigrationsRegister;
52 use Give\Framework\Routes\Route;
53 use Give\Helpers\Hooks;
54 use Give\Helpers\Language;
55 use Give\Log\Log;
56 use Give\ServiceProviders\ServiceProvider as ServiceProviderInterface;
57
58 class ServiceProvider implements ServiceProviderInterface
59 {
60
61 /*
62 * @inheritdoc
63 */
64 public function register()
65 {
66 give()->singleton('forms', DonationFormRepository::class);
67
68 give()->singleton(TemplateHandler::class, function () {
69 global $post;
70
71 return new TemplateHandler(
72 $post,
73 GIVE_PLUGIN_DIR . 'src/DonationForms/FormPage/templates/form-single.php'
74 );
75 });
76 }
77
78 /*
79 * @inheritdoc
80 */
81 public function boot()
82 {
83 if (function_exists('register_block_type')) {
84 Hooks::addAction('init', DonationFormBlock::class, 'register');
85 }
86
87 $this->registerRoutes();
88 $this->registerFormDesigns();
89 $this->registerSingleFormPage();
90 $this->registerShortcodes();
91 $this->registerPostStatus();
92 $this->registerAddFormSubmenuLink();
93 $this->registerHoneyPotField();
94 $this->registerReceiptViewPermission();
95
96 Hooks::addAction('givewp_donation_form_created', StoreBackwardsCompatibleFormMeta::class);
97 Hooks::addAction('givewp_donation_form_updated', StoreBackwardsCompatibleFormMeta::class);
98
99 $this->dispatchDonateControllerListeners();
100
101 give(MigrationsRegister::class)->addMigrations([
102 CleanMultipleSlashesOnDB::class,
103 RemoveDuplicateMeta::class,
104 UpdateDonationLevelsSchema::class,
105 ]);
106
107 /**
108 * @since 4.2.0
109 */
110 Hooks::addAction('admin_init', OrphanedFormsAssets::class);
111
112 /**
113 * @since 3.16.0
114 * Print form meta tags
115 */
116 Hooks::addAction('wp_head', PrintFormMetaTags::class);
117
118 $this->registerAsyncData();
119 }
120
121 /**
122 * @since 4.1.0 Add support to campaign details page (the "Forms" tab)
123 * @since 3.15.0
124 */
125 private function registerAsyncData()
126 {
127 // Only register assets on the frontend, but not enqueue to prevent loading them in unnecessary places
128 Hooks::addAction('wp_enqueue_scripts', LoadAsyncDataAssets::class, 'registerAssets');
129 add_action('give_before_template_part', function ($templateName) {
130 if ('shortcode-form-grid' === $templateName) {
131 // Enqueue assets previously registered on demand - only when the shortcode gets rendered
132 LoadAsyncDataAssets::enqueueAssets();
133 }
134 });
135
136 // Load assets on the WordPress Block Editor - Gutenberg
137 Hooks::addAction('enqueue_block_editor_assets', LoadAsyncDataAssets::class);
138
139 // Filter from give_goal_progress_stats() function which is used by the admin form list views and form grid view
140 Hooks::addFilter('give_goal_progress_stats', GiveGoalProgressStats::class,
141 'maybeChangeGoalProgressStatsActualValue', 999,
142 2);
143
144 // Form Grid
145 add_filter('give_form_grid_goal_progress_stats_before', function () {
146 $usePlaceholder = give(FormGridView::class)->maybeUsePlaceholderOnGoalAmountRaised();
147
148 if ($usePlaceholder) {
149 //Enable placeholder on the give_goal_progress_stats() function
150 add_filter('give_goal_progress_stats', function ($stats) {
151 $stats['actual'] = AsyncDataHelpers::getSkeletonPlaceholder('1rem');
152
153 return $stats;
154 });
155 add_filter('give_goal_shortcode_stats', function ($stats) {
156 $stats['income'] = 0;
157
158 return $stats;
159 });
160 }
161 });
162
163 Hooks::addAction('wp_ajax_givewp_get_form_async_data_for_list_view', GetAsyncFormDataForListView::class);
164 Hooks::addAction('wp_ajax_nopriv_givewp_get_form_async_data_for_list_view', GetAsyncFormDataForListView::class);
165
166 Hooks::addFilter('give_form_grid_progress_bar_amount_raised_value', FormGridView::class, 'maybeSetProgressBarAmountRaisedAsync',10,2);
167 Hooks::addFilter('give_form_grid_progress_bar_donations_count_value', FormGridView::class, 'maybeSetProgressBarDonationsCountAsync',10,2);
168 }
169
170 /**
171 * @since 3.16.0
172 */
173 private function registerAddFormSubmenuLink()
174 {
175 Hooks::addAction('admin_menu', DonationFormsAdminPage::class, 'addFormSubmenuLink', 999);
176 }
177
178 /**
179 * @since 3.0.0
180 */
181 private function registerRoutes()
182 {
183 /**
184 * @since 3.0.0
185 */
186 Route::post('donate', DonateRoute::class);
187
188 /**
189 * @since 3.0.0
190 */
191 Route::post('validate', ValidationRoute::class);
192
193 /**
194 * @since 3.0.0
195 */
196 Route::post('authenticate', AuthenticationRoute::class);
197
198 /**
199 * @since 4.17.0
200 */
201 Route::script(GenerateExternalEmbedScriptUrl::URI, GIVE_PLUGIN_DIR . 'build/donationFormExternalEmbed.js')
202 ->localize('givewpDonationFormEmbed', new GetExternalEmbedScriptData());
203
204 /**
205 * @since 3.22.0 Add locale support
206 * @since 3.0.0
207 */
208 Route::get('donation-form-view', static function (array $request) {
209 ini_set('display_errors', 0);
210 $routeData = DonationFormViewRouteData::fromRequest($request);
211
212 if ($locale = $request['locale'] ?? '') {
213 Language::switchToLocale($locale);
214 }
215
216 return give(DonationFormViewController::class)->show($routeData);
217 });
218
219 /**
220 * @since 3.22.0 Add locale support
221 * @since 3.0.0
222 */
223 Route::get('donation-confirmation-receipt-view', static function (array $request) {
224 ini_set('display_errors', 0);
225 $routeData = DonationConfirmationReceiptViewRouteData::fromRequest($request);
226
227 if ($locale = $request['locale'] ?? '') {
228 Language::switchToLocale($locale);
229 }
230
231 return give(DonationConfirmationReceiptViewController::class)->show($routeData);
232 });
233
234 /**
235 * @since 3.22.0 Add locale support
236 * @since 3.0.0
237 */
238 Route::post('donation-form-view-preview', static function () {
239 ini_set('display_errors', 0);
240 $requestData = (new SanitizeDonationFormPreviewRequest())($_REQUEST);
241 $routeData = DonationFormPreviewRouteData::fromRequest($requestData);
242
243 if ($locale = $requestData['locale'] ?? '') {
244 Language::switchToLocale($locale);
245 }
246
247 return give(DonationFormViewController::class)->preview($routeData);
248 });
249 }
250
251 /**
252 * @since 3.0.0
253 */
254 private function dispatchDonateControllerListeners()
255 {
256 Hooks::addAction(
257 'givewp_donate_controller_donation_created',
258 DispatchDonateControllerDonationCreatedListeners::class,
259 '__invoke',
260 10,
261 3
262 );
263
264 Hooks::addAction(
265 'givewp_donate_controller_subscription_created',
266 DispatchDonateControllerSubscriptionCreatedListeners::class,
267 '__invoke',
268 10,
269 3
270 );
271 }
272
273 /**
274 * @since 3.0.0
275 */
276 private function registerFormDesigns()
277 {
278 add_action('givewp_register_form_design', static function (FormDesignRegistrar $formDesignRegistrar) {
279 try {
280 $formDesignRegistrar->registerDesign(ClassicFormDesign::class);
281 $formDesignRegistrar->registerDesign(MultiStepFormDesign::class);
282 $formDesignRegistrar->registerDesign(TwoPanelStepsFormLayout::class);
283 } catch (Exception $e) {
284 Log::error('Error registering form designs', [
285 'message' => $e->getMessage(),
286 'trace' => $e->getTraceAsString(),
287 ]);
288 }
289 });
290 }
291
292 /**
293 * @since 3.0.0
294 */
295 protected function registerSingleFormPage()
296 {
297 Hooks::addFilter('template_include', TemplateHandler::class, 'handle', 11);
298 }
299
300 /**
301 * @since 3.0.0
302 */
303 protected function registerShortcodes()
304 {
305 Hooks::addFilter('givewp_form_shortcode_output', GiveFormShortcode::class, '__invoke', 10, 2);
306 Hooks::addFilter('give_donation_confirmation_success_page_shortcode_view', ReplaceGiveReceiptShortcodeViewWithDonationConfirmationIframe::class);
307 Hooks::addFilter('give_receipt_shortcode_output', ReplaceGiveReceiptShortcodeViewWithDonationConfirmationIframe::class);
308 add_action('give_donation_confirmation_page_enqueue_scripts', function() {
309 wp_enqueue_script(
310 'givewp-donation-form-embed',
311 GIVE_PLUGIN_URL . 'build/donationFormEmbed.js',
312 [],
313 GIVE_VERSION,
314 true
315 );
316 });
317 }
318
319 /**
320 * @since 3.0.0
321 */
322 protected function registerPostStatus()
323 {
324 add_action('init', static function () {
325 register_post_status(DonationFormStatus::UPGRADED);
326 });
327 }
328
329 /**
330 * @since 3.16.2
331 * @throws EmptyNameException
332 */
333 private function registerHoneyPotField(): void
334 {
335 add_action('givewp_donation_form_schema', function (DonationFormModel $form, int $formId) {
336 /**
337 * Check if the honeypot field is enabled
338 * @param bool $enabled
339 * @param int $formId
340 *
341 * @since 3.16.2
342 */
343 if (apply_filters('givewp_donation_forms_honeypot_enabled', give_is_setting_enabled(give_get_option( 'givewp_donation_forms_honeypot_enabled', 'enabled')), $formId)) {
344 /**
345 * Filter the honeypot field name
346 * @param string $honeypotFieldName
347 * @param int $formId
348 *
349 * @since 3.17.0
350 */
351 $honeypotFieldName = (string)apply_filters('givewp_donation_forms_honeypot_field_name', 'donationBirthday', $formId);
352
353 (new AddHoneyPotFieldToDonationForms())($form, $honeypotFieldName);
354 }
355 }, 10, 2);
356 }
357
358 /**
359 * @since 4.0.0
360 */
361 private function registerReceiptViewPermission()
362 {
363 Hooks::addFilter('give_can_view_receipt', ValidateReceiptViewPermission::class, '__invoke', 10, 2);
364 }
365 }
366