Создание метода для открытия страницы администрирования входящих обращений

Создание пункта меню для открытия страницы

Создание страницы для администрирования входящих обращений

 

Отличительная особенность создаваемого компонента состоит в том, что администратору не понадобиться для просмотра обращений заходить в административную панель: всё будет делаться непосредственно на самом сайте (после прохождения авторизации, естественно!).

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

Итак, приступим.

 

Создание метода для открытия страницы администрирования входящих обращений

Шаблон основной страницы для администратора будет размещён в папке  tpl_admin_feedback , которая создавалась ещё в самом начале (см. главу 4). Проверьте её наличие, после чего откройте редактор, создайте и сохраните пустой файл tpl_adm_feedback.php

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

  33    /**
  34    * Метод для вывода на экран страницы администрирования обращений
  35    * @access public
  36    */
  37    function adm_view_feedback()
  38    {
  39    require(JPATH_COMPONENT .'/views/tpl_admin_feedback/tpl_adm_feedback.php');
  40    }

В строке 39 данный метод запускает и исполняет только что созданный файл шаблона. Так же обратите внимание на название метода (строка 37) - adm_view_feedback. Соответственно, именно это название и должно быть вписано в переменную task адреса страницы.

Сохраняем внесённые изменения в контроллере и переходим с созданию пункта меню.

 

Создание пункта меню для открытия страницы

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

Создание пункта меню для открытия страницы, вариант 1

Этот вариант подходит в том случае, если вы создаёте компонент исключительно для себя и не собираетесь его переустанавливать на другие сайты.

В меню административной панели выберите Меню > Все пункты меню, нажмите  Создать . В открывшемся окне введите название, например, Обращения. Далее кликните кнопку  Выбрать  (поле "тип пункта меню") и в раскрывшемся списке выберите Системные ссылки > Внешний URL. В поле Ссылка пропишите адрес создаваемой страницы:

index.php?option=com_feedback_form&view=feedback_form&task=adm_view_feedback 

Как видите, в адресе в переменной task указано значение adm_view_feedback

Создание пункта меню для открытия страницы, вариант 2

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

Для начала создайте дополнительный файл с расширением .xml и любым названием по адресу

/components/com_feedback-form/views/feedback_form/tmpl/admfeedback.xml

 Обратите внимание: название файла не должно содержать ничего кроме букв английского алфавита! Ни каких тире, пробелов, символа пробела, слешей и так далее!

Этот файл нужен для появления нового пункта в раскрывающемся списке поля  Тип пункта меню (см. главу 7). Далее пропишите в файле код:

<?xml version="1.0" encoding="utf-8"?>
<metadata>
   <layout title="Просмотр обращений">
      <message></message>
   </layout>

   <fields name="request">
      <fieldset name="request">
         <field name="task" default="adm_view_feedback"/>
      </fieldset>
   </fields>
</metadata>

Этот код похож на код уже имеющегося здесь же файла default.xml за исключением значений title (строка 3) и default (строка 8). Сохраните и закройте.

Далее откройте в меню административной панели Меню > Все пункты меню и нажмите кнопку  Создать . Введите название - "Просмотр обращений". В поле  Тип пункта меню   нажмите кнопку  Выбрать ;  в открывшемся списке выберите Feedback_form > Просмотр обращений

 В отличии от созданного ранее первого пункта, во втором пункте в адресе (ссылке) появится новая переменная layout, а значение переменной task будет указано как adm_view_feedback.

Теперь, независимо от выбранного варианта, настройте заполнение полей справа.

В поле Меню выставите значение MainMenu. В поле Родительский элемент замените значение Корневой пункт меню на название основного пункта, который открывает форму обратной связи: это позволит создать подпункт, который будет появляться только при наведении курсора на основной пункт.

В поле Доступ установите значение Special. Это значит, что данный пункт будет показан только тем группам пользователей, которые установлены для указанного уровня доступа. 

