modal.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. <?
  2. $showFooter = false;
  3. if ($_REQUEST['ajax_mode'] == 'Y') {
  4. require $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php";
  5. if ($USER->GetID()) {
  6. $APPLICATION->IncludeComponent("bitrix:system.auth.form", "", Array());
  7. echo '<br>Вы авторизовались, обновление страницы...';
  8. echo '<script>setTimeout(function(){ location.reload(); }, 3000);</script>';
  9. } else {
  10. $APPLICATION->AuthForm('', false, false);
  11. }
  12. die;
  13. } elseif (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) {
  14. require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
  15. $APPLICATION->SetTitle("Авторизация");
  16. $showFooter = true;
  17. }
  18. CJSCore::Init(["popup", "jquery"]);
  19. // https://habr.com/ru/sandbox/103916/ - Основа скрипта
  20. // https://dev.1c-bitrix.ru/community/webdev/user/64008/blog/5942/ - BX.PopupWindow
  21. // http://realty.lyrmin.ru/bitrix/js/main/core/core_popup.js - BX.PopupWindowManager, onAfterPopupShow
  22. // https://dev.1c-bitrix.ru/api_help/js_lib/ajax/bx_ajax.php - BX.ajax
  23. // http://realty.lyrmin.ru/bitrix/js/main/core/core_ajax.js - BX.ajax.prepareForm
  24. // https://dev.1c-bitrix.ru/api_help/main/reference/cmain/authform.php - $APPLICATION->AuthForm
  25. ?>
  26. <?if ($USER->IsAuthorized()):?>
  27. <a href="<?=$APPLICATION->GetCurPage()?>?logout=yes" rel="nofollow"><b>Выход</b></a>
  28. <?else:?>
  29. <?$jsAuthVariable = \Bitrix\Main\Security\Random::getString(20)?>
  30. <a href="#" onclick="<?=$jsAuthVariable?>.showPopup('/auth/')" rel="nofollow"><b>Авторизация</b></a>
  31. <script>
  32. let <?=$jsAuthVariable?> = {
  33. id: "modal_auth",
  34. popup: null,
  35. /**
  36. * 1. Обработка ссылок в форме модального окна для добавления в ссылку события onclick и выполнения
  37. * перехода по ссылке через запрос новой формы через AJAX
  38. * 2. Установка на форму обработчика onsubmit вместо стандартного перехода
  39. */
  40. convertLinks: function() {
  41. let links = $("#" + this.id + " a");
  42. links.each(function (i) {
  43. $(this).attr('onclick', "<?=$jsAuthVariable?>.set('" + $(this).attr('href') + "')");
  44. });
  45. links.attr('href', '#');
  46. let form = $("#" + this.id + " form");
  47. form.attr('onsubmit', "<?=$jsAuthVariable?>.submit('" + form.attr('action') + "');return false;");
  48. },
  49. /**
  50. * Вывод модального окна с формой на странице при клике по ссылке
  51. * @param url - url с параметрами для определения какую форму показать
  52. */
  53. showPopup: function(url) {
  54. let app = this;
  55. this.popup = BX.PopupWindowManager.create(this.id, '', {
  56. closeIcon: true,
  57. autoHide: true,
  58. draggable: {
  59. restrict: true
  60. },
  61. closeByEsc: true,
  62. content: this.getForm(url),
  63. overlay: {
  64. backgroundColor: 'black',
  65. opacity: '20'
  66. },
  67. events: {
  68. onPopupClose: function(PopupWindow) {
  69. PopupWindow.destroy(); //удаление из DOM-дерева после закрытия
  70. },
  71. onAfterPopupShow: function (PopupWindow) {
  72. app.convertLinks();
  73. }
  74. }
  75. });
  76. this.popup.show();
  77. },
  78. /**
  79. * Получение формы при открытии модального окна или при переходе по ссылке
  80. * @param url - url с параметрами для определения какую форму показать
  81. * @returns string - html код формы
  82. */
  83. getForm: function(url) {
  84. let content = null;
  85. url += (url.includes("?") ? '&' : '?') + 'ajax_mode=Y';
  86. BX.ajax({
  87. url: url,
  88. method: 'GET',
  89. dataType: 'html',
  90. async: false,
  91. preparePost: false,
  92. start: true,
  93. processData: false, // Ошибка при переходе по ссылкам в форме
  94. skipAuthCheck: true,
  95. onsuccess: function(data) {
  96. let html = BX.processHTML(data);
  97. content = html.HTML;
  98. },
  99. onfailure: function(html, e) {
  100. console.error('getForm onfailure html', html, e, this);
  101. }
  102. });
  103. return content;
  104. },
  105. /**
  106. * Получение формы при переходе по ссылке и вывод её в модальном окне
  107. * @param url - url с параметрами ссылки
  108. */
  109. set: function(url) {
  110. let form = this.getForm(url);
  111. this.popup.setContent(form);
  112. this.popup.adjustPosition();
  113. this.convertLinks();
  114. },
  115. /**
  116. * Отправка данных формы и получение новой формы в ответе
  117. * @param url - url с параметрами ссылки
  118. */
  119. submit: function(url) {
  120. let app = this;
  121. let form = document.querySelector("#" + this.id + " form");
  122. let data = BX.ajax.prepareForm(form).data;
  123. data.ajax_mode = 'Y';
  124. BX.ajax({
  125. url: url,
  126. data: data,
  127. method: 'POST',
  128. preparePost: true,
  129. dataType: 'html',
  130. async: false,
  131. start: true,
  132. processData: true,
  133. skipAuthCheck: true,
  134. onsuccess: function(data) {
  135. let html = BX.processHTML(data);
  136. app.popup.setContent(html.HTML);
  137. app.convertLinks();
  138. },
  139. onfailure: function(html, e) {
  140. console.error('getForm onfailure html', html, e, this);
  141. }
  142. });
  143. }
  144. };
  145. </script>
  146. <?endif?>
  147. <?if ($showFooter) require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>