PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.2.0
GiveWP – Donation Plugin and Fundraising Platform v4.2.0
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 / ServiceProvider.php
give / src / DonationForms Last commit date
Actions 1 year ago AsyncData 1 year ago Blocks 1 year ago Controllers 1 year ago DataTransferObjects 1 year ago Exceptions 2 years ago Factories 1 year ago FormDesigns 1 year ago FormPage 1 year ago Listeners 1 year ago Migrations 1 year ago Models 2 years ago OrphanedForms 1 year ago Properties 1 year ago Repositories 1 year ago Routes 1 year ago Rules 1 year ago Shortcodes 2 years ago V2 1 year ago ValueObjects 1 year ago ViewModels 1 year ago resources 1 year ago DonationFormsAdminPage.php 1 year ago DonationQuery.php 1 year ago ServiceProvider.php 1 year ago SubscriptionQuery.php 2 years ago
ServiceProvider.php
426 lines
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\DispatchDonateControllerSubscriptionCreatedListeners;
10 use Give\DonationForms\Actions\PrintFormMetaTags;
11 use Give\DonationForms\Actions\RegisterFormEntity;
12 use Give\DonationForms\Actions\ReplaceGiveReceiptShortcodeViewWithDonationConfirmationIframe;
13 use Give\DonationForms\Actions\SanitizeDonationFormPreviewRequest;
14 use Give\DonationForms\Actions\StoreBackwardsCompatibleFormMeta;
15 use Give\DonationForms\Actions\ValidateReceiptViewPermission;
16 use Give\DonationForms\AsyncData\Actions\GetAsyncFormDataForListView;
17 use Give\DonationForms\AsyncData\Actions\GiveGoalProgressStats;
18 use Give\DonationForms\AsyncData\Actions\LoadAsyncDataAssets;
19 use Give\DonationForms\AsyncData\AdminFormListView\AdminFormListView;
20 use Give\DonationForms\AsyncData\AsyncDataHelpers;
21 use Give\DonationForms\AsyncData\FormGrid\FormGridView;
22 use Give\DonationForms\Blocks\DonationFormBlock\Block as DonationFormBlock;
23 use Give\DonationForms\Controllers\DonationConfirmationReceiptViewController;
24 use Give\DonationForms\Controllers\DonationFormViewController;
25 use Give\DonationForms\DataTransferObjects\DonationConfirmationReceiptViewRouteData;
26 use Give\DonationForms\DataTransferObjects\DonationFormPreviewRouteData;
27 use Give\DonationForms\DataTransferObjects\DonationFormViewRouteData;
28 use Give\DonationForms\FormDesigns\ClassicFormDesign\ClassicFormDesign;
29 use Give\DonationForms\FormDesigns\MultiStepFormDesign\MultiStepFormDesign;
30 use Give\DonationForms\FormDesigns\TwoPanelStepsFormLayout\TwoPanelStepsFormLayout;
31 use Give\DonationForms\FormPage\TemplateHandler;
32 use Give\DonationForms\Migrations\CleanMultipleSlashesOnDB;
33 use Give\DonationForms\Migrations\RemoveDuplicateMeta;
34 use Give\DonationForms\Migrations\UpdateDonationLevelsSchema;
35 use Give\DonationForms\Repositories\DonationFormRepository;
36 use Give\DonationForms\Routes\AuthenticationRoute;
37 use Give\DonationForms\Routes\DonateRoute;
38 use Give\DonationForms\Routes\DonationFormsEntityRoute;
39 use Give\DonationForms\Routes\ValidationRoute;
40 use Give\DonationForms\Shortcodes\GiveFormShortcode;
41 use Give\DonationForms\V2\ListTable\Columns\DonationCountColumn;
42 use Give\DonationForms\V2\ListTable\Columns\DonationRevenueColumn;
43 use Give\DonationForms\V2\ListTable\Columns\GoalColumn;
44 use Give\DonationForms\V2\Models\DonationForm;
45 use Give\DonationForms\ValueObjects\DonationFormStatus;
46 use Give\Framework\FieldsAPI\DonationForm as DonationFormModel;
47 use Give\Framework\FieldsAPI\Exceptions\EmptyNameException;
48 use Give\Framework\FormDesigns\Registrars\FormDesignRegistrar;
49 use Give\Framework\Migrations\MigrationsRegister;
50 use Give\Framework\Routes\Route;
51 use Give\Helpers\Hooks;
52 use Give\Helpers\Language;
53 use Give\Log\Log;
54 use Give\ServiceProviders\ServiceProvider as ServiceProviderInterface;
55
56 class ServiceProvider implements ServiceProviderInterface
57 {
58
59 /*
60 * @inheritdoc
61 */
62 public function register()
63 {
64 give()->singleton('forms', DonationFormRepository::class);
65
66 give()->singleton(TemplateHandler::class, function () {
67 global $post;
68
69 return new TemplateHandler(
70 $post,
71 GIVE_PLUGIN_DIR . 'src/DonationForms/FormPage/templates/form-single.php'
72 );
73 });
74 }
75
76 /*
77 * @inheritdoc
78 */
79 public function boot()
80 {
81 if (function_exists('register_block_type')) {
82 Hooks::addAction('init', DonationFormBlock::class, 'register');
83 }
84
85 $this->registerRoutes();
86 $this->registerFormDesigns();
87 $this->registerSingleFormPage();
88 $this->registerShortcodes();
89 $this->registerPostStatus();
90 $this->registerAddFormSubmenuLink();
91 $this->registerHoneyPotField();
92 $this->registerReceiptViewPermission();
93
94 Hooks::addAction('givewp_donation_form_created', StoreBackwardsCompatibleFormMeta::class);
95 Hooks::addAction('givewp_donation_form_updated', StoreBackwardsCompatibleFormMeta::class);
96
97 $this->dispatchDonateControllerListeners();
98
99 give(MigrationsRegister::class)->addMigrations([
100 CleanMultipleSlashesOnDB::class,
101 RemoveDuplicateMeta::class,
102 UpdateDonationLevelsSchema::class,
103 ]);
104
105 /**
106 * @since 4.2.0
107 */
108 Hooks::addAction('init', RegisterFormEntity::class);
109 Hooks::addAction('rest_api_init', DonationFormsEntityRoute::class);
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 admin form list pages
137 $isLegacyAdminFormListPage = isset($_GET['post_type']) && 'give_forms' === $_GET['post_type'] && ! isset($_GET['page']);
138 $isAdminFormListPage = isset($_GET['page']) && 'give-forms' === $_GET['page'];
139 $isAdminCampaignDetailsPage = isset($_GET['page'], $_GET['id']) && 'give-campaigns' === $_GET['page'];
140 if ($isLegacyAdminFormListPage || $isAdminFormListPage || $isAdminCampaignDetailsPage) {
141 Hooks::addAction('admin_enqueue_scripts', LoadAsyncDataAssets::class);
142 }
143
144 // Load assets on the WordPress Block Editor - Gutenberg
145 Hooks::addAction('enqueue_block_editor_assets', LoadAsyncDataAssets::class);
146
147 // Async ajax request
148 Hooks::addAction('wp_ajax_givewp_get_form_async_data_for_list_view', GetAsyncFormDataForListView::class);
149 Hooks::addAction('wp_ajax_nopriv_givewp_get_form_async_data_for_list_view', GetAsyncFormDataForListView::class);
150
151 // Filter from give_goal_progress_stats() function which is used by the admin form list views and form grid view
152 Hooks::addFilter('give_goal_progress_stats', GiveGoalProgressStats::class,
153 'maybeChangeGoalProgressStatsActualValue', 999,
154 2);
155
156 // Form Grid
157 add_filter('give_form_grid_goal_progress_stats_before', function () {
158 $usePlaceholder = give(FormGridView::class)->maybeUsePlaceholderOnGoalAmountRaised();
159
160 if ($usePlaceholder) {
161 //Enable placeholder on the give_goal_progress_stats() function
162 add_filter('give_goal_progress_stats', function ($stats) {
163 $stats['actual'] = AsyncDataHelpers::getSkeletonPlaceholder('1rem');
164
165 return $stats;
166 });
167 add_filter('give_goal_shortcode_stats', function ($stats) {
168 $stats['income'] = 0;
169
170 return $stats;
171 });
172 }
173 });
174 Hooks::addFilter('give_form_grid_progress_bar_amount_raised_value', FormGridView::class, 'maybeSetProgressBarAmountRaisedAsync',10,2);
175 Hooks::addFilter('give_form_grid_progress_bar_donations_count_value', FormGridView::class, 'maybeSetProgressBarDonationsCountAsync',10,2);
176
177 // Legacy Admin Form List View Columns
178 Hooks::addFilter('give_admin_goal_progress_achieved_opacity', AdminFormListView::class, 'maybeChangeAchievedIconOpacity');
179 add_action(
180 'give_admin_form_list_view_donations_goal_column_before',
181 function () {
182 $usePlaceholder = give(AdminFormListView::class)->maybeUsePlaceholderOnGoalAmountRaised();
183
184 if ($usePlaceholder) {
185 //Enable placeholder on the give_goal_progress_stats() function
186 add_filter('give_goal_progress_stats', function ($stats) {
187 $stats['actual'] = AsyncDataHelpers::getSkeletonPlaceholder('1rem');
188
189 return $stats;
190 });
191 }
192 },
193 10,
194 2
195 );
196 Hooks::addFilter('give_admin_form_list_view_donations_count_column_value', AdminFormListView::class, 'maybeSetDonationsColumnAsync',10,2);
197 Hooks::addFilter('give_admin_form_list_view_revenue_column_value', AdminFormListView::class, 'maybeSetRevenueColumnAsync',10,2);
198
199 // Admin Form List View Columns
200 Hooks::addFilter('givewp_list_table_goal_progress_achieved_opacity', AdminFormListView::class, 'maybeChangeAchievedIconOpacity');
201 add_action(
202 sprintf("givewp_list_table_cell_value_%s_before", GoalColumn::getId()),
203 function () {
204 $usePlaceholder = give(AdminFormListView::class)->maybeUsePlaceholderOnGoalAmountRaised();
205
206 if ($usePlaceholder) {
207 //Enable placeholder on the give_goal_progress_stats() function
208 add_filter('give_goal_progress_stats', function ($stats) {
209 $stats['actual'] = AsyncDataHelpers::getSkeletonPlaceholder('1rem');
210
211 return $stats;
212 });
213 }
214 },
215 10,
216 2
217 );
218 add_filter(
219 sprintf("givewp_list_table_cell_value_%s_content", DonationCountColumn::getId()),
220 function ($value, DonationForm $form){
221 return give(AdminFormListView::class)->maybeSetDonationsColumnAsync($value, $form->id);
222 },
223 10,
224 2
225 );
226 add_filter(
227 sprintf("givewp_list_table_cell_value_%s_content", DonationRevenueColumn::getId()),
228 function ($value, DonationForm $form){
229 return give(AdminFormListView::class)->maybeSetRevenueColumnAsync($value, $form->id);
230 },
231 10,
232 2
233 );
234 }
235
236 /**
237 * @since 3.16.0
238 */
239 private function registerAddFormSubmenuLink()
240 {
241 Hooks::addAction('admin_menu', DonationFormsAdminPage::class, 'addFormSubmenuLink', 999);
242 }
243
244 /**
245 * @since 3.0.0
246 */
247 private function registerRoutes()
248 {
249 /**
250 * @since 3.0.0
251 */
252 Route::post('donate', DonateRoute::class);
253
254 /**
255 * @since 3.0.0
256 */
257 Route::post('validate', ValidationRoute::class);
258
259 /**
260 * @since 3.0.0
261 */
262 Route::post('authenticate', AuthenticationRoute::class);
263
264 /**
265 * @since 3.22.0 Add locale support
266 * @since 3.0.0
267 */
268 Route::get('donation-form-view', static function (array $request) {
269 ini_set('display_errors', 0);
270 $routeData = DonationFormViewRouteData::fromRequest($request);
271
272 if ($locale = $request['locale'] ?? '') {
273 Language::switchToLocale($locale);
274 }
275
276 return give(DonationFormViewController::class)->show($routeData);
277 });
278
279 /**
280 * @since 3.22.0 Add locale support
281 * @since 3.0.0
282 */
283 Route::get('donation-confirmation-receipt-view', static function (array $request) {
284 ini_set('display_errors', 0);
285 $routeData = DonationConfirmationReceiptViewRouteData::fromRequest($request);
286
287 if ($locale = $request['locale'] ?? '') {
288 Language::switchToLocale($locale);
289 }
290
291 return give(DonationConfirmationReceiptViewController::class)->show($routeData);
292 });
293
294 /**
295 * @since 3.22.0 Add locale support
296 * @since 3.0.0
297 */
298 Route::post('donation-form-view-preview', static function () {
299 ini_set('display_errors', 0);
300 $requestData = (new SanitizeDonationFormPreviewRequest())($_REQUEST);
301 $routeData = DonationFormPreviewRouteData::fromRequest($requestData);
302
303 if ($locale = $requestData['locale'] ?? '') {
304 Language::switchToLocale($locale);
305 }
306
307 return give(DonationFormViewController::class)->preview($routeData);
308 });
309 }
310
311 /**
312 * @since 3.0.0
313 */
314 private function dispatchDonateControllerListeners()
315 {
316 Hooks::addAction(
317 'givewp_donate_controller_donation_created',
318 DispatchDonateControllerDonationCreatedListeners::class,
319 '__invoke',
320 10,
321 3
322 );
323
324 Hooks::addAction(
325 'givewp_donate_controller_subscription_created',
326 DispatchDonateControllerSubscriptionCreatedListeners::class,
327 '__invoke',
328 10,
329 3
330 );
331 }
332
333 /**
334 * @since 3.0.0
335 */
336 private function registerFormDesigns()
337 {
338 add_action('givewp_register_form_design', static function (FormDesignRegistrar $formDesignRegistrar) {
339 try {
340 $formDesignRegistrar->registerDesign(ClassicFormDesign::class);
341 $formDesignRegistrar->registerDesign(MultiStepFormDesign::class);
342 $formDesignRegistrar->registerDesign(TwoPanelStepsFormLayout::class);
343 } catch (Exception $e) {
344 Log::error('Error registering form designs', [
345 'message' => $e->getMessage(),
346 'trace' => $e->getTraceAsString(),
347 ]);
348 }
349 });
350 }
351
352 /**
353 * @since 3.0.0
354 */
355 protected function registerSingleFormPage()
356 {
357 Hooks::addFilter('template_include', TemplateHandler::class, 'handle', 11);
358 }
359
360 /**
361 * @since 3.0.0
362 */
363 protected function registerShortcodes()
364 {
365 Hooks::addFilter('givewp_form_shortcode_output', GiveFormShortcode::class, '__invoke', 10, 2);
366 Hooks::addFilter('give_donation_confirmation_success_page_shortcode_view', ReplaceGiveReceiptShortcodeViewWithDonationConfirmationIframe::class);
367 Hooks::addFilter('give_receipt_shortcode_output', ReplaceGiveReceiptShortcodeViewWithDonationConfirmationIframe::class);
368 add_action('give_donation_confirmation_page_enqueue_scripts', function() {
369 wp_enqueue_script(
370 'givewp-donation-form-embed',
371 GIVE_PLUGIN_URL . 'build/donationFormEmbed.js',
372 [],
373 GIVE_VERSION,
374 true
375 );
376 });
377 }
378
379 /**
380 * @since 3.0.0
381 */
382 protected function registerPostStatus()
383 {
384 add_action('init', static function () {
385 register_post_status(DonationFormStatus::UPGRADED);
386 });
387 }
388
389 /**
390 * @since 3.16.2
391 * @throws EmptyNameException
392 */
393 private function registerHoneyPotField(): void
394 {
395 add_action('givewp_donation_form_schema', function (DonationFormModel $form, int $formId) {
396 /**
397 * Check if the honeypot field is enabled
398 * @param bool $enabled
399 * @param int $formId
400 *
401 * @since 3.16.2
402 */
403 if (apply_filters('givewp_donation_forms_honeypot_enabled', give_is_setting_enabled(give_get_option( 'givewp_donation_forms_honeypot_enabled', 'enabled')), $formId)) {
404 /**
405 * Filter the honeypot field name
406 * @param string $honeypotFieldName
407 * @param int $formId
408 *
409 * @since 3.17.0
410 */
411 $honeypotFieldName = (string)apply_filters('givewp_donation_forms_honeypot_field_name', 'donationBirthday', $formId);
412
413 (new AddHoneyPotFieldToDonationForms())($form, $honeypotFieldName);
414 }
415 }, 10, 2);
416 }
417
418 /**
419 * @since 4.0.0
420 */
421 private function registerReceiptViewPermission()
422 {
423 Hooks::addFilter('give_can_view_receipt', ValidateReceiptViewPermission::class, '__invoke', 10, 2);
424 }
425 }
426