Нажмите  Сохранить и закрыть  и проверьте установки для данного уровня доступа. Для этого откройте в меню административной панели Пользователи > Уровни доступа, кликните в открывшейся таблице Special. У вас откроется схема "Группы пользователей, имеющие право доступа". Обратите внимание на важную особенность: группа Administrator скорее всего не будет отмечена (не будет выставлен чекбокс), но она всё равно получит доступ, так как наследует это от вышестоящего "родителя" - группы Manager. Если же у группы Manager не выставлен чекбокс, то поставьте его для Administrator.

Не забудьте сохранить внесённые изменения. 

Так же не забудьте проверить свою группу пользователей и при необходимости выставите Administrator.

Теперь откройте сайт, авторизуйтесь и наведите курсор на пункт "Обратная связь". Если всё сделано правильно, у вас внизу откроется созданный подпункт. 

 

Создание страницы для администрирования входящих обращений

Снова открываем файл tpl_adm_feedback.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.css');

Так как строка 16 подключает файл CSS, его необходимо создать в указанной в адресе папке (так же, как это было сделано в главе 8. Что бы не забыть, создайте файл сразу и скопируйте в него код:

/* АДМИНИСТРИРОВАНИЕ ОБРАЩЕНИЙ */
/* Subpackage: Components */
/* Copyright (C) 2019 */
.page_title {
   color: rgb(147,147,147);
   height: 38px;
   font-family: Georgia;
   font-size: 24pt;
   text-decoration: underline;
   font-style: italic;
   text-shadow: -1px -1px 0px rgb(97 96 96);
   margin: 10px 0 10px 40px;
   }
p.txt-info-stat-p {
   margin: 0 0 10px 20px;
   line-height: 17px;
   }
table.feedback_table {
   width: 100%;
   border: 4px ridge rgb(147,147,147);
   margin: 0 0 20px 0;
   }
td.MR1, td.MR2, td.MR3, td.MR4, td.MR5, td.MR6, td.MR7 {
   border-bottom: 4px ridge rgb(147,147,147);
   text-align: center;
   }
td.MR1 {width: 35px;}
td.MR2 {width: 130px;}
td.MR3 {width: 77px;}
td.MR4 {width: 90px;}
td.MR5 {width: 56px;}
td.MR7 {width: 40px;}
td.MR1_td, td.MR3_td, td.MR4_td, td.MR5_td, td.MR7_td {text-align: center;}
td.MR2_td, td.MR6_td {padding-left: 3px;}
td.MR2_td {text-align: center;}
p.cell_tab_2 {margin: 0;}

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

  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    }

Эта часть кода контролирует доступ к странице администрирования. Работает это так.

Метод JFactory::getUser() присваивает переменной $user  массив с данными пользователя (строка 18). Затем переменной $groups присваивается значение ключа 'groups', хранящего данные о принадлежности аккаунта пользователя той или иной группе. Так как это значение так де является массивом (пользователь может состоять в двух и более группах), то необходим его перебор (конструкция foreach, строка 20-22). В результате перебора переменной  $user_group будет присвоен последний из имеющихся (или единственный) ID группы*. Далее конструкция if в строке 23 проверит, имеет ли группа пользователя ID, равный 7**. Если нет, то функция  закроет доступ к странице и перебросит пользователя на главную страницу. Если вы хотите, можете создать простую страницу с каким-либо объявлением, типа "Доступ запрещён!" или "У Вас недостаточно прав для доступа к данной странице!" и так далее, и прописать её адрес в ('Location: /') вместо /. Команда exit в строке 25 прекращает выполнение кода страницы.

 * Именно поэтому всегда назначайте администратору только одну группу.

 ** Обязательно проверьте, какой ID имеет группа Administrator на вашем сайте и в случае необходимости пропишите вместо семёрки соответствующую цифру. Что бы проверить ID, откройте в административной панели  Пользователи > Группы и просмотрите значение в таблице.

  27    // ПОДКЛЮЧЕНИЕ К БАЗЕ ДАННЫХ И ПРОВЕРКА СОЕДИНЕНИЯ
  28    $dbJFactory::getDBO();
  29    if (!$db->connected()) {
  30         include(JPATH_COMPONENT .'/err/err_db.php');  
  31         exit;
  32    }
  33    // ПОЛУЧЕНИЕ НОМЕРА ПОСЛЕДНЕГО ОБРАЩЕНИЯ
  34    $db->setQuery("SELECT MAX(id) FROM #__feedback_form");
  35    $number_last_message = $db->loadResult();

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

