Пришло время написать форму для редактора и администратора, которые смогут вводить ответы на заданные посетителями вопросы. Начнем это делать с создания в разделе /contacts/qa/admin/ (у Вас возможно другой) индексного файла index.php. Будем действовать по следущему сценарию:
- Создаем форму отправки
- Определяем метод REQUEST_METHOD из глобальной переменной $_SERVER
Если метод GET
Если метод POST
Если определенный метож оказался методом пост то значит это редактор/администратор отправил данные из формы ответа. В этом случае необходимо так же проверить идентификатор результата и обновить его, записав в поле our_answer отправленный текст.
Приступим!
Пишем админку для редактора в системе «Вопрос-Ответ»
Если Вы уже в тестовом режиме заполняли форму для посетителя, то на указанный в почтовом шаблоне адрес должно было прийти письмо со ссылкой на редактирование ответа результата веб-формы, а именно:
1 |
http://#SERVER_NAME#/contacts/qa/admin/?RESULT_ID=#RS_RESULT_ID# |
Таким образом, в на страницу index.php будет передан RESULT_ID (идентификатор результата заполнения веб-формы), причем он будет передан методом GET, однако при переходе по этой ссылке изначально должно открыться окно авторизации с кнопкой Войти, а форма при нажатии будет осуществлять передачу значений в ядро битрикс методом POST, а ссылка останется прежнего вида значит необходимо переопределить метод POST на метод GET, в коде я это прокомментирую.
Теперь создадим простую форму с одним полем вида TEXTAREA, скрытым полем с идентификатором результата заполнения веб-формы и кнопкой Отправить. Код формы будет выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 10 |
<form name="ANSWER_FORM" action="<?=$QA["PATH"]?>admin/" method="POST" enctype="multipart/form-data"> <h2 style="text-align: center; ">Дать ответ на вопрос № <?=$RESULT_ID;?></h2> <input type="hidden" name="RESULT_ID" value="<?=$RESULT_ID;?>"> <table cellspacing="5" cellpadding="0" border="0" align="center" width="95%" class="data-table"> <tbody> <tr><td width="20%">Ответ:<font color="red"><span class="form-required starrequired">*</span></font></td><td><textarea name="our_answer" cols="0" rows="5" class="inputtextarea"><?echo $answer;?></textarea></td></tr> <tr><td align="right" colspan="2"><input type="submit" name="web_form_submit" value="Отправить" /></td></tr> </tbody> </table> </form> |
Из кода видно, что в параметр action у нас подставляется путь к папке с административной частью, то есть прямо к файлу где эта форма и расположена, то есть значения из формы будут передаваться на эту же страницу. В скрытое поле RESULT_ID передается полученная ранее методом GET переменная =$RESULT_ID;?>, в теге TEXTAREA размещен ранее полученный код ответа, для того, чтобы при входе под администратором для изменения ответа, ранее введенного редактором, не надо было заново набирать ответ а просто исправить его.
В качестве WYSIWYG редактора я использовал TinyMCE. Установка его очень проста. Необходимо в файлах шаблона(лежит в bitrix/templates/ваш шабло/), там где формируется head страницы я добавил следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<? //Если текущая директория это директория админки системы вопрос-ответ то подключать скрипт WYSIWYG редактора с инициализацией и обработкой тега textarea if($APPLICATION-&gt;GetCurDir() == &quot;/contacts/qa/admin/&quot;) { ?> <script type='text/javascript&quot; src=&quot;&lt;?=SITE_TEMPLATE_PATH?&gt;/tinymce/jscripts/tiny_mce/tiny_mce.js"></script> <script type="text/javascript"> tinyMCE.init({ mode : "textareas";, theme : "advanced"; }); </script> <? }; ?> |
ВСЕ! Больше ничего для работы WYSIWYG редактора не надо. не страшно, правда ли, зато теперь мы сможем писать ответы с красивым оформлением, используя весь арсенал форматирования HTML.
А теперь самое интересное — код который выполняет при открытии страницы админки и после нажатия кнопки отправить. Код постараюсь в меру подробно комментировать.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 |
<? //Подключаем хеадер битрикса как обычно require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php"); //Подключаем наш конфиг файл require($_SERVER["DOCUMENT_ROOT"]."/contacts/qa/config.php"); //Устанавливаем Title $APPLICATION->SetTitle("Дать ответ на вопрос посетителя"); ?><? //Специальная функция для проверки корректности идентификатора результата веб-формы function check_id($id) { $flag=true; if (preg_match("/^[0-9]{1,10}$/", $id)) {} else {$flag = false;} return $flag; } //вспомогательные переменные которые могут понадобится для вывода диагностических ошибок $error_type = 0; $error = false; $error_text = ""; //Получаем массив содержащий группы пользователей, которым принадлежит текущий пользователь(вмассив попадают идентификаторы групп) $arGroups = $USER->GetUserGroupArray(); //Переменная ЭТО_РЕДАКТОР по умолчанию ЛОЖЬ $this_answer_editor = false; //Переменная ЭТО_АДМИН по умолчанию ЛОЖЬ $this_admin = false; //Если в массиве с группами пользователей имеется группа администраторов то ЭТО АДМИН И РЕДАКТОР if (in_array($QA["ID_ADMIN"], $arGroups )) { $this_answer_editor = true; $this_admin = true; } //Иначе если группа редакторов имеется в группах которым принадлежит текущий пользователь то это РЕДАКТОР elseif(in_array($QA["ID_MODERATOR"], $arGroups )) { $this_answer_editor = true; } //Очень важный код который преобразует метод POST в GET если сюда попали со страницы ввода пароля при авторизации (упоминалось об этом в статье Части 6) а так же на всякий случай //проверяем идентификатор результата веб-формы на наличие этой переменной, ее корректности и не пустоты if(isset($_GET["RESULT_ID"]) && !empty($_GET["RESULT_ID"]) && check_id($_GET["RESULT_ID"])) { $_SERVER["REQUEST_METHOD"]="GET"; } //Подключаем модуль веб-форм CModule::IncludeModule("form"); //Код который выполняем если метод GET if($_SERVER["REQUEST_METHOD"]=="GET") { //Проверка корректности ИД результата веб формы if(isset($_GET["RESULT_ID"]) && !empty($_GET["RESULT_ID"]) && check_id($_GET["RESULT_ID"])) { //Получаем данные результата, если данных нет то просто выводим ошибку о том что нет такого вопроса $arAnswer = CFormResult::GetDataByID($_GET["RESULT_ID"],array(),$arResult); if($arAnswer != 0) { //Проверяем переменную ACTION которую могут вручную забить в строку по случайности или специально if(isset($_GET["ACTION"]) && $_GET["ACTION"]=="DELETE" && $this_admin) { //Если ACTIO=DELETE то удаляем результат веб-формы в идентификатором RESULT_ID и если это АДМИН то удаляем результат веб-формы if (CFormResult::Delete($RESULT_ID)) { echo "Результат # ".$RESULT_ID." успешно удален."; $error = true; $error_text = $error_text."<br>"."Вопрос удален!"; } else // ошибка { global $strError; echo $strError; } } else { //Если переменная ACTION не используется значит страницу пытается открыть РЕДАКТОР //Проверяем статус результата веб-формы. Если РЕДАКТОР уже отвечал на вопрос, то значит статус будет ОТВЕТ и мы не даем РЕДАКТОРУ отвечать заново //иначе получаем необходимые для вывод данные if($arResult["STATUS_ID"] == $QA["ID_STATUS_A"] && !($this_admin)) { $error = true; $error_text = $error_text."<br>"."На данный вопрос уже дан ответ. Если необходимо его изменить обратитесь к администратору сайта."; } else { //Для удобства все записываем в переменные //Получаем значение даты создания $user_date = $arResult["DATE_CREATE"]; //Получаем значение Имени задающего вопрос посетителя $user_name = $arAnswer["client_name"][0]["USER_TEXT"]; //Сам вопрос $question = $arAnswer["client_text"][0]["USER_TEXT"]; //Ответ, если есть то получаем его в переменную $answer = $arAnswer["our_answer"][0]["USER_TEXT"]; //Теперь выведем полученные данные в таблицу, чтобы понимать на какой вопрос необходимо ответить ?> <table cellspacing="2" cellpadding="0" border="0" align="center" width="95%" class="<?=(($i/2)==floor($i/2)) ? "data-table" : "data-table-2"?>"> <tr><td width="20%" colspan="2"><b><?=substr($user_date,0,10)." ";?></b><?=$user_name?></td></tr> <tr><td width="20%"><b>Вопрос посетителя:</b></td><td width="80%"><?=$question;?></td></tr> <tr><td width="20%"><b>Ответ техцентра:</b></td><td width="80%"><?=$answer;?></td></tr> </tbody> </table> <? } } } else { $error = true; $error_text = $error_text."<br>"."Не найден вопрос с таким идентификатором"; } } else { $error = true; $error_text += "<br>"."Неверный идентификатор вопроса."; } //Если ошибок нет то получаем ИД резульатат веб-формы и подставляем в скрыты поля веб формы if ($error) { echo $error_text; } else { $RESULT_ID = $_GET['RESULT_ID']; //Таким образом мы использовали метод GET для получения данных результата веб-формы и вывели информацию о вопросе на страницу совместно с формой ответа. ?> <form name="ANSWER_FORM" action="<?=$QA["PATH"]?>admin/" method="POST" enctype="multipart/form-data"> <h2 style="text-align: center; ">Дать ответ на вопрос № <?=$RESULT_ID;?></h2> <input type="hidden" name="RESULT_ID" value="<?=$RESULT_ID;?>"> <table cellspacing="5" cellpadding="0" border="0" align="center" width="95%" class="data-table"> <tbody> <tr><td width="20%">Ответ:<font color="red"><span class="form-required starrequired">*</span></font></td><td><textarea name="our_answer" cols="0" rows="5" class="inputtextarea"><?=$answer;?></textarea></td></tr> <tr><td align="right" colspan="2"><input type="submit" name="web_form_submit" value="Отправить" /></td></tr> </tbody> </table> </form> <? } } //метот POST у нас происходит после того как РЕДАКТОР нажал на кнопку отправить //Если все было заполненно верно то в метод POST будет передана переменная RESULT_ID из скрытого поля формы и our_answer из TEXTAREA elseif($_SERVER["REQUEST_METHOD"]=="POST") { //Как обычно проверяем идентификатор результата веб-формы на коректность if(isset($_POST["RESULT_ID"]) && !empty($_POST["RESULT_ID"]) && check_id($_POST["RESULT_ID"])) { //Проверяем наличие результата веб-формы с заданым RESULT_ID $arAnswer = CFormResult::GetDataByID($_POST["RESULT_ID"],array(),$arResult); if($arAnswer != 0) { //Проверяем на всякий случай заполненность поля our_answer (наш ответ)) if(isset($_POST["our_answer"]) && !empty($_POST["our_answer"])) { //Обновляем поле наш ответ у результата веб-формы с id=RESULT_ID $RESULT_ID = $_POST['RESULT_ID']; $FIELD_SID = "our_answer"; // символьный идентификатор вопроса CFormResult::SetField($RESULT_ID, $FIELD_SID, $_POST["our_answer"]); //обновляем статус веб формы на ОТВЕТ $STATUS_ID = $QA["ID_STATUS_A"]; // ID статуса "Опубликовано" CFormResult::SetStatus($RESULT_ID, $STATUS_ID); //выводим сообщение об успешной отправке echo "Ответ успешно размещен."; } else { $error = true; $error_text = $error_text."<br>"."Не заполнено поле ответа"; } } else { $error = true; $error_text = $error_text."<br>"."Не найден вопрос с таким идентификатором"; } } else { $error_type = 1; $error = true; $error_text = $error_text."<br>"."Неверный идентификатор вопроса."; } //Если ошибка то выводим текст ошибки if ($error) { //Если ошибка в методе POST то форму заново не выводим, пусть РЕДАКТОР открое ссылку заново с методом GET echo $error_text; if($error_type != 1) { $RESULT_ID = $_POST['RESULT_ID']; ?> <form name="ANSWER_FORM" action="<?=$QA["PATH"]?>admin/" method="POST" enctype="multipart/form-data"> <h2 style="text-align: center; ">Дать ответ на вопрос № <?=$RESULT_ID;?></h2> <input type="hidden" name="RESULT_ID" value="<?=$RESULT_ID;?>"> <table cellspacing="5" cellpadding="0" border="0" align="center" width="95%" class="data-table"> <tbody> <tr><td width="20%">Ответ:<font color="red"><span class="form-required starrequired">*</span></font></td><td><textarea name="our_answer" cols="0" rows="5" class="inputtextarea"><?=$_POST['our_answer'];?></textarea></td></tr> <tr><td align="right" colspan="2"><input type="submit" name="web_form_submit" value="Отправить" /></td></tr> </tbody> </table> </form> <? } } } //Выводим ссылку на список вопросов с овтетами то есть корень нашей системы Вопрос-Ответ. ?> <br> <a href="<?=$QA["PATH"]?>" >Перейти к списку вопросов.</a> <?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?> |
Вот и все. система готова к испытаниям и использованию. Надеюсь статьи оказались полезны для Вас. Если возникнут вопросы, с радостью отвечу на них. Желаю удачи.
Начало: Система «Вопрос-Ответ» на основе модуля «Веб-формы» CMS 1C-Bitrix»
Выложите пожалуйста код php страницы index.php — здесь не пойму ничего