Страница просмотра обращения пользователя позволяет просмотреть полный текст обращения, изображения, а так же изменить статус на "Обращение закрыто" или "Обращение в обработке". Данная страница открывается при клике на ссылку, имеющуюся в столбце "Тема" таблицы на странице просмотра всех обращений.

Так как предполагается, что вы прошли весь путь изучения работы над компонентом от первой до данной главы, все уже изученные подробности будут опущены; остановимся только на важных моментах кода данной страницы.

Сразу же обратите внимание на то, что данная страница не привязана ни к одному пункту меню, а открывается исключительно из выше указанной таблицы.

Шаблон данной страницы в виде файла tpl_view_mess.php находится в папке  tpl_view_mess , которая в свою очередь расположена там же, где и остальные папки с шаблонами, т.е. в  views

Прежде, чем приступить к созданию файла, необходимо прописать соответствующий метод в контроллере, который будет запускать выполнение данного файла. Для этого откройте контроллер и пропишите такие строки:

  42    /**
  43    * Метод для открытия страницы просмотра обращения
  44    * @access public
  45    */
  46    function feedback_view()
  47    {
  48    require(JPATH_COMPONENT .'/views/tpl_view_mess/tpl_view_mess.php');
  49    }

Сохраните и закройте.

Теперь создайте по указанному адресу файл tpl_view_mess.php и сохраните, иначе в редакторе не будет работать довольно удобная цветная подсветка кода.

Внесите в файл код страницы: 

   1    <?php
   2    /**
   3    * @Author WDS
   4    * @subpackage Components
   5    * @link Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
   6    * @license GNU/GPL
   7    * @copyright Copyright (C) 2019
   8    *
   9    * --- СТРАНИЦА ПРОСМОТРА ОБРАЩЕНИЯ ДЛЯ ГЛАВНОГО АДМИНИСТРАТОРА ---
  10   */
  11   // Защита от несанкционированного доступа
  12   defined( '_JEXEC' ) or die( 'Доступ запрещен...' );
  13   // Функция getDocument класса JFactory присваивает $doc объект документа
  14   $doc = JFactory::getDocument();
  15   // Подключение файла CSS
  16   $doc->addStyleSheet(JUri::base(). 'components/com_feedback_form/views/css/adm_feedback_view.css');

Пока всё знакомо по уже созданным ранее файлам. Здесь, как и раньше, необходимо сделать паузу (не забудьте перед паузой сделать сохранение) и создать файл CSS, указанный в строке 16. Он будет, как и все остальные подобные файлы, расположен в папке  CSS  (см. указанный адрес в строке 16). Создайте данный файл и внесите в него нижеследующий код:

/* АДМИНИСТРИРОВАНИЕ ОБРАЩЕНИЙ */
/* Subpackage: Components */
/* Copyright (C) 2019 */
.num_mess_m {
   margin: 20px 0 20px 0;
   }
.left_num_mess_m {
   width: 230px;
   height: 40px;
   display: inline-block;
   padding: 17px 0 0 0;
   margin-left: 12px;
}
.right_num_mess_m {
   width: 250px;
   height: 23px;
   display: inline-block;
   position: absolute;
   padding: 9px 0 4px 0;
   padding: 9px 0 4px 0;
   border: 4px ridge darkgrey;
   background-color: rgb(243,243,243);
   }
span#num_mess_title_m {
  font-family: Georgia;
   font-weight: bold;
   font-size: 18px;
   color: rgb(120,120,120);
   }
p#num_mess_num_m {
   margin: 2px 10px 8px 0;
   font-family: 'Monotype Corsiva';
   font-size: 38px;
   float: right;
   }
.txt_mess {
   margin: 0 0 15px 0;
   padding: 7px;
   border: 4px ridge darkgrey;
   background-color: rgb(243,243,243);
   }
.left_num_mess { 
   width: 230px;
   height: 40px;
   display: inline-block;
   padding: 17px 0 0 0;
   margin-left: 12px;
   }
.right_num_mess { 
   width: 250px;
   height: 20px;
   display: inline-block;
   position: absolute;
   padding: 5px 0 4px 0;
   border: 4px ridge darkgrey;
   background-color: rgb(243,243,243);
   }
span#num_mess_title {
   font-family: Georgia;
   font-weight: bold;
   font-size: 18px;
   color: rgb(120,120,120);
   }
p#num_mess_num {
   margin: 2px 10px 8px 0;
   font-family: Tahoma;
   font-size: 16px;
   float: right;
   }