Далее создаётся функция для получения данных:

  36    // ФУНКЦИЯ ПОЛУЧЕНИЯ ДАННЫХ
  37    function MakingRequestFeedback($number_last_message) {
  38       $dbJFactory::getDBO();
  39       $db->setQuery("SELECT * FROM #__feedback_form WHERE id = " . $number_last_message);
  40       $row = $db->loadRow();
  41       $name_author = $row[1];                    // --> автор обращения
  42       $type_message = $row[2];                  // --> тип обращения
  43       $text_message = $row[3];                  // --> текст обращения
  44       $image_1 = $row[4];                           // --> файл изображения 1
  45       $image_2 = $row[5];                           // --> файл изображения 2
  46       $image_3 = $row[6];                           // --> файл изображения 3
  47       $email_author = $row[7];                   // --> почта автора
  48       $ip_author = $row[8];                         // --> адрес автора
  49       $dat_mess = $row[9];                         // --> дата
  50       $tm_mess = $row[10];                        // --> время
  51       $status_mess = $row[11];                  // --> статус обращения
  52       $dtm = $dat_mess . " " . $tm_mess; // вывод даты и времени
  53       // Составление адресной строки
  54       $uri = JFactory::getURI();
  55       $protocol = $uri->toString(array('scheme'));
  56       $hc_host = $uri->toString(array('host'));
  57       $q_address = $protocol . $hc_host . "/index.php?option=com_feedback_form&task=feedback_view&mess_number=" . $number_last_message;
  58       // Return
  59       return array($q_address, $number_last_message, $name_author, $type_message, $text_message, $image_1,   $image_2, $image_3, $email_author, $ip_author, $status_mess, $dtm);
  60    }

Обратите внимание: несмотря на то, что в строке 28 база данных уже подключалась, внутри функции подключение должно  производиться отдельно, иначе функция не будет работать (строка 38).

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

Функция возвращает все созданные переменные в виде массива.

  61    // ВВЕДЕНИЕ МЕТАТАГОВ
  62       $doc->setTitle('Обращения пользователей');
  63       $doc->addCustomTag('<meta name="robots" content="noindex, nofollow" />');
  64    ?>  

  65   

