PluginProbe
GiveWP – Donation Plugin and Fundraising Platform / 4.16.9
GiveWP – Donation Plugin and Fundraising Platform v4.16.9
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 2.3.2 2.30.0 All 255 releases
← All changes | src/Donors/ServiceProvider.php +121 -13 2.30.04.16.9 View file →
@@ -1,12 +1,25 @@
1 1 <?php
2 2
3 3 namespace Give\Donors;
4 4
5 +use Give\DonationForms\Models\DonationForm;
6 +use Give\Donors\Actions\CreateUserFromDonor;
7 +use Give\Donors\Actions\LoadDonorAdminOptions;
8 +use Give\Donors\Actions\SendDonorUserRegistrationNotification;
9 +use Give\Donors\Actions\UpdateAdminDonorDetails;
10 +use Give\Donors\CustomFields\Controllers\DonorDetailsController;
11 +use Give\Donors\Exceptions\FailedDonorUserCreationException;
5 12 use Give\Donors\ListTable\DonorsListTable;
13 +use Give\Donors\Migrations\AddPhoneColumn;
14 +use Give\Donors\Models\Donor;
15 +use Give\Donors\Repositories\DonorNotesRepository;
6 16 use Give\Donors\Repositories\DonorRepositoryProxy;
17 +use Give\Framework\Migrations\MigrationsRegister;
7 18 use Give\Helpers\Hooks;
19 +use Give\Log\Log;
8 20 use Give\ServiceProviders\ServiceProvider as ServiceProviderInterface;
21 +use Give_Donor as LegacyDonor;
9 22
10 23 /**
11 24 * @since 2.19.6
12 25 */
@@ -11,9 +24,8 @@
11 24 * @since 2.19.6
12 25 */
13 26 class ServiceProvider implements ServiceProviderInterface
14 27 {
15 -
16 28 /**
17 29 * @inheritDoc
18 30 */
19 31 public function register()
@@ -18,9 +30,10 @@
18 30 */
19 31 public function register()
20 32 {
21 33 give()->singleton('donors', DonorRepositoryProxy::class);
22 - give()->singleton(DonorsListTable::class, function() {
34 + give()->singleton('donorNotes', DonorNotesRepository::class);
35 + give()->singleton(DonorsListTable::class, function () {
23 36 $listTable = new DonorsListTable();
24 37 Hooks::doAction('givewp_donors_list_table', $listTable);
25 38
26 39 return $listTable;
@@ -28,23 +41,118 @@
28 41 }
29 42
30 43 /**
31 44 * @inheritDoc
45 + *
46 + * @since 4.14.0 move donor page registration to methods to defer conditionals and DB queries to appropriate hooks.
47 + * @since 3.7.0 Register "AddPhoneColumn" migration and add the "give_admin_donor_details_updating" action
32 48 */
33 49 public function boot()
34 50 {
51 + $this->registerDonorsAdminPage();
52 +
53 + $this->addCustomFieldsToDonorDetails();
54 + $this->enforceDonorsAsUsers();
55 +
56 + give(MigrationsRegister::class)->addMigrations([
57 + AddPhoneColumn::class,
58 + ]);
59 +
60 + Hooks::addAction('give_admin_donor_details_updating', UpdateAdminDonorDetails::class, '__invoke', 10, 2);
61 +
62 + $this->loadDonorAdminOptions();
63 + }
64 +
65 + /**
66 + * Register the donors admin page, deferring conditionals and DB queries to appropriate hooks.
67 + *
68 + * @since 4.14.0
69 + */
70 + private function registerDonorsAdminPage()
71 + {
72 + // Register new admin page if user hasn't chosen to use the legacy one
73 + add_action('admin_menu', function () {
74 + if ($this->shouldShowLegacyDonorsPage()) {
75 + return;
76 + }
77 +
78 + give(DonorsAdminPage::class)->registerMenuItem();
79 + }, 30);
80 +
81 + // Render the "Switch to New View" button on the legacy donors page
82 + add_action('admin_head', function () {
83 + if (!DonorsAdminPage::isShowing()) {
84 + return;
85 + }
86 +
87 + if (!$this->shouldShowLegacyDonorsPage()) {
88 + return;
89 + }
90 +
91 + give(DonorsAdminPage::class)->renderReactSwitch();
92 + });
93 + }
94 +
95 + /**
96 + * @since 4.14.0
97 + */
98 + private function shouldShowLegacyDonorsPage(): bool
99 + {
100 + if (DonorsAdminPage::isShowingNewDetailsPage()) {
101 + return false;
102 + }
103 +
35 104 $userId = get_current_user_id();
36 - $showLegacy = get_user_meta($userId, '_give_donors_archive_show_legacy', true);
37 - // only register new admin page if user hasn't chosen to use the old one
38 - if(empty($showLegacy)) {
39 - Hooks::addAction('admin_menu', DonorsAdminPage::class, 'registerMenuItem', 30);
40 105
41 - if (DonorsAdminPage::isShowing()) {
42 - Hooks::addAction('admin_enqueue_scripts', DonorsAdminPage::class, 'loadScripts');
106 + return (bool) get_user_meta($userId, '_give_donors_archive_show_legacy', true);
107 + }
108 +
109 + /**
110 + * @since 3.0.0
111 + */
112 + private function addCustomFieldsToDonorDetails()
113 + {
114 + add_action('give_donor_after_tables', static function (LegacyDonor $legacyDonor) {
115 + /** @var Donor $donor */
116 + $donor = Donor::find($legacyDonor->id);
117 +
118 + echo (new DonorDetailsController())->show($donor);
119 + });
120 + }
121 +
122 + /**
123 + * Hook into the donor creation process to ensure that donors are also users.
124 + * @since 3.2.0
125 + */
126 + protected function enforceDonorsAsUsers()
127 + {
128 + add_action('givewp_donate_controller_donor_created', function (Donor $donor, $formId) {
129 + if (!$donor->userId) {
130 + try {
131 + give(CreateUserFromDonor::class)->__invoke($donor);
132 +
133 + if (DonationForm::find($formId)->settings->registrationNotification) {
134 + give(SendDonorUserRegistrationNotification::class)->__invoke($donor);
135 + }
136 + } catch (FailedDonorUserCreationException $e) {
137 + Log::error($e->getLogMessage(), [
138 + 'donor' => $donor,
139 + 'previous' => $e->getPrevious(),
140 + ]);
141 + }
43 142 }
44 - }
45 - elseif(DonorsAdminPage::isShowing())
46 - {
47 - Hooks::addAction( 'admin_head', DonorsAdminPage::class, 'renderReactSwitch');
48 - }
143 + }, 10, 2);
144 + }
145 +
146 + /**
147 + * @since 4.6.1 Move to admin_enqueue_scripts hook
148 + * @since 4.4.0
149 + */
150 + private function loadDonorAdminOptions()
151 + {
152 + add_action('admin_enqueue_scripts', function () {
153 + if (DonorsAdminPage::isShowingDetailsPage()) {
154 + give(LoadDonorAdminOptions::class)();
155 + }
156 + });
49 157 }
50 158 }