PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / trunk
GiveWP – Donation Plugin and Fundraising Platform vtrunk
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 5 months ago FormActions.php 5 months ago ListDonationForms.php 8 months ago SwitchDonationFormView.php 3 years ago
ListDonationForms.php
295 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 = array_map(function ($form) {
160 return $form->toArray();
161 }, $forms);
162 } else {
163 $this->listTable->items($forms, $this->request->get_param('locale') ?? '');
164 $items = $this->listTable->getItems();
165
166 foreach ($items as $i => &$item) {
167 $queryArgs = [
168 'locale' => Language::getLocale(),
169 ];
170
171 foreach ($p2pForms as $form) {
172 if ($item['id'] == $form['form_id']) {
173 $queryArgs['p2p'] = true;
174 break;
175 }
176 }
177
178 $item['name'] = $forms[$i]->title;
179 $item['edit'] = add_query_arg($queryArgs, get_edit_post_link($item['id'], 'edit'));
180 $item['permalink'] = get_permalink($item['id']);
181 $item['v3form'] = $forms[$i]->usesFormBuilder;
182 $item['status_raw'] = $forms[$i]->status->getValue();
183 $item['isDefaultCampaignForm'] = $defaultCampaignForm && $item['id'] === $defaultCampaignForm->id;
184 }
185 }
186
187 return new WP_REST_Response(
188 [
189 'items' => $items,
190 'totalItems' => $totalForms,
191 'totalPages' => $totalPages,
192 'trash' => defined('EMPTY_TRASH_DAYS') && EMPTY_TRASH_DAYS > 0,
193 'defaultForm' => $this->defaultForm,
194 ]
195 );
196 }
197
198 /**
199 * @since 3.2.0 added distinct() to the query
200 * @since 2.24.0 Refactor to query through the ModelQueryBuilder
201 *
202 * @return array
203 */
204 public function getForms(): array
205 {
206 $page = $this->request->get_param('page');
207 $perPage = $this->request->get_param('perPage');
208 $sortColumns = $this->listTable->getSortColumnById($this->request->get_param('sortColumn') ?: 'id');
209
210 $query = give()->donationForms->prepareQuery();
211
212 $query = $this->getWhereConditions($query);
213
214 $query->orderByRaw('FIELD(ID, %d) DESC', $this->defaultForm);
215
216 $sortDirection = $this->request->get_param('sortDirection') ?: 'desc';
217 foreach ($sortColumns as $sortColumn) {
218 $query->orderBy($sortColumn, $sortDirection);
219 }
220
221 $query->limit($perPage)
222 ->offset(($page - 1) * $perPage);
223
224 $donationForms = $query->distinct()->getAll();
225
226 if ( ! $donationForms) {
227 return [];
228 }
229
230 return $donationForms;
231 }
232
233 /**
234 * @since 2.24.0 Refactor to query through the ModelQueryBuilder
235 *
236 * @return int
237 */
238 public function getTotalFormsCount(): int
239 {
240 $query = DB::table('posts')
241 ->where('post_type', 'give_forms');
242
243 $query = $this->getWhereConditions($query);
244
245 return $query->count();
246 }
247
248 /**
249 * @since 4.0.0 Add "campaignId" support
250 * @since 2.24.0
251 *
252 * @param QueryBuilder $query
253 *
254 * @return QueryBuilder
255 */
256 private function getWhereConditions(QueryBuilder $query): QueryBuilder
257 {
258 $search = $this->request->get_param('search');
259 $status = $this->request->get_param('status');
260
261 // Status
262 if ($status === 'any') {
263 $query->whereIn('post_status', ['publish', 'draft', 'pending', 'private', 'upgraded']);
264 } else {
265 $query->where('post_status', $status);
266 }
267
268 // Search
269 if ($search) {
270 if (ctype_digit($search)) {
271 $query->where('ID', $search);
272 } else {
273 $searchTerms = array_map('trim', explode(' ', $search));
274 foreach ($searchTerms as $term) {
275 if ($term) {
276 $query->whereLike('post_title', $term);
277 }
278 }
279 }
280 }
281
282 if ($campaignId = $this->request->get_param('campaignId')) {
283 $query
284 ->join(function (JoinQueryBuilder $builder) {
285 $builder
286 ->leftJoin('give_campaign_forms', 'campaign_forms')
287 ->on('campaign_forms.form_id', 'ID');
288 })
289 ->where('campaign_forms.campaign_id', $campaignId);
290 }
291
292 return $query;
293 }
294 }
295