Wiki Bitrix

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;
}

FIXME добавить описание

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

Ссылки