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