.num_mess_m2 {margin: 20px 0 20px 0;}
.left_num_mess_m2 {
   width: 500px;
   height: 40px;
   display: inline-block;
   padding: 17px 0 0 0;
   margin-left: 12px;
   margin-bottom: 20px;
   }
span#num_mess_title_m2 {
   font-family: Georgia;
   font-size: 24px;
   font-style: italic;
   color: rgb(120,120,120);
   font-weight: bold;
   }
.img_f_back img {
   max-width: 220px;
   max-height: 220px;
   }
.img_block {height: auto;}
.left_img_block {
   height: auto;
   display: inline-block;
   }
.img_f_back {width: 220px;}
.right_img_block {
   width: 500px;
   height: 20px;
   display: inline-block;
   position: absolute;
   padding: 5px 0 4px 4px;
   margin: 0 0 0 23px;
   border: 4px ridge darkgrey;
   background-color: rgb(243,243,243);
}
.button_change_status {
   margin: 10px 0 50px 0;
   padding: 20px 0 0 0;
   border-top: 2px solid rgb(120,120,120);
   }
p.button_change_status-h {
   margin: 40px 0 -5px 30px;
   color: rgb(120,120,120);
   font-family: Georgia;
   font-weight: bold;
   font-size: 18x;
   text-align: center;
   }
input[type="submit"].button_change-1 {
   width: 220px;
   margin: 0 0 0 140px;
   border: 4px ridge darkgrey;
   border-radius: 7px;
   background: linear-gradient(to bottom, gainsboro, darkgrey, gainsboro);
   }
input[type="submit"].button_change-2 {
   width: 220px;
   margin: 0 0 0 30px;
   border: 4px ridge darkgrey;
   border-radius: 7px;
   background: linear-gradient(to bottom, gainsboro, darkgrey, gainsboro);
   }

Позже вы сможете настроить страницу по своему усмотрению. А пока вернитесь к составлению файла шаблона страницы.

  17   // ДОПОЛНИТЕЛЬНЫЙ КОНТРОЛЬ ДОСТУПА
  18   $user = JFactory::getUser(); // Получение данных пользователя
  19   $groups = $user->get('groups');
  20   foreach ($groups as $group) {
  21      $user_group = $group;
  22   }
  23   if (!($user_group == '7')) { 
  24      header('Location: /');
  25   exit;
  26   }

Точно такой же код использовался для защиты от доступа посторонних к странице в файле tpl_adm_feedback.php (глава 21).

  27   // ПОЛУЧЕНИЕ НОМЕРА ОБРАЩЕНИЯ
  28   $number_last_message = JRequest::getVar( 'mess_number' );
  29   // ПРОВЕРКА ПОЛУЧЕНИЯ НОМЕРА
  30   if ($number_last_message == NULL) {
  31      include(JPATH_COMPONENT .'/err/err_number.php');
  32      exit;
  33   }

Здесь переменная $number_last_message получает номер сообщения и проверяет его получение.

 Обратите внимание: номер обращения, которое должно быть открыто, передаётся в запросе; он находится в адресе (в URL) в переменной  mess_number (см. глава 21, строка кода 57), а метод JRequest::getVar позволяет получить её значение из адреса; при этом данный метод удалит из текста HTML-форматирование (если такое вдруг окажется в переменной), т.е. обеспечит безопасность компонента и сайта в целом. 

  34   // ПОДКЛЮЧЕНИЕ К БАЗЕ ДАННЫХ И ПРОВЕРКА СОЕДИНЕНИЯ
  35   $dbJFactory::getDBO();
  36   if (!$db->connected()) {
  37      include(JPATH_COMPONENT .'/err/err_db.php'); 
  38      exit;
  39   }
  40   // ПОЛУЧЕНИЕ ДАННЫХ
  41   $db->setQuery("SELECT * FROM #__feedback_form WHERE id = " . $number_last_message);
  42   $row = $db->LoadRow();
  43   if ($row == NULL) {
  44      include(JPATH_COMPONENT .'/err/err_data.php');
  45      exit;
  46   }
  47   // ВВЕДЕНИЕ МЕТАТАГОВ
  48   $doc->setTitle('Просмотр сообщения');
  49   $doc->addCustomTag('<meta name="robots" content="noindex, nofollow" />');
  50   ?>
  51  

В этом коде так же нет ничего сложного: всё это уже встречалось в других скриптах.