Теперь пришло время создать элементы страницы - заголовок, информационный текст и таблицу. Все пояснения по коду смотрите в конце.

  66    <!-- ЗАГОЛОВОК СТРАНИЦЫ -->
  67       <div class='page_title'>Обращения пользователей</div>
  68       <div class='txt-info-stat'>
  69       <p class='txt-info-stat-p'>Статусы обращений:<br>
  70                                                      0 - обращение закрыто<br>
  71                                                      1 - новое обращение<br>
  72                                                      2 - в обработке</p>
  73       </div>
  74    <!-- ТАБЛИЦА -->
  75       <table class="feedback_table" border="1" table-layout='fixed' rules="all">
  76    <!-- "Шапка" таблицы -->
  77           <tr>
  78              <td class='MR1'></td>
  79              <td class='MR2'>Автор</td>
  80              <td class='MR3'> Дата </td>
  81              <td class='MR4'>Тема</td>
  82              <td class='MR5'>Статус</td>
  83              <td class='MR6'>Текст</td>
  84              <td class='MR7'>Фото</td>
  85           </tr>
  86      <?php
  87         $ttt_mr = 1; // Метка управления контролем вывода
  88    if ($number_last_message == NULL) {
  89    $number_last_message = 0;
  90    }
  91         while($ttt_mr==1) {
  92            $Rec_Feedback = MakingRequestFeedback($number_last_message);
  93            $text_sbstr = mb_substr($Rec_Feedback[4], 0, 100);
  94            $text_sbstr = $text_sbstr . '...';
  95            $img_label = '+';
  96            if ($Rec_Feedback[5]==NULL) {
  97               if ($Rec_Feedback[6]==NULL) {
  98                  if ($Rec_Feedback[7]==NULL) {
  99                      $img_label = '---';
 100                 }
 101              }
 102          }
 103     ?>
 104     <tr>                             <!-- Ячейки таблицы -->
 105     <td class='MR1_td'>
 106         <span class='cell_tab_1'><?php echo $Rec_Feedback[1]; ?></span>
 107     </td>
 108      <td class='MR2_td'>
 109         <span class='cell_tab_1'><?php echo $Rec_Feedback[2]; ?></span>
 110     </td>
 111     <td class='MR3_td'>
 112         <span class='cell_tab_3'><?php echo $Rec_Feedback[11]; ?></span>
 113     </td>
 114     <td class='MR4_td'>
 115         <p class='cell_tab_2'>
 116        <a href=<?php echo $Rec_Feedback[0]; ?>><?php echo $Rec_Feedback[3]; ?></a>
 117   </p>
 118   </td>
 119   <td class='MR5_td'>
 120   <span class='cell_tab_4'><?php echo $Rec_Feedback[10]; ?></span>
 121   </td>
 122   <td class='MR6_td'>
 123   <span class='cell_tab_1'><?php echo $text_sbstr; ?></span>
 124   </td>
 125   <td class='MR7_td'>
 126   <span class='cell_tab_1'><?php echo $img_label; ?></span>
 127   </td>
 128   </tr>
 129   <?php
 130   if($number_last_message <= 1) { // если номер рецепта <= 1, то
 131      $ttt_mr = 0;                         // окончание цикла;
 132   } else {                                              // если нет, то
 133      --$number_last_message; // уменьшение значения на единицу и новый цикл
 134      }
 135   }       // закрывающая скобка цикла while
 136   ?>
 137   </table>
 138    <p class="info_table">Для просмотра полного текста сообщения и изображений перейдите по ссылке в колонке "Тема"</p>

В начале страницы, как обычно, идёт заголовок (строки 66-68). Ниже идёт небольшой текст с напоминанием о статусах обращений (строки 69-73).

Далее создаётся таблица. Строка 75 указывает браузеру, что толщина рамки составляет 1px (но не забывайте, что свои коррективы внесёт таблица CSS), что ширина колонок определяется по первой строке, которую создают строки 76-85,  а так же то, что каждая ячейка должна иметь свои очерченные границы.

В 87 строке создаётся метка управления выводом (созданием) строк. Смысл метки прост: пока она равна 1, строка создаётся, как только метка приобретает значение 0, цикл прекращается. 

В строках 88-90 конструкция if вводит в переменную $number_last_message цифру 0 в случае отсутствия строк в таблице (отсутствия обращений).

Цикл создания строк запускается в 91 строке.

Вначале каждого цикла функция MakingRequestFeedback получает входящее значение через переменную $number_last_message и присваивает переменной $Rec_Feedback возвращаемый массив (строка 92). Далее переменная $text_sbstr получает обработанный текст обращения (обрезается до 100 символов, на конце выставляется троеточие, строки 93-94), переменная $img_label получает значение в виде символа + (строка 95). В следующих строках (96-102) проверяется, есть ли в обращении загруженные изображения; если нет, то значение данной переменной меняется на ---.

Строки 104-128 создают очередную строку; при этом в каждую ячейку записываются полученные данные. Дополнительно четвёртая ячейка получает ссылку, перейдя по которой администратор сможет прочитать полное сообщение и просмотреть изображения (строки 114-118).

Строки 130-134 проверяют номер текущей строки (переменная $number_last_message); если значение больше 1, то это число уменьшается на единицу и начинается новый цикл (строка 133); если число меньше или равно единице, метка получает значение 0 и цикл останавливается (строка 131).

-------

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

 

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