PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.6.1
GiveWP – Donation Plugin and Fundraising Platform v4.6.1
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 / V2 / Endpoints / ListDonationForms.php
give / src / DonationForms / V2 / Endpoints Last commit date
Endpoint.php 1 year ago FormActions.php 1 year ago ListDonationForms.php 1 year ago SwitchDonationFormView.php 3 years ago
ListDonationForms.php
293 lines
1 <?php
2
3 namespace Give\DonationForms\V2\Endpoints;
4
5 use Give\Campaigns\Models\Campaign;
6 use Give\Campaigns\ValueObjects\CampaignType;
7 use Give\DonationForms\Repositories\DonationFormDataRepository;
8 use Give\DonationForms\V2\ListTable\DonationFormsListTable;
9 use Give\DonationForms\V2\Models\DonationForm;
10 use Give\Framework\Database\DB;
11 use Give\Framework\QueryBuilder\JoinQueryBuilder;
12 use Give\Framework\QueryBuilder\QueryBuilder;
13 use Give\Helpers\Language;
14 use WP_REST_Request;
15 use WP_REST_Response;
16
17 /**
18 * @since 2.19.0
19 */
20 class ListDonationForms extends Endpoint
21 {
22 /**
23 * @var string
24 */
25 protected $endpoint = 'admin/forms';
26
27 /**
28 * @var WP_REST_Request
29 */
30 private $request;
31
32 /**
33 * @var DonationFormsListTable
34 */
35 protected $listTable;
36
37 /**
38 * @var int
39 */
40 protected $defaultForm;
41
42 /**
43 * @since 4.0.0 Add campaignId parameter
44 * @inheritDoc
45 */
46 public function registerRoute()
47 {
48 register_rest_route(
49 'give-api/v2',
50 $this->endpoint,
51 [
52 [
53 'methods' => 'GET',
54 'callback' => [$this, 'handleRequest'],
55 'permission_callback' => [$this, 'permissionsCheck'],
56 ],
57 'args' => [
58 'page' => [
59 'type' => 'integer',
60 'required' => false,
61 'default' => 1,
62 'minimum' => 1,
63 ],
64 'perPage' => [
65 'type' => 'integer',
66 'required' => false,
67 'default' => 30,
68 'minimum' => 1,
69 ],
70 'status' => [
71 'type' => 'string',
72 'required' => false,
73 'default' => 'any',
74 'enum' => [
75 'publish',
76 'future',
77 'draft',
78 'pending',
79 'trash',
80 'auto-draft',
81 'inherit',
82 'any',
83 'upgraded',
84 ],
85 ],
86 'search' => [
87 'type' => 'string',
88 'required' => false,
89 ],
90 'sortColumn' => [
91 'type' => 'string',
92 'required' => false,
93 'sanitize_callback' => 'sanitize_text_field',
94 ],
95 'sortDirection' => [
96 'type' => 'string',
97 'required' => false,
98 'enum' => [
99 'asc',
100 'desc',
101 ],
102 ],
103 'locale' => [
104 'type' => 'string',
105 'required' => false,
106 'default' => get_locale(),
107 ],
108 'return' => [
109 'type' => 'string',
110 'required' => false,
111 'default' => 'columns',
112 'enum' => [
113 'model',
114 'columns',
115 ],
116 ],
117 'campaignId' => [
118 'type' => 'integer',
119 'required' => false,
120 ],
121 ],
122 ]
123 );
124 }
125
126 /**
127 * @since 3.22.0 Add locale support
128 * @since 2.24.0 Change this to use the new ListTable class
129 *
130 * @param WP_REST_Request $request
131 *
132 * @return WP_REST_Response
133 */
134 public function handleRequest(WP_REST_Request $request): WP_REST_Response
135 {
136 $this->request = $request;
137 $this->listTable = give(DonationFormsListTable::class);
138 $campaignId = (int)($this->request->get_param('campaignId'));
139 $campaign = $campaignId ? Campaign::find($campaignId) : null;
140 $defaultCampaignForm = $campaign ? $campaign->defaultForm() : null;
141
142 $this->defaultForm = $defaultCampaignForm->id ?? 0;
143
144 $forms = $this->getForms();
145 $totalForms = $this->getTotalFormsCount();
146 $totalPages = (int)ceil($totalForms / $this->request->get_param('perPage'));
147
148 $formsData = DonationFormDataRepository::forms($forms);
149
150 $this->listTable->setData($formsData);
151
152 // get p2p forms
153 $p2pForms = DB::table('give_campaigns')
154 ->select('form_id')
155 ->where('campaign_type', CampaignType::CORE, '!=')
156 ->getAll(ARRAY_A);
157
158 if ('model' === $this->request->get_param('return')) {
159 $items = $forms;
160 } else {
161 $this->listTable->items($forms, $this->request->get_param('locale') ?? '');
162 $items = $this->listTable->getItems();
163
164 foreach ($items as $i => &$item) {
165 $queryArgs = [
166 'locale' => Language::getLocale(),
167 ];
168
169 foreach ($p2pForms as $form) {
170 if ($item['id'] == $form['form_id']) {
171 $queryArgs['p2p'] = true;
172 break;
173 }
174 }
175
176 $item['name'] = $forms[$i]->title;
177 $item['edit'] = add_query_arg($queryArgs, get_edit_post_link($item['id'], 'edit'));
178 $item['permalink'] = get_permalink($item['id']);
179 $item['v3form'] = $forms[$i]->usesFormBuilder;
180 $item['status_raw'] = $forms[$i]->status->getValue();
181 $item['isDefaultCampaignForm'] = $defaultCampaignForm && $item['id'] === $defaultCampaignForm->id;
182 }
183 }
184
185 return new WP_REST_Response(
186 [
187 'items' => $items,
188 'totalItems' => $totalForms,
189 'totalPages' => $totalPages,
190 'trash' => defined('EMPTY_TRASH_DAYS') && EMPTY_TRASH_DAYS > 0,
191 'defaultForm' => $this->defaultForm,
192 ]
193 );
194 }
195
196 /**
197 * @since 3.2.0 added distinct() to the query
198 * @since 2.24.0 Refactor to query through the ModelQueryBuilder
199 *
200 * @return array
201 */
202 public function getForms(): array
203 {
204 $page = $this->request->get_param('page');
205 $perPage = $this->request->get_param('perPage');
206 $sortColumns = $this->listTable->getSortColumnById($this->request->get_param('sortColumn') ?: 'id');
207
208 $query = give()->donationForms->prepareQuery();
209
210 $query = $this->getWhereConditions($query);
211
212 $query->orderByRaw('FIELD(ID, %d) DESC', $this->defaultForm);
213
214 $sortDirection = $this->request->get_param('sortDirection') ?: 'desc';
215 foreach ($sortColumns as $sortColumn) {
216 $query->orderBy($sortColumn, $sortDirection);
217 }
218
219 $query->limit($perPage)
220 ->offset(($page - 1) * $perPage);
221
222 $donationForms = $query->distinct()->getAll();
223
224 if ( ! $donationForms) {
225 return [];
226 }
227
228 return $donationForms;
229 }
230
231 /**
232 * @since 2.24.0 Refactor to query through the ModelQueryBuilder
233 *
234 * @return int
235 */
236 public function getTotalFormsCount(): int
237 {
238 $query = DB::table('posts')
239 ->where('post_type', 'give_forms');
240
241 $query = $this->getWhereConditions($query);
242
243 return $query->count();
244 }
245
246 /**
247 * @since 4.0.0 Add "campaignId" support
248 * @since 2.24.0
249 *
250 * @param QueryBuilder $query
251 *
252 * @return QueryBuilder
253 */
254 private function getWhereConditions(QueryBuilder $query): QueryBuilder
255 {
256 $search = $this->request->get_param('search');
257 $status = $this->request->get_param('status');
258
259 // Status
260 if ($status === 'any') {
261 $query->whereIn('post_status', ['publish', 'draft', 'pending', 'private', 'upgraded']);
262 } else {
263 $query->where('post_status', $status);
264 }
265
266 // Search
267 if ($search) {
268 if (ctype_digit($search)) {
269 $query->where('ID', $search);
270 } else {
271 $searchTerms = array_map('trim', explode(' ', $search));
272 foreach ($searchTerms as $term) {
273 if ($term) {
274 $query->whereLike('post_title', $term);
275 }
276 }
277 }
278 }
279
280 if ($campaignId = $this->request->get_param('campaignId')) {
281 $query
282 ->join(function (JoinQueryBuilder $builder) {
283 $builder
284 ->leftJoin('give_campaign_forms', 'campaign_forms')
285 ->on('campaign_forms.form_id', 'ID');
286 })
287 ->where('campaign_forms.campaign_id', $campaignId);
288 }
289
290 return $query;
291 }
292 }
293