view_list Формы
Необходимо инициализировать, чтобы добавились скрипты и стили. Этот код возможно разместить в template.php
, но при включении кеширования в родительском компоненте этот код не будет работать.
- component_epilog.php
// `window` добавляет показ `BX.CDialog`, `admin` - стили кнопок и предупреждений CJSCore::Init(array('window', 'admin')); // Или // CUtil::InitJSCore(array('window', 'admin'));
- report.php
<?php define("NO_KEEP_STATISTIC", true); define("NOT_CHECK_PERMISSIONS", true); // подключаем пролог require($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php'); class CatalogReportAjaxComponent { protected $data; public function run() { try { $resp = array(); $this->getData(); $this->notify(); $resp['result'] = 'success'; } catch (Exception $e) { $resp['error'] = $e->getMessage(); http_response_code(500); } // JSON заголовок header('Content-Type: application/json; charset=utf-8'); header('Expires: 0'); die(json_encode($resp)); } protected function notify() { $email = 'webmaster@site.ru'; $mailSubject = 'Ошибка в описании товара'; $msg = nl2br($this->data['msg']); $mailBody = <<<HEREDOC <p> Страница: <a href="{$this->data['uri']}">{$this->data['title']}</a> </p> <p> Сообщение об ошибке: </p> <p> $msg </p> HEREDOC ; $arFields = array( 'EMAIL_TO' => $email, 'SUBJECT' => $mailSubject, 'MESSAGE' => $mailBody ); // Универсальное почтовое событие CEvent::SendImmediate('CUSTOM_MAIL_EVENT_HTML', 'ru', $arFields, "N"); } protected function getData() { $this->data = filter_input_array(INPUT_POST, array( 'uri' => FILTER_SANITIZE_URL, 'title' => FILTER_SANITIZE_STRING, 'msg' => FILTER_SANITIZE_STRING )); } } $c = new CatalogReportAjaxComponent; $c->run();
- template.php
<div class="js-catalog-report btn">Сообщить об ошибке</div>
- script.js
// Если используется переход без перезагрузки страницы, чтобы код не выполнялся дважды if(!catReportDialog) { var catReportDialog; } $(document).ready(function(){ "use strict"; var params; // catReportDialog возможно также получить через `BX.WindowManager.Get()` // `SetButtons()` кнопки добавляются без удаления существующих, поэтому: function showButtons() { catReportDialog.ClearButtons(); catReportDialog.SetButtons(buttons); // снова показываем кнопки } // определяем кнопки var buttons = [ { title: 'Отправить', id: 'save', className: 'adm-btn-save', // действие при нажатии action: function () { // скрываем кнопки, чтобы не уберечься от множественного нажатия catReportDialog.ClearButtons(); var data = { uri: window.location.href, title: $('title').text().trim(), msg: catReportDialog.GetForm()['msg'].value }; // Проверки на стороне клиента if(data.msg.length < 5) { catReportDialog.ShowError('Введите описание ошибки'); showButtons(); // снова показываем кнопки return; } catReportDialog.Notify('Отправка сообщения ...'); $.ajax({ type: "POST", url: "/bitrix/components/app/prodcat.catalog.detail/report.php", data: data, // успешная отправка, для jQuery 1.8+ использовать `done` success: function(resp){ if('success' === resp.result) { catReportDialog.GetForm()['msg'].value = ''; // очищаем форму catReportDialog.Close(); return; } // данные не прошли серверную валидацию if(resp.error) { catReportDialog.ShowError(resp.error); } else { catReportDialog.ShowError("Произошла ошибка сервера"); } showButtons(); }, // возникла серверная ошибка, для jQuery 1.8+ использовать `fail` error: function(err, data) { if(data.error) { catReportDialog.ShowError(data.error); } else { // Возможно использовать err.responseText в качестве уведомления, но осторожно: может содержать HTML catReportDialog.ShowError("Произошла ошибка сервера"); } }, // Для jQuery 1.8+ использовать `always` complete: function() { showButtons(); } }); } }, BX.CDialog.prototype.btnCancel ]; // Таким способом вешаем обработчик на кнопку, даже если она начала существовать после выполнения скрипта // Полезно при AJAX перезагрузке страницы $('body').on('click', '.js-catalog-report', function(e){ e.stopPropagation(); e.preventDefault(); var content = '<form class="app-prodcat-report"><p>Описание ошибки</p><textarea name="msg"></textarea></form>'; var head = '<div class="dialog-head-lim"><b>Сообщить об ошибке на странице</b> ' + window.location.href + '</div>'; // Попап еще не существует if(!catReportDialog) { params = { width: 600, height: 300, resizable: false, title: 'Сообщить об ошибке', head: head, content: content, buttons: buttons }; catReportDialog = new BX.CDialog(params); catReportDialog.Show(); } else { // повторный показ попапа catReportDialog.hideNotify(); // прячем сообщения с прошлого раза, если они есть showButtons(); // показываем кнопки catReportDialog.SetHead(head); // если компонент использует AJAX, переопределяем заголовок // catReportDialog.SetContent(content); // использовать при необходимости пересоздать форму catReportDialog.Show(); // показываем диалог } }); });
- style.css
.app-prodcat-report textarea { resize: none; width: 100%; height: 120px; box-sizing: border-box; }
добавить описание
Authorize ClearButtons GetContent GetForm GetInnerPos GetParameters GetRealForm Notify PostParameters Resize SetButtons SetContent SetHead SetIcon SetIconFile SetSize SetTitle Show ShowButtons ShowError Submit SwapContent adjustPos adjustSize adjustSizeEx btnCancel hideNotify setAutosave showWait