Теперь начинается построение самой страницы.

  52   <!-- НОМЕР ОБРАЩЕНИЯ -->
  53   <div class='num_mess_m'>
  54   <!-- Левый блок -->
  55      <div class='left_num_mess_m'>
  56         <p><span id='num_mess_title_m'>Номер обращения: </span></p>
  57      </div>
  58   <!-- Правый блок -->
  59      <div class='right_num_mess_m'>
  60         <div class='num_mess_num_m'><p id='num_mess_num_m'><?php echo $row[0]; ?></p></div>
  61       </div>
  62   </div>

Эта часть кода выводит на экран номер обращения. Далее будет ещё несколько полей, построенных по такому же принципу: слева название поля, справа - значение. Расположение блоков настраивается при помощи таблицы CSS. Данные, выводимые в качестве значения, берутся из массива, полученного в 42 строке ($row).

  63   <!-- ВИД ОБРАЩЕНИЯ -->
  64   <div class='num_mess'>
  65   <!-- Левый блок -->
  66      <div class='left_num_mess'>
  67          <p><span id='num_mess_title'>Вид обращения: </span></p>
  68      </div>
  69   <!-- Правый блок -->
  70      <div class='right_num_mess'>
  71          <div class='num_mess_num'><p id='num_mess_num'><?php echo $row[2]; ?></p></div>
  72      </div>
  73   </div>

  74   <!-- ТЕКСТ ОБРАЩЕНИЯ -->
  75   <div class='mess_txt'>
  76      <div class='txt_mess'><?php echo nl2br($row[3], false); ?></div>
  77   </div>

Основной текст выводится во всю ширину страницы; при этом для обработки полученного текста применяется функция PHP nl2br. Это необходимо для корректного отображения перевода строки в тексте.

  78   <!-- АВТОР ОБРАЩЕНИЯ -->
  79   <div class='num_mess'>
  80   <!-- Левый блок -->
  81      <div class='left_num_mess'>
  82          <p><span id='num_mess_title'>Автор: </span></p>
  83      </div>
  84   <!-- Правый блок -->
  85      <div class='right_num_mess'>
  86          <div class='num_mess_num'><p id='num_mess_num'><?php echo $row[1]; ?></p></div>
  87      </div>
  88   </div>

  89   <!-- АДРЕС ПОЧТЫ АВТОРА ОБРАЩЕНИЯ -->
  90   <div class='num_mess'>
  91   <!-- Левый блок -->
  92      <div class='left_num_mess'>
  93          <p><span id='num_mess_title'>Почта автора: </span></p>
  94      </div>
  95   <!-- Правый блок -->
  96      <div class='right_num_mess'>
  97          <div class='num_mess_num'><p id='num_mess_num'><?php echo $row[7]; ?></p></div>
  98      </div>
  99   </div>

 100  <!-- IP АВТОРА -->
 101  <div class='num_mess'>
 102  <!-- Левый блок -->
 103     <div class='left_num_mess'>
 104         <p><span id='num_mess_title'>IP: </span></p>
 105     </div>
 106  <!-- Правый блок -->
 107     <div class='right_num_mess'>
 108         <div class='num_mess_num'><p id='num_mess_num'><?php echo $row[8]; ?></p></div>
 109     </div>
 110  </div>

 111  <!-- ВРЕМЯ -->
 112  <div class='num_mess'>
 113  <!-- Левый блок -->
 114     <div class='left_num_mess'>
 115          <p><span id='num_mess_title'>Время: </span></p>
 116     </div>
 117  <!-- Правый блок -->
 118     <div class='right_num_mess'>
 119         <div class='num_mess_num'><p id='num_mess_num'><?php echo $row[9] . " " . $row[10] ; ?></p></div>
 120     </div>
 121  </div>

Следующая часть кода подготавливает текст для заголовка: если изображений нет, переменной $label_img_info присваивается соответствующая фраза (строка 129), если изображение есть - остаётся то, что было присвоено в строке 125. Сторок 135-137 выводят заголовок с полученной информацией(строки 153-182).

 122  <!-- РАБОТА С ИЗОБРАЖЕНИЯМИ -->
 123  <?php
 124  // Заголовок
 125  $label_img_info = 'Изображения';
 126      if ($row[4] == NULL) {
 127          if ($row[5] == NULL) {
 128              if ($row[6] == NULL) {
 129                  $label_img_info = 'Изображений нет...';
 130              }
 131          }
 132      } 
 133  ?>

 134  <!-- ЗАГОЛОВОК -->
 135  <div class='left_num_mess_m2'>
 136  <p><span id='num_mess_title_m2'><?php echo $label_img_info; ?></span></p>
 137  </div>

Код в строках 138-152 выводит изображение №1 (если таковое присутствует в обращении). Слева выводится само изображение (строка 144), справа - информация о названии изображения (строка 149). Предварительно в строке 139 происходит проверка, имеется ли данное изображение или нет; если изображения нет, то место под него не бронируется. 

Если вы сохраняете изображения не в папке  images , а в базе данных (см. главу 17), то значения атрибута src в тегах <img> (строки 144, 159 и 174) необходимо изменить; подробно читайте в статье "Как вносить изображения в базу данных".

Точно так же работает код для двух других изображений.

 138  <!-- ФОТО 1 -->
 139  <?php if ($row[4] != NULL): ?>
 140  <div class='img_block'>
 141  <!-- Левый блок -->
 142     <div class='left_img_block'>
 143        <div class='img_f_back'>
 144            <img src = <?php echo "/components/com_feedback_form" . $row[4]; ?>>
 145        </div>
 146     </div>
 147  <!-- Правый блок -->
 148     <div class='right_img_block'>
 149        <div class='img_name'><p><span id='img_name'><?php echo $row[4]; ?></span></p></div>
 150     </div>
 151  </div>
 152  <?php endif; ?>
 153  <!-- ФОТО 2 -->
 154  <?php if ($row[5] != NULL): ?>
 155  <div class='img_block'>
 156  <!-- Левый блок -->
 157     <div class='left_img_block'>
 158        <div class='img_f_back'>
 159            <img src = <?php echo "/components/com_feedback_form" . $row[5]; ?>>
 160        </div>
 161     </div>
 162  <!-- Правый блок -->
 163     <div class='right_img_block'>
 164        <div class='img_name'><p><span id='img_name'><?php echo $row[5]; ?></span></p></div>
 165     </div>
 166  </div>
 167  <?php endif; ?>
 168  <!-- ФОТО 3 -->
 169  <?php if ($row[6] != NULL): ?>
 170  <div class='img_block'>
 171  <!-- Левый блок -->
 172     <div class='left_img_block'>
 173        <div class='img_f_back'>
 174            <img src = <?php echo "/components/com_feedback_form" . $row[6]; ?>>
 175        </div>
 176     </div>
 177  <!-- Правый блок -->
 178     <div class='right_img_block'>
 179        <div class='img_name'><p><span id='img_name'><?php echo $row[6]; ?></span></p></div>
 180     </div>
 181  </div>
 182  <?php endif; ?>

И последний блок кода выводит на страницу кнопки для изменения статуса обращения. Если просто закрыть страницу, статус так и останется 1 - новое обращение. При "нажатии" соответствующей кнопки статус изменится на "Обращение закрыто" (статус 0, строка 192) или "Обращение в обработке" (статус 2, строка 193).

Для реализации данной функции на странице создаётся форма (строка 190), а в соответствующей папке сайта - обработчик данной формы. Как работает форма уже конкретно было разобрано в главе 8, поэтому здесь повторять это уже нет смысла. Отметим только то, что адрес обработчика формы составляется в строках 186-189 при помощи кода на PHP, а в атрибут action вставляется в виде переменной $act_mess_number. В остальном ничего здесь сложного нет: кнопки отправляют обработчику своё значение (value), а уже обработчик выполняет соответствующие действия: производит замену статуса и выводит сообщение на экран. 

 183  <!-- КНОПКИ ИЗМЕНЕНИЯ СТАТУСА -->
 184  <p class='button_change_status-h'> Изменение статуса </p>
 185  <div class='button_change_status'>
 186  <?php
 187  // Составление адреса для формы
 188  $act_mess_number = "/index.php?option=com_feedback_form&task=feedback_sch&mess_number=" . $row[0];
 189  ?>
 190  <form name='status_change' action="<?php echo $act_mess_number; ?>" method='post' enctype="multipart/form-data">
 191  <p>
 192  <input class='button_change-1' type="submit" name='status0' value='Обращение закрыто'>
 193  <input class='button_change-2' type="submit" name='status2' value='Обращение в обработке'>
 194  </p>
 195  </form>
 196  </div>

Всё, файл шаблона страницы просмотра обращения создан. Теперь вы можете его открыть (кликнуть в общей таблице всех обращений на ссылку) и настроить его общий вид. Однако не нажимайте кнопки - система выдаст ошибку, так как обработчик формы ещё не создан; этому будет посвящена следующая глава. 

 

Добавлять комментарии и ответы могут только пользователи, прошедшие регистрацию!
Зарегистрируйтесь и напишите своё мнение или ответ!