Multimag  0.2.992
comments.php
См. документацию.
1 <?php
2 
3 // MultiMag v0.2 - Complex sales system
4 //
5 // Copyright (C) 2005-2018, BlackLight, TND Team, http://tndproject.org
6 //
7 // This program is free software: you can redistribute it and/or modify
8 // it under the terms of the GNU Affero General Public License as
9 // published by the Free Software Foundation, either version 3 of the
10 // License, or (at your option) any later version.
11 //
12 // This program is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU Affero General Public License for more details.
16 //
17 // You should have received a copy of the GNU Affero General Public License
18 // along with this program. If not, see <http://www.gnu.org/licenses/>.
19 
20 namespace Modules\Admin;
21 
23 class comments extends \IModule {
24 
25  public function __construct() {
26  parent::__construct();
27  $this->acl_object_name = 'admin.comments';
28  }
29 
30  public function getName() {
31  return 'Администрирование комментариев';
32  }
33 
34  public function getDescription() {
35  return '';
36  }
37 
38  protected function renderList() {
39  global $db, $tmpl;
40  $res = $db->query("SELECT `comments`.`id`, `date`, `object_name`, `object_id`, `autor_name`, `autor_email`, `autor_id`, `text`, `rate`, `ip`, `user_agent`, `comments`.`response`, `users`.`name` AS `user_name`, `users`.`reg_email` AS `user_email`
41  FROM `comments`
42  INNER JOIN `users` ON `users`.`id`=`comments`.`autor_id`
43  ORDER BY `comments`.`id` DESC");
44  $tmpl->addContent("<h1 id='page-title'>Последние коментарии</h1>
45  <table class='list' width='100%'>
46  <tr><th>ID</th><th>Дата</th><th>Объект</th><th>Автор</th><th>e-mail</th><th>Текст коментария</th><th>Оценка</th><th>Ответ</th><th>IP адрес</th></tr>");
47  while ($line = $res->fetch_assoc()) {
48  $object = "{$line['object_name']}:{$line['object_id']}";
49  if ($line['object_name'] == 'product') {
50  $object = "<a href='/vitrina.php?mode=product&amp;p={$line['object_id']}'>$object</a>";
51  }
52  $email = $line['autor_id'] ? $line['user_email'] : $line['autor_email'];
53  $email = "<a href='mailto:$email'>$email</a>";
54  $autor = $line['autor_id'] ? "{$line['autor_id']}:<a href='/adm.php?mode=users&amp;sect=view&amp;user_id={$line['autor_id']}'>{$line['user_name']}</a>" : $line['autor_name'];
55  $response = $line['response'] ? html_out($line['response']) .
56  "<br><a href='{$this->link_prefix}&amp;sect=response&amp;id={$line['id']}'>Правка</a>"
57  : "<a href='{$this->link_prefix}&amp;sect=response&amp;id={$line['id']}'>Ответить</a>";
58  $html_text = html_out($line['text']);
59  $tmpl->addContent("<tr>
60  <td>{$line['id']} <a href='{$this->link_prefix}&amp;sect=remove&amp;id={$line['id']}'><img src='/img/i_del.png' alt='Удалить'></a></td>
61  <td>{$line['date']}</td><td>$object</td><td>$autor</td> <td>$email</td><td>$html_text</td><td>{$line['rate']}</td><td>$response</td><td>{$line['ip']}</td></tr>");
62  }
63  $tmpl->addContent("</table>");
64  }
65 
66  protected function renderResponseForm() {
67  global $tmpl, $db;
68  $id = rcvint('id');
69  $opt = request('opt');
70  $tmpl->addBreadcrumb('Ответ на коментарий с ID ' . $id, '');
71  if ($opt) {
72  \acl::accessGuard($this->acl_object_name, \acl::UPDATE);
73  $sql_text = $db->real_escape_string(request('text'));
74  $res = $db->query("UPDATE `comments` SET `response`='$sql_text', `responser`='{$_SESSION['uid']}' WHERE `id`='$id'");
75  if($db->affected_rows>0) {
76  $tmpl->msg("Коментарий сохранен успешно", 'ok');
77  } else {
78  $tmpl->msg("Не удалось сохранить комментарий", 'err');
79  }
80  } elseif(!\acl::testAccess($this->acl_object_name, \acl::UPDATE)) {
81  $tmpl->msg("У вас нет привилегий для ответа на комментарии", 'err');
82  }
83  $res = $db->query("SELECT `comments`.`id`, `date`, `object_name`, `object_id`, `autor_name`, `autor_email`, `autor_id`, `text`, `rate`, `ip`, `user_agent`, `comments`.`response`, `users`.`name` AS `user_name`, `users`.`reg_email` AS `user_email`
84  FROM `comments`
85  INNER JOIN `users` ON `users`.`id`=`comments`.`autor_id`
86  WHERE `comments`.`id`='$id'");
87  $line = $res->fetch_assoc();
88  if (!$line) {
89  throw new Exception("Коментарий не найден!");
90  }
91  $autor = $line['autor_id'] ? "{$line['autor_id']}:<a href='/adm.php?mode=users&amp;sect=view&amp;user_id={$line['autor_id']}'>{$line['user_name']}</a>" : $line['autor_name'];
92  $object = "{$line['object_name']}:{$line['object_id']}";
93  $html_text = html_out($line['text']);
94  $html_response = html_out($line['response']);
95  $tmpl->addContent("<h1 id='page-title'>Ответ на коментарий N{$line['id']}</h1>
96  <div>{$line['date']} $autor для $object пишет:<br>$html_text</div>
97  <form action='{$this->link_prefix}' method='post'>
98  <input type='hidden' name='sect' value='response'>
99  <input type='hidden' name='id' value='{$line['id']}'>
100  <input type='hidden' name='opt' value='save'>
101  Ваш ответ (500 символов максимум):<br>
102  <textarea name='text' class='text'>$html_response</textarea><br>
103  <button type='submit'>Сохранить</button>
104  </form>");
105 
106  }
107 
108  protected function renderRemoveForm() {
109  global $tmpl, $db;
110  $id = rcvint('id');
111  $opt = request('opt');
112  $tmpl->addBreadcrumb('Удаление комментария с ID ' . $id, '');
113  if ($opt) {
114  \acl::accessGuard($this->acl_object_name, \acl::DELETE);
115  $db->query("DELETE FROM `comments` WHERE `id`='$id'");
116  if($db->affected_rows>0) {
117  $tmpl->msg("Коментарий удалён успешно", 'ok');
118  } else {
119  $tmpl->msg("Не удалось удалить комментарий", 'err');
120  }
121  } else {
122  if(!\acl::testAccess($this->acl_object_name, \acl::DELETE)) {
123  $tmpl->msg("У вас нет привилегий для удаления комментариев", 'err');
124  }
125  $res = $db->query("SELECT `comments`.`id`, `date`, `object_name`, `object_id`, `autor_name`, `autor_email`, `autor_id`, `text`, `rate`, `ip`, `user_agent`, `comments`.`response`, `users`.`name` AS `user_name`, `users`.`reg_email` AS `user_email`
126  FROM `comments`
127  INNER JOIN `users` ON `users`.`id`=`comments`.`autor_id`
128  WHERE `comments`.`id`='$id'");
129  $line = $res->fetch_assoc();
130  if (!$line) {
131  throw new Exception("Коментарий не найден!");
132  }
133  $autor = $line['autor_id'] ? "{$line['autor_id']}:<a href='/adm.php?mode=users&amp;sect=view&amp;user_id={$line['autor_id']}'>{$line['user_name']}</a>" : $line['autor_name'];
134  $object = "{$line['object_name']}:{$line['object_id']}";
135  $html_text = html_out($line['text']);
136  $tmpl->addContent("<h1 id='page-title'>Ответ на коментарий N{$line['id']}</h1>
137  <div>{$line['date']} $autor для $object пишет:<br>$html_text</div>
138  <form action='{$this->link_prefix}' method='post'>
139  <input type='hidden' name='sect' value='remove'>
140  <input type='hidden' name='id' value='{$line['id']}'>
141  <input type='hidden' name='opt' value='exec'>
142  <button type='submit'>Подтверждаю удаление комментария</button>
143  </form>");
144  }
145  }
146 
147  public function run() {
148  global $tmpl;
149  $tmpl->addBreadcrumb($this->getName(), $this->link_prefix);
150  $sect = request('sect');
151  switch ($sect) {
152  case '':
153  $tmpl->addBreadcrumb($this->getName(), '');
154  $this->renderList();
155  break;
156  case 'response':
157  $this->renderResponseForm();
158  break;
159  case 'remove':
160  $this->renderRemoveForm();
161  break;
162  default:
163  throw new \NotFoundException("Секция не найдена");
164  }
165  }
166 
167 }
$module link_prefix
Definition: news.php:24
$res
Definition: fixer.php:178
rcvint($varname, $def=0)
Безопасное получение целого значения
Definition: core.php:208
html_out($data)
Обёртка над htmlentities.
Definition: core.php:249
Настройка почтовых ящиков и алиасов
Definition: comments.php:23
request($varname, $def='')
Definition: core.php:190
$line
Definition: priceload.php:39
Базовый класс для модулей
Definition: imodule.php:21
$db
static testAccess($object, $flags, $no_redirect=false)
Definition: acl.php:173
static accessGuard($object, $flags, $no_redirect=false)
То же, что и testAccess, но бросает исключение, если нет доступа
Definition: acl.php:213
const DELETE
Удаление
Definition: acl.php:29
$tmpl
$opt
Definition: adm.php:65
const UPDATE
Обновление
Definition: acl.php:28