PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.3.2
GiveWP – Donation Plugin and Fundraising Platform v4.3.2
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 1 year 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 DonationFormDataQuery.php 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
360 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 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 3.22.0 Add locale support
200 * @since 3.0.0
201 */
202 Route::get('donation-form-view', static function (array $request) {
203 ini_set('display_errors', 0);
204 $routeData = DonationFormViewRouteData::fromRequest($request);
205
206 if ($locale = $request['locale'] ?? '') {
207 Language::switchToLocale($locale);
208 }
209
210 return give(DonationFormViewController::class)->show($routeData);
211 });
212
213 /**
214 * @since 3.22.0 Add locale support
215 * @since 3.0.0
216 */
217 Route::get('donation-confirmation-receipt-view', static function (array $request) {
218 ini_set('display_errors', 0);
219 $routeData = DonationConfirmationReceiptViewRouteData::fromRequest($request);
220
221 if ($locale = $request['locale'] ?? '') {
222 Language::switchToLocale($locale);
223 }
224
225 return give(DonationConfirmationReceiptViewController::class)->show($routeData);
226 });
227
228 /**
229 * @since 3.22.0 Add locale support
230 * @since 3.0.0
231 */
232 Route::post('donation-form-view-preview', static function () {
233 ini_set('display_errors', 0);
234 $requestData = (new SanitizeDonationFormPreviewRequest())($_REQUEST);
235 $routeData = DonationFormPreviewRouteData::fromRequest($requestData);
236
237 if ($locale = $requestData['locale'] ?? '') {
238 Language::switchToLocale($locale);
239 }
240
241 return give(DonationFormViewController::class)->preview($routeData);
242 });
243 }
244
245 /**
246 * @since 3.0.0
247 */
248 private function dispatchDonateControllerListeners()
249 {
250 Hooks::addAction(
251 'givewp_donate_controller_donation_created',
252 DispatchDonateControllerDonationCreatedListeners::class,
253 '__invoke',
254 10,
255 3
256 );
257
258 Hooks::addAction(
259 'givewp_donate_controller_subscription_created',
260 DispatchDonateControllerSubscriptionCreatedListeners::class,
261 '__invoke',
262 10,
263 3
264 );
265 }
266
267 /**
268 * @since 3.0.0
269 */
270 private function registerFormDesigns()
271 {
272 add_action('givewp_register_form_design', static function (FormDesignRegistrar $formDesignRegistrar) {
273 try {
274 $formDesignRegistrar->registerDesign(ClassicFormDesign::class);
275 $formDesignRegistrar->registerDesign(MultiStepFormDesign::class);
276 $formDesignRegistrar->registerDesign(TwoPanelStepsFormLayout::class);
277 } catch (Exception $e) {
278 Log::error('Error registering form designs', [
279 'message' => $e->getMessage(),
280 'trace' => $e->getTraceAsString(),
281 ]);
282 }
283 });
284 }
285
286 /**
287 * @since 3.0.0
288 */
289 protected function registerSingleFormPage()
290 {
291 Hooks::addFilter('template_include', TemplateHandler::class, 'handle', 11);
292 }
293
294 /**
295 * @since 3.0.0
296 */
297 protected function registerShortcodes()
298 {
299 Hooks::addFilter('givewp_form_shortcode_output', GiveFormShortcode::class, '__invoke', 10, 2);
300 Hooks::addFilter('give_donation_confirmation_success_page_shortcode_view', ReplaceGiveReceiptShortcodeViewWithDonationConfirmationIframe::class);
301 Hooks::addFilter('give_receipt_shortcode_output', ReplaceGiveReceiptShortcodeViewWithDonationConfirmationIframe::class);
302 add_action('give_donation_confirmation_page_enqueue_scripts', function() {
303 wp_enqueue_script(
304 'givewp-donation-form-embed',
305 GIVE_PLUGIN_URL . 'build/donationFormEmbed.js',
306 [],
307 GIVE_VERSION,
308 true
309 );
310 });
311 }
312
313 /**
314 * @since 3.0.0
315 */
316 protected function registerPostStatus()
317 {
318 add_action('init', static function () {
319 register_post_status(DonationFormStatus::UPGRADED);
320 });
321 }
322
323 /**
324 * @since 3.16.2
325 * @throws EmptyNameException
326 */
327 private function registerHoneyPotField(): void
328 {
329 add_action('givewp_donation_form_schema', function (DonationFormModel $form, int $formId) {
330 /**
331 * Check if the honeypot field is enabled
332 * @param bool $enabled
333 * @param int $formId
334 *
335 * @since 3.16.2
336 */
337 if (apply_filters('givewp_donation_forms_honeypot_enabled', give_is_setting_enabled(give_get_option( 'givewp_donation_forms_honeypot_enabled', 'enabled')), $formId)) {
338 /**
339 * Filter the honeypot field name
340 * @param string $honeypotFieldName
341 * @param int $formId
342 *
343 * @since 3.17.0
344 */
345 $honeypotFieldName = (string)apply_filters('givewp_donation_forms_honeypot_field_name', 'donationBirthday', $formId);
346
347 (new AddHoneyPotFieldToDonationForms())($form, $honeypotFieldName);
348 }
349 }, 10, 2);
350 }
351
352 /**
353 * @since 4.0.0
354 */
355 private function registerReceiptViewPermission()
356 {
357 Hooks::addFilter('give_can_view_receipt', ValidateReceiptViewPermission::class, '__invoke', 10, 2);
358 }
359 }
360