PluginProbe
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress / trunk
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress vtrunk
11.1.1 11.1.0 11.0.5 11.0.4 11.0.3 11.0.2 11.0.1 11.0.0 10.11.1 10.11.0 10.10.2 10.10.1 10.10.0 10.9.1 trunk 10.0.0 10.0.1 10.1.0 10.1.1 10.1.2 10.1.3 10.1.4 10.2.0 10.2.1 10.2.2 All 62 releases
acymailing / back / Controllers / Users / Listing.php

Listing.php in AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress trunk, at back/Controllers/Users/Listing.php

263 lines 9.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace AcyMailing\Controllers\Users;
4
5 use AcyMailing\Classes\FieldClass;
6 use AcyMailing\Classes\FollowupClass;
7 use AcyMailing\Classes\ListClass;
8 use AcyMailing\Classes\SegmentClass;
9 use AcyMailing\Classes\UserClass;
10 use AcyMailing\Helpers\EntitySelectHelper;
11 use AcyMailing\Helpers\PaginationHelper;
12 use AcyMailing\Helpers\ToolbarHelper;
13
14 trait Listing
15 {
16 public function listing(): void
17 {
18 acym_setVar('layout', 'listing');
19
20 $data = [];
21 $data['ordering'] = $this->getVarFiltersListing('cmd', 'users_ordering', 'id');
22 $data['orderingSortOrder'] = $this->getVarFiltersListing('cmd', 'users_ordering_sort_order', 'desc');
23 $data['pagination'] = new PaginationHelper();
24
25 $this->prepareSegmentField($data);
26 $this->prepareListingFilters($data);
27 $this->prepareUsersListing($data);
28 $this->prepareUsersSubscriptions($data);
29 $this->prepareUsersFields($data);
30 $this->prepareToolbar($data);
31
32 parent::display($data);
33 }
34
35 protected function prepareSegmentField(array &$data): void
36 {
37 $segmentClass = new SegmentClass();
38 $segments = $segmentClass->getAllForSelect();
39 $data['segments'] = [];
40 foreach ($segments as $id => $name) {
41 if (empty($id)) $id = 0;
42 $data['segments'][$id] = $name;
43 }
44 }
45
46 protected function prepareToolbar(array &$data): void
47 {
48 $toolbarHelper = new ToolbarHelper();
49 $toolbarHelper->addSearchBar($data['search'], 'users_search');
50 $toolbarHelper->addOptionSelect(
51 acym_translation('ACYM_SEGMENT'),
52 acym_select($data['segments'], 'segment', $data['segment'], ['class' => 'acym__select'])
53 );
54 $toolbarHelper->addOptionSelect(
55 acym_translation('ACYM_LIST'),
56 acym_select(
57 $data['lists'],
58 'users_list',
59 $data['list'],
60 ['class' => 'acym__select']
61 )
62 );
63 $toolbarHelper->addOptionSelect(
64 acym_translation('ACYM_SUBSCRIPTION_STATUS'),
65 acym_select($data['list_statuses'], 'list_status', $data['list_status'], ['class' => 'acym__select'])
66 );
67
68 $toolbarHelper->addButton(
69 'ACYM_ACYCHECKER_CLEAN_USERS',
70 [
71 'data-task' => 'clean',
72 'type' => 'submit',
73 ],
74 'user-check'
75 );
76
77 $exportButton = acym_translation('ACYM_EXPORT');
78 $exportButton .= '<span id="acym__users__listing__number_to_export" data-default="'.acym_strtolower(acym_translation('ACYM_ALL')).'">&nbsp;(';
79 $exportButton .= acym_strtolower(acym_translation('ACYM_ALL'));
80 $exportButton .= ')</span>';
81 $toolbarHelper->addButton(
82 $exportButton,
83 ['data-task' => 'export', 'type' => 'submit'],
84 'download'
85 );
86 $toolbarHelper->addButton(acym_translation('ACYM_IMPORT'), ['data-task' => 'import'], 'upload');
87 $entityHelper = new EntitySelectHelper();
88 $toolbarHelper->addModalButton(
89 [
90 'button' => '<i class="acymicon-bell"></i>'.esc_html(
91 acym_translation('ACYM_SUBSCRIBE')
92 ).' (<span id="acym__users__listing__number_to_add_to_list">0</span>)',
93 'modalContent' => $entityHelper->entitySelect(
94 [
95 'entity' => 'list',
96 'columnsToDisplay' => $entityHelper->getColumnsForList(),
97 'buttonSubmit' => [
98 'text' => acym_translation('ACYM_SUBSCRIBE_USERS_TO_THESE_LISTS'),
99 'action' => 'addToList',
100 ],
101 ]
102 ),
103 'attributesButton' => [
104 'class' => 'button button-secondary disabled cell medium-6 large-shrink',
105 'id' => 'acym__users__listing__button--add-to-list',
106 ],
107 ]
108 );
109 $toolbarHelper->addButton(acym_translation('ACYM_CREATE'), ['data-task' => 'edit'], 'user-plus', true);
110
111 $data['toolbar'] = $toolbarHelper;
112 }
113
114 protected function prepareListingFilters(array &$data): void
115 {
116 $data['status'] = $this->getVarFiltersListing('string', 'users_status', '');
117 $data['search'] = $this->getVarFiltersListing('string', 'users_search', '');
118 $data['list'] = $this->getVarFiltersListing('int', 'users_list', 0);
119 $data['list_status'] = $this->getVarFiltersListing('string', 'list_status', 'sub');
120 $data['segment'] = $this->getVarFiltersListing('int', 'segment', 0);
121
122 $followupClass = new FollowupClass();
123 $listClass = new ListClass();
124 $lists = $listClass->getAll('id');
125 uasort(
126 $lists,
127 function ($a, $b) {
128 return strtolower($a->name) > strtolower($b->name) ? 1 : -1;
129 }
130 );
131
132 // This keeps keys
133 $data['lists'] = [0 => acym_translation('ACYM_SELECT_A_LIST')];
134 foreach ($lists as $oneList) {
135 if ($oneList->type === ListClass::LIST_TYPE_FRONT) continue;
136 if ($oneList->type === ListClass::LIST_TYPE_FOLLOWUP) {
137 $followup = $followupClass->getOneByListId($oneList->id);
138 if (empty($followup)) continue;
139 $oneList->name = $followup->display_name;
140 }
141
142 $data['lists'][$oneList->id] = $oneList->name;
143 }
144
145 $data['list_statuses'] = [
146 'sub' => acym_translation('ACYM_SUBSCRIBED'),
147 'unsub' => acym_translation('ACYM_UNSUBSCRIBED'),
148 'none' => acym_translation('ACYM_NO_SUBSCRIPTION_STATUS'),
149 ];
150
151 $data['status_toolbar'] = [];
152 if (!empty($data['list'])) {
153 $data['status_toolbar'] = [
154 'users_list' => $data['list'],
155 'list_status' => $data['list_status'],
156 ];
157 }
158 if (!empty($data['segment'])) {
159 $data['status_toolbar'][] = $data['segment'];
160 }
161 }
162
163 protected function prepareUsersListing(array &$data): void
164 {
165 // Prepare the pagination
166 $usersPerPage = $data['pagination']->getListLimit();
167 $page = $this->getVarFiltersListing('int', 'users_pagination_page', 1);
168
169 $matchingUsers = $this->getMatchingElementsFromData(
170 [
171 'search' => $data['search'],
172 'elementsPerPage' => $usersPerPage,
173 'offset' => ($page - 1) * $usersPerPage,
174 'status' => $data['status'],
175 'ordering' => $data['ordering'],
176 'ordering_sort_order' => $data['orderingSortOrder'],
177 'list' => $data['list'],
178 'segment' => $data['segment'],
179 'list_status' => $data['list_status'],
180 'cms_username' => true,
181 ],
182 $data['status'],
183 $page
184 );
185
186 // Prepare the pagination
187 $data['pagination']->setStatus($matchingUsers['total']->total, $page, $usersPerPage);
188
189 $data['allUsers'] = $matchingUsers['elements'];
190 $data['userNumberPerStatus'] = $matchingUsers['status'];
191 }
192
193 protected function prepareUsersSubscriptions(array &$data): void
194 {
195 $usersId = [];
196 foreach ($data['allUsers'] as $oneUser) {
197 $usersId[] = $oneUser->id;
198 }
199
200 $subscriptions = [];
201
202 if (!empty($usersId)) {
203 $userClass = new UserClass();
204 $subscriptionsArray = $userClass->getUsersSubscriptionsByIds($usersId);
205
206 foreach ($subscriptionsArray as $oneSubscription) {
207 $subscriptions[$oneSubscription->user_id][$oneSubscription->id] = $oneSubscription;
208 }
209 }
210
211 $data['usersSubscriptions'] = $subscriptions;
212 }
213
214 protected function prepareUsersFields(array &$data): void
215 {
216 $data['fields'] = [];
217
218 if (empty($data['allUsers'])) return;
219
220 $fieldClass = new FieldClass();
221 $fieldsToDisplay = $fieldClass->getAllFieldsBackendListing();
222 if (empty($fieldsToDisplay['ids'])) return;
223
224 $userIds = [];
225 foreach ($data['allUsers'] as $user) {
226 $userIds[] = $user->id;
227 }
228
229 $fieldValue = $fieldClass->getAllFieldsListingByUserIds($userIds, $fieldsToDisplay['ids'], 'field.backend_listing = 1');
230 $languages = acym_getLanguages();
231 $languageFieldId = $fieldClass->getLanguageFieldId();
232 foreach ($data['allUsers'] as &$user) {
233 $user->fields = [];
234 foreach ($fieldsToDisplay['ids'] as $fieldId) {
235 if ($fieldId == $languageFieldId) {
236 $user->fields[$fieldId] = empty($languages[$user->language]) ? $user->language : $languages[$user->language]->name;
237 } else {
238 $user->fields[$fieldId] = !isset($fieldValue[$fieldId.'-'.$user->id]) ? '' : $fieldValue[$fieldId.'-'.$user->id];
239 }
240 }
241 }
242
243 $data['fields'] = $fieldsToDisplay['names'];
244 }
245
246 public function addToList(): void
247 {
248 wp_verify_nonce(acym_getVar('cmd', '_wpnonce'), 'acymnonce') || die('Invalid Token');
249
250 $listsSelected = json_decode(acym_getVar('string', 'acym__entity_select__selected', '[]'), true);
251 if (empty($listsSelected)) {
252 $listsSelected = [];
253 }
254 $selectedUserIds = acym_getVar('array', 'elements_checked', []);
255
256 $userClass = new UserClass();
257 $userClass->onlyManageableUsers($selectedUserIds);
258 $userClass->subscribe($selectedUserIds, $listsSelected);
259
260 $this->listing();
261 }
262 }
263