1: | <?php
|
2: | namespace Opencart\Admin\Controller\Catalog;
|
3: | |
4: | |
5: | |
6: | |
7: |
|
8: | class Review extends \Opencart\System\Engine\Controller {
|
9: | |
10: | |
11: | |
12: | |
13: |
|
14: | public function index(): void {
|
15: | $this->load->language('catalog/review');
|
16: |
|
17: | $this->document->setTitle($this->language->get('heading_title'));
|
18: |
|
19: | if (isset($this->request->get['filter_product'])) {
|
20: | $filter_product = $this->request->get['filter_product'];
|
21: | } else {
|
22: | $filter_product = '';
|
23: | }
|
24: |
|
25: | if (isset($this->request->get['filter_author'])) {
|
26: | $filter_author = $this->request->get['filter_author'];
|
27: | } else {
|
28: | $filter_author = '';
|
29: | }
|
30: |
|
31: | if (isset($this->request->get['filter_status'])) {
|
32: | $filter_status = $this->request->get['filter_status'];
|
33: | } else {
|
34: | $filter_status = '';
|
35: | }
|
36: |
|
37: | if (isset($this->request->get['filter_date_from'])) {
|
38: | $filter_date_from = $this->request->get['filter_date_from'];
|
39: | } else {
|
40: | $filter_date_from = '';
|
41: | }
|
42: |
|
43: | if (isset($this->request->get['filter_date_to'])) {
|
44: | $filter_date_to = $this->request->get['filter_date_to'];
|
45: | } else {
|
46: | $filter_date_to = '';
|
47: | }
|
48: |
|
49: | $url = '';
|
50: |
|
51: | if (isset($this->request->get['filter_product'])) {
|
52: | $url .= '&filter_product=' . urlencode(html_entity_decode($this->request->get['filter_product'], ENT_QUOTES, 'UTF-8'));
|
53: | }
|
54: |
|
55: | if (isset($this->request->get['filter_author'])) {
|
56: | $url .= '&filter_author=' . urlencode(html_entity_decode($this->request->get['filter_author'], ENT_QUOTES, 'UTF-8'));
|
57: | }
|
58: |
|
59: | if (isset($this->request->get['filter_status'])) {
|
60: | $url .= '&filter_status=' . $this->request->get['filter_status'];
|
61: | }
|
62: |
|
63: | if (isset($this->request->get['filter_date_from'])) {
|
64: | $url .= '&filter_date_from=' . $this->request->get['filter_date_from'];
|
65: | }
|
66: |
|
67: | if (isset($this->request->get['filter_date_to'])) {
|
68: | $url .= '&filter_date_to=' . $this->request->get['filter_date_to'];
|
69: | }
|
70: |
|
71: | if (isset($this->request->get['sort'])) {
|
72: | $url .= '&sort=' . $this->request->get['sort'];
|
73: | }
|
74: |
|
75: | if (isset($this->request->get['order'])) {
|
76: | $url .= '&order=' . $this->request->get['order'];
|
77: | }
|
78: |
|
79: | if (isset($this->request->get['page'])) {
|
80: | $url .= '&page=' . $this->request->get['page'];
|
81: | }
|
82: |
|
83: | $data['breadcrumbs'] = [];
|
84: |
|
85: | $data['breadcrumbs'][] = [
|
86: | 'text' => $this->language->get('text_home'),
|
87: | 'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'])
|
88: | ];
|
89: |
|
90: | $data['breadcrumbs'][] = [
|
91: | 'text' => $this->language->get('heading_title'),
|
92: | 'href' => $this->url->link('catalog/review', 'user_token=' . $this->session->data['user_token'] . $url)
|
93: | ];
|
94: |
|
95: | $data['add'] = $this->url->link('catalog/review.form', 'user_token=' . $this->session->data['user_token'] . $url);
|
96: | $data['delete'] = $this->url->link('catalog/review.delete', 'user_token=' . $this->session->data['user_token']);
|
97: |
|
98: | $data['list'] = $this->getList();
|
99: |
|
100: | $data['filter_product'] = $filter_product;
|
101: | $data['filter_author'] = $filter_author;
|
102: | $data['filter_status'] = $filter_status;
|
103: | $data['filter_date_from'] = $filter_date_from;
|
104: | $data['filter_date_to'] = $filter_date_to;
|
105: |
|
106: | $data['user_token'] = $this->session->data['user_token'];
|
107: |
|
108: | $data['header'] = $this->load->controller('common/header');
|
109: | $data['column_left'] = $this->load->controller('common/column_left');
|
110: | $data['footer'] = $this->load->controller('common/footer');
|
111: |
|
112: | $this->response->setOutput($this->load->view('catalog/review', $data));
|
113: | }
|
114: |
|
115: | |
116: | |
117: | |
118: | |
119: |
|
120: | public function list(): void {
|
121: | $this->load->language('catalog/review');
|
122: |
|
123: | $this->response->setOutput($this->getList());
|
124: | }
|
125: |
|
126: | |
127: | |
128: | |
129: | |
130: |
|
131: | protected function getList(): string {
|
132: | if (isset($this->request->get['filter_product'])) {
|
133: | $filter_product = $this->request->get['filter_product'];
|
134: | } else {
|
135: | $filter_product = '';
|
136: | }
|
137: |
|
138: | if (isset($this->request->get['filter_author'])) {
|
139: | $filter_author = $this->request->get['filter_author'];
|
140: | } else {
|
141: | $filter_author = '';
|
142: | }
|
143: |
|
144: | if (isset($this->request->get['filter_status'])) {
|
145: | $filter_status = $this->request->get['filter_status'];
|
146: | } else {
|
147: | $filter_status = '';
|
148: | }
|
149: |
|
150: | if (isset($this->request->get['filter_date_from'])) {
|
151: | $filter_date_from = $this->request->get['filter_date_from'];
|
152: | } else {
|
153: | $filter_date_from = '';
|
154: | }
|
155: |
|
156: | if (isset($this->request->get['filter_date_to'])) {
|
157: | $filter_date_to = $this->request->get['filter_date_to'];
|
158: | } else {
|
159: | $filter_date_to = '';
|
160: | }
|
161: |
|
162: | if (isset($this->request->get['order'])) {
|
163: | $order = (string)$this->request->get['order'];
|
164: | } else {
|
165: | $order = 'DESC';
|
166: | }
|
167: |
|
168: | if (isset($this->request->get['sort'])) {
|
169: | $sort = (string)$this->request->get['sort'];
|
170: | } else {
|
171: | $sort = 'r.date_added';
|
172: | }
|
173: |
|
174: | if (isset($this->request->get['page'])) {
|
175: | $page = (int)$this->request->get['page'];
|
176: | } else {
|
177: | $page = 1;
|
178: | }
|
179: |
|
180: | $url = '';
|
181: |
|
182: | if (isset($this->request->get['filter_product'])) {
|
183: | $url .= '&filter_product=' . urlencode(html_entity_decode($this->request->get['filter_product'], ENT_QUOTES, 'UTF-8'));
|
184: | }
|
185: |
|
186: | if (isset($this->request->get['filter_author'])) {
|
187: | $url .= '&filter_author=' . urlencode(html_entity_decode($this->request->get['filter_author'], ENT_QUOTES, 'UTF-8'));
|
188: | }
|
189: |
|
190: | if (isset($this->request->get['filter_status'])) {
|
191: | $url .= '&filter_status=' . $this->request->get['filter_status'];
|
192: | }
|
193: |
|
194: | if (isset($this->request->get['filter_date_from'])) {
|
195: | $url .= '&filter_date_from=' . $this->request->get['filter_date_from'];
|
196: | }
|
197: |
|
198: | if (isset($this->request->get['filter_date_to'])) {
|
199: | $url .= '&filter_date_to=' . $this->request->get['filter_date_to'];
|
200: | }
|
201: |
|
202: | if (isset($this->request->get['sort'])) {
|
203: | $url .= '&sort=' . $this->request->get['sort'];
|
204: | }
|
205: |
|
206: | if (isset($this->request->get['order'])) {
|
207: | $url .= '&order=' . $this->request->get['order'];
|
208: | }
|
209: |
|
210: | if (isset($this->request->get['page'])) {
|
211: | $url .= '&page=' . $this->request->get['page'];
|
212: | }
|
213: |
|
214: | $data['action'] = $this->url->link('catalog/review.list', 'user_token=' . $this->session->data['user_token'] . $url);
|
215: |
|
216: | $data['reviews'] = [];
|
217: |
|
218: | $filter_data = [
|
219: | 'filter_product' => $filter_product,
|
220: | 'filter_author' => $filter_author,
|
221: | 'filter_status' => $filter_status,
|
222: | 'filter_date_from' => $filter_date_from,
|
223: | 'filter_date_to' => $filter_date_to,
|
224: | 'sort' => $sort,
|
225: | 'order' => $order,
|
226: | 'start' => ($page - 1) * $this->config->get('config_pagination_admin'),
|
227: | 'limit' => $this->config->get('config_pagination_admin')
|
228: | ];
|
229: |
|
230: | $this->load->model('catalog/review');
|
231: |
|
232: | $results = $this->model_catalog_review->getReviews($filter_data);
|
233: |
|
234: | foreach ($results as $result) {
|
235: | $data['reviews'][] = [
|
236: | 'review_id' => $result['review_id'],
|
237: | 'name' => $result['name'],
|
238: | 'author' => $result['author'],
|
239: | 'rating' => $result['rating'],
|
240: | 'status' => $result['status'],
|
241: | 'date_added' => date($this->language->get('date_format_short'), strtotime($result['date_added'])),
|
242: | 'edit' => $this->url->link('catalog/review.form', 'user_token=' . $this->session->data['user_token'] . '&review_id=' . $result['review_id'] . $url)
|
243: | ];
|
244: | }
|
245: |
|
246: | $url = '';
|
247: |
|
248: | if (isset($this->request->get['filter_product'])) {
|
249: | $url .= '&filter_product=' . urlencode(html_entity_decode($this->request->get['filter_product'], ENT_QUOTES, 'UTF-8'));
|
250: | }
|
251: |
|
252: | if (isset($this->request->get['filter_author'])) {
|
253: | $url .= '&filter_author=' . urlencode(html_entity_decode($this->request->get['filter_author'], ENT_QUOTES, 'UTF-8'));
|
254: | }
|
255: |
|
256: | if (isset($this->request->get['filter_status'])) {
|
257: | $url .= '&filter_status=' . $this->request->get['filter_status'];
|
258: | }
|
259: |
|
260: | if (isset($this->request->get['filter_date_from'])) {
|
261: | $url .= '&filter_date_from=' . $this->request->get['filter_date_from'];
|
262: | }
|
263: |
|
264: | if (isset($this->request->get['filter_date_to'])) {
|
265: | $url .= '&filter_date_to=' . $this->request->get['filter_date_to'];
|
266: | }
|
267: |
|
268: | if ($order == 'ASC') {
|
269: | $url .= '&order=DESC';
|
270: | } else {
|
271: | $url .= '&order=ASC';
|
272: | }
|
273: |
|
274: | $data['sort_product'] = $this->url->link('catalog/review.list', 'user_token=' . $this->session->data['user_token'] . '&sort=pd.name' . $url);
|
275: | $data['sort_author'] = $this->url->link('catalog/review.list', 'user_token=' . $this->session->data['user_token'] . '&sort=r.author' . $url);
|
276: | $data['sort_rating'] = $this->url->link('catalog/review.list', 'user_token=' . $this->session->data['user_token'] . '&sort=r.rating' . $url);
|
277: | $data['sort_date_added'] = $this->url->link('catalog/review.list', 'user_token=' . $this->session->data['user_token'] . '&sort=r.date_added' . $url);
|
278: |
|
279: | $url = '';
|
280: |
|
281: | if (isset($this->request->get['filter_product'])) {
|
282: | $url .= '&filter_product=' . urlencode(html_entity_decode($this->request->get['filter_product'], ENT_QUOTES, 'UTF-8'));
|
283: | }
|
284: |
|
285: | if (isset($this->request->get['filter_author'])) {
|
286: | $url .= '&filter_author=' . urlencode(html_entity_decode($this->request->get['filter_author'], ENT_QUOTES, 'UTF-8'));
|
287: | }
|
288: |
|
289: | if (isset($this->request->get['filter_status'])) {
|
290: | $url .= '&filter_status=' . $this->request->get['filter_status'];
|
291: | }
|
292: |
|
293: | if (isset($this->request->get['filter_date_from'])) {
|
294: | $url .= '&filter_date_from=' . $this->request->get['filter_date_from'];
|
295: | }
|
296: |
|
297: | if (isset($this->request->get['filter_date_to'])) {
|
298: | $url .= '&filter_date_to=' . $this->request->get['filter_date_to'];
|
299: | }
|
300: |
|
301: | if (isset($this->request->get['sort'])) {
|
302: | $url .= '&sort=' . $this->request->get['sort'];
|
303: | }
|
304: |
|
305: | if (isset($this->request->get['order'])) {
|
306: | $url .= '&order=' . $this->request->get['order'];
|
307: | }
|
308: |
|
309: | $review_total = $this->model_catalog_review->getTotalReviews($filter_data);
|
310: |
|
311: | $data['pagination'] = $this->load->controller('common/pagination', [
|
312: | 'total' => $review_total,
|
313: | 'page' => $page,
|
314: | 'limit' => $this->config->get('config_pagination_admin'),
|
315: | 'url' => $this->url->link('catalog/review.list', 'user_token=' . $this->session->data['user_token'] . $url . '&page={page}')
|
316: | ]);
|
317: |
|
318: | $data['results'] = sprintf($this->language->get('text_pagination'), ($review_total) ? (($page - 1) * $this->config->get('config_pagination_admin')) + 1 : 0, ((($page - 1) * $this->config->get('config_pagination_admin')) > ($review_total - $this->config->get('config_pagination_admin'))) ? $review_total : ((($page - 1) * $this->config->get('config_pagination_admin')) + $this->config->get('config_pagination_admin')), $review_total, ceil($review_total / $this->config->get('config_pagination_admin')));
|
319: |
|
320: | $data['filter_product'] = $filter_product;
|
321: | $data['filter_author'] = $filter_author;
|
322: | $data['filter_status'] = $filter_status;
|
323: | $data['filter_date_from'] = $filter_date_from;
|
324: | $data['filter_date_to'] = $filter_date_to;
|
325: |
|
326: | $data['sort'] = $sort;
|
327: | $data['order'] = $order;
|
328: |
|
329: | return $this->load->view('catalog/review_list', $data);
|
330: | }
|
331: |
|
332: | |
333: | |
334: | |
335: | |
336: |
|
337: | public function form(): void {
|
338: | $this->load->language('catalog/review');
|
339: |
|
340: | $this->document->setTitle($this->language->get('heading_title'));
|
341: |
|
342: | $data['text_form'] = !isset($this->request->get['review_id']) ? $this->language->get('text_add') : $this->language->get('text_edit');
|
343: |
|
344: | $url = '';
|
345: |
|
346: | if (isset($this->request->get['filter_product'])) {
|
347: | $url .= '&filter_product=' . urlencode(html_entity_decode($this->request->get['filter_product'], ENT_QUOTES, 'UTF-8'));
|
348: | }
|
349: |
|
350: | if (isset($this->request->get['filter_author'])) {
|
351: | $url .= '&filter_author=' . urlencode(html_entity_decode($this->request->get['filter_author'], ENT_QUOTES, 'UTF-8'));
|
352: | }
|
353: |
|
354: | if (isset($this->request->get['filter_status'])) {
|
355: | $url .= '&filter_status=' . $this->request->get['filter_status'];
|
356: | }
|
357: |
|
358: | if (isset($this->request->get['filter_date_from'])) {
|
359: | $url .= '&filter_date_from=' . $this->request->get['filter_date_from'];
|
360: | }
|
361: |
|
362: | if (isset($this->request->get['filter_date_to'])) {
|
363: | $url .= '&filter_date_to=' . $this->request->get['filter_date_to'];
|
364: | }
|
365: |
|
366: | if (isset($this->request->get['sort'])) {
|
367: | $url .= '&sort=' . $this->request->get['sort'];
|
368: | }
|
369: |
|
370: | if (isset($this->request->get['order'])) {
|
371: | $url .= '&order=' . $this->request->get['order'];
|
372: | }
|
373: |
|
374: | if (isset($this->request->get['page'])) {
|
375: | $url .= '&page=' . $this->request->get['page'];
|
376: | }
|
377: |
|
378: | $data['breadcrumbs'] = [];
|
379: |
|
380: | $data['breadcrumbs'][] = [
|
381: | 'text' => $this->language->get('text_home'),
|
382: | 'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'])
|
383: | ];
|
384: |
|
385: | $data['breadcrumbs'][] = [
|
386: | 'text' => $this->language->get('heading_title'),
|
387: | 'href' => $this->url->link('catalog/review', 'user_token=' . $this->session->data['user_token'] . $url)
|
388: | ];
|
389: |
|
390: | $data['save'] = $this->url->link('catalog/review.save', 'user_token=' . $this->session->data['user_token']);
|
391: | $data['back'] = $this->url->link('catalog/review', 'user_token=' . $this->session->data['user_token'] . $url);
|
392: |
|
393: | if (isset($this->request->get['review_id'])) {
|
394: | $this->load->model('catalog/review');
|
395: |
|
396: | $review_info = $this->model_catalog_review->getReview($this->request->get['review_id']);
|
397: | }
|
398: |
|
399: | if (isset($this->request->get['review_id'])) {
|
400: | $data['review_id'] = (int)$this->request->get['review_id'];
|
401: | } else {
|
402: | $data['review_id'] = 0;
|
403: | }
|
404: |
|
405: | if (!empty($review_info)) {
|
406: | $data['product_id'] = $review_info['product_id'];
|
407: | } else {
|
408: | $data['product_id'] = '';
|
409: | }
|
410: |
|
411: | if (!empty($review_info)) {
|
412: | $data['product'] = $review_info['product'];
|
413: | } else {
|
414: | $data['product'] = '';
|
415: | }
|
416: |
|
417: | if (!empty($review_info)) {
|
418: | $data['author'] = $review_info['author'];
|
419: | } else {
|
420: | $data['author'] = '';
|
421: | }
|
422: |
|
423: | if (!empty($review_info)) {
|
424: | $data['text'] = $review_info['text'];
|
425: | } else {
|
426: | $data['text'] = '';
|
427: | }
|
428: |
|
429: | if (!empty($review_info)) {
|
430: | $data['rating'] = $review_info['rating'];
|
431: | } else {
|
432: | $data['rating'] = '';
|
433: | }
|
434: |
|
435: | if (!empty($review_info)) {
|
436: | $data['date_added'] = ($review_info['date_added'] != '0000-00-00 00:00' ? $review_info['date_added'] : date('Y-m-d'));
|
437: | } else {
|
438: | $data['date_added'] = date('Y-m-d');
|
439: | }
|
440: |
|
441: | if (!empty($review_info)) {
|
442: | $data['status'] = $review_info['status'];
|
443: | } else {
|
444: | $data['status'] = '';
|
445: | }
|
446: |
|
447: | $data['user_token'] = $this->session->data['user_token'];
|
448: |
|
449: | $data['header'] = $this->load->controller('common/header');
|
450: | $data['column_left'] = $this->load->controller('common/column_left');
|
451: | $data['footer'] = $this->load->controller('common/footer');
|
452: |
|
453: | $this->response->setOutput($this->load->view('catalog/review_form', $data));
|
454: | }
|
455: |
|
456: | |
457: | |
458: | |
459: | |
460: |
|
461: | public function save(): void {
|
462: | $this->load->language('catalog/review');
|
463: |
|
464: | $json = [];
|
465: |
|
466: | if (!$this->user->hasPermission('modify', 'catalog/review')) {
|
467: | $json['error']['warning'] = $this->language->get('error_permission');
|
468: | }
|
469: |
|
470: | if ((oc_strlen($this->request->post['author']) < 3) || (oc_strlen($this->request->post['author']) > 64)) {
|
471: | $json['error']['author'] = $this->language->get('error_author');
|
472: | }
|
473: |
|
474: | if (!$this->request->post['product_id']) {
|
475: | $json['error']['product'] = $this->language->get('error_product');
|
476: | }
|
477: |
|
478: | if (oc_strlen($this->request->post['text']) < 1) {
|
479: | $json['error']['text'] = $this->language->get('error_text');
|
480: | }
|
481: |
|
482: | if (!isset($this->request->post['rating']) || $this->request->post['rating'] < 0 || $this->request->post['rating'] > 5) {
|
483: | $json['error']['rating'] = $this->language->get('error_rating');
|
484: | }
|
485: |
|
486: | if (isset($json['error']) && !isset($json['error']['warning'])) {
|
487: | $json['error']['warning'] = $this->language->get('error_warning');
|
488: | }
|
489: |
|
490: | if (!$json) {
|
491: | $this->load->model('catalog/review');
|
492: |
|
493: | if (!$this->request->post['review_id']) {
|
494: | $json['review_id'] = $this->model_catalog_review->addReview($this->request->post);
|
495: | } else {
|
496: | $this->model_catalog_review->editReview($this->request->post['review_id'], $this->request->post);
|
497: | }
|
498: |
|
499: | $json['success'] = $this->language->get('text_success');
|
500: | }
|
501: |
|
502: | $this->response->addHeader('Content-Type: application/json');
|
503: | $this->response->setOutput(json_encode($json));
|
504: | }
|
505: |
|
506: | |
507: | |
508: | |
509: | |
510: |
|
511: | public function delete(): void {
|
512: | $this->load->language('catalog/review');
|
513: |
|
514: | $json = [];
|
515: |
|
516: | if (isset($this->request->post['selected'])) {
|
517: | $selected = $this->request->post['selected'];
|
518: | } else {
|
519: | $selected = [];
|
520: | }
|
521: |
|
522: | if (!$this->user->hasPermission('modify', 'catalog/review')) {
|
523: | $json['error'] = $this->language->get('error_permission');
|
524: | }
|
525: |
|
526: | if (!$json) {
|
527: | $this->load->model('catalog/review');
|
528: |
|
529: | foreach ($selected as $review_id) {
|
530: | $this->model_catalog_review->deleteReview($review_id);
|
531: | }
|
532: |
|
533: | $json['success'] = $this->language->get('text_success');
|
534: | }
|
535: |
|
536: | $this->response->addHeader('Content-Type: application/json');
|
537: | $this->response->setOutput(json_encode($json));
|
538: | }
|
539: |
|
540: | |
541: | |
542: | |
543: | |
544: |
|
545: | public function sync(): void {
|
546: | $this->load->language('catalog/review');
|
547: |
|
548: | $json = [];
|
549: |
|
550: | if (isset($this->request->get['page'])) {
|
551: | $page = (int)$this->request->get['page'];
|
552: | } else {
|
553: | $page = 1;
|
554: | }
|
555: |
|
556: | if (!$this->user->hasPermission('modify', 'catalog/review')) {
|
557: | $json['error'] = $this->language->get('error_permission');
|
558: | }
|
559: |
|
560: | if (!$json) {
|
561: | $this->load->model('catalog/product');
|
562: | $this->load->model('catalog/review');
|
563: |
|
564: | $limit = 10;
|
565: |
|
566: | $product_data = [
|
567: | 'start' => ($page - 1) * $limit,
|
568: | 'limit' => $limit
|
569: | ];
|
570: |
|
571: | $results = $this->model_catalog_product->getProducts($product_data);
|
572: |
|
573: | foreach ($results as $result) {
|
574: | $this->model_catalog_product->editRating($result['product_id'], $this->model_catalog_review->getRating($result['product_id']));
|
575: | }
|
576: |
|
577: | $product_total = $this->model_catalog_product->getTotalProducts();
|
578: |
|
579: | $start = ($page - 1) * $limit;
|
580: | $end = $start > ($product_total - $limit) ? $product_total : ($start + $limit);
|
581: |
|
582: | if ($end < $product_total) {
|
583: | $json['text'] = sprintf($this->language->get('text_next'), $start, $end, $product_total);
|
584: |
|
585: | $json['next'] = $this->url->link('catalog/review.sync', 'user_token=' . $this->session->data['user_token'] . '&page=' . ($page + 1), true);
|
586: | } else {
|
587: | $json['success'] = $this->language->get('text_success');
|
588: |
|
589: | $json['next'] = '';
|
590: | }
|
591: | }
|
592: |
|
593: | $this->response->addHeader('Content-Type: application/json');
|
594: | $this->response->setOutput(json_encode($json));
|
595: | }
|
596: | }
|
597: | |