Переопределение методов core.js

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО InstantCMS 2.X
#1 6 декабря 2020 в 14:44
Добрый день. Подскажите как правильно переопределить метод icms.forms.initFilterForm ядра core.js? Чтобы не вносить правки в скрипты движка.
#2 6 декабря 2020 в 15:43
Максим, создайте свой core, например, core2.js
Подключите его в main.tpl.php шаблона modern или дочернего.

Заменив

  1.  
  2. <?php $this->addMainTplJSName('core'); ?>
  3.  
на

  1.  
  2. <?php $this->addMainTplJSName(['core','core2']); ?>
  3.  
Оставьте там только содержимое нужного вам метода.


  1.  
  2. var icms = icms || {};
  3.  
  4.  
  5. icms.forms = (function ($) {
  6.  
  7. this.initFilterForm = function(selector){
  8.  
  9. var form = $(selector);
  10.  
  11. var filter_panel = $(form).closest('.icms-filter-panel');
  12.  
  13. var filter_link_open = $(filter_panel).find('.icms-filter-link__open');
  14. var filter_link_close = $(filter_panel).find('.icms-filter-link__close');
  15.  
  16. $(filter_link_open).on('click', function (){
  17. $(this).addClass('d-none');
  18. $(filter_panel).find('.icms-filter-container').removeClass('d-none');
  19. return false;
  20. });
  21. $(filter_link_close).on('click', function (){
  22. $(filter_panel).find('.icms-filter-container').addClass('d-none');
  23. $(filter_link_open).removeClass('d-none');
  24. return false;
  25. });
  26.  
  27. var change = function (){
  28.  
  29. var sbutton = $(form).find('.buttons button[type = submit]');
  30.  
  31. $(sbutton).prop('disabled', true).addClass('is-busy');
  32.  
  33. var o = _this.getFilterFormParams(form);
  34. var submit_uri;
  35.  
  36. if(Object.keys(o).length > 0 || $(form).find('.cancel_filter_link').length === 0){
  37. submit_uri = $(form).attr('action');
  38. } else {
  39. submit_uri = $(form).find('.cancel_filter_link').attr('href');
  40. }
  41.  
  42. o.show_count = 1;
  43.  
  44. var query_string = $.param(o);
  45.  
  46. $.get(submit_uri+'?'+query_string, function(result){
  47. if(result.filter_link){
  48. $(form).data('filter_link', result.filter_link);
  49. } else {
  50. $(form).removeData('filter_link');
  51. }
  52. setTimeout(function (){
  53. $(sbutton).removeClass('is-busy').val(result.hint).prop('disabled', false).find('span').text(result.hint);
  54. }, 200);
  55. icms.events.run('icms_content_filter_changed', form);
  56. }, 'json');
  57.  
  58. };
  59.  
  60. var delay = function () {
  61. var timer = 0;
  62. return function () {
  63. var context = this, args = arguments;
  64. clearTimeout(timer);
  65. timer = setTimeout(function () {
  66. change.apply(context, args);
  67. }, 500);
  68. };
  69. };
  70.  
  71. $(form).find('select, input[type=checkbox]').on('change', change);
  72. $(form).find('input:not([type=checkbox]), textarea').on('input', delay());
  73.  
  74. $(form).find('.buttons button[type = submit]').on('click', function (){
  75.  
  76. var filter_link = $(form).data('filter_link');
  77.  
  78. if(filter_link){
  79. window.location.href = filter_link;
  80. return false;
  81. }
  82.  
  83. var submit_uri = $(form).attr('action');
  84.  
  85. var o = _this.getFilterFormParams(form);
  86.  
  87. var query_string = $.param(o);
  88.  
  89. if(query_string.length > 0){
  90. window.location.href = submit_uri+'?'+query_string;
  91. } else {
  92.  
  93. var cancel_filter_link = $(form).find('.cancel_filter_link').attr('href');
  94.  
  95. if(!cancel_filter_link){
  96. cancel_filter_link = submit_uri;
  97. }
  98.  
  99. window.location.href = cancel_filter_link;
  100. }
  101.  
  102. return false;
  103.  
  104. });
  105.  
  106. };
  107.  
  108. return this;
  109.  
  110. }).call(icms.forms || {},jQuery);
  111.  
Меняйте его. Например, добавив в метод initFilterForm

  1.  
  2. console.log('Yo');
  3.  
Откроем страницу с фильтром, и увидим в консоли



Все, метод выполняется из вашего core2.js
Можете убедиться, модифицировав метод в core.js тем же console.log, но с другим текстом. Оно не будет выведено.

Не забывайте после изменений увеличивать счетчик во вкладке Интерфейс Настроек сайта, чтобы браузер грузил ваши измененные файлы, а не из кеша.
#3 6 декабря 2020 в 17:23
Zau4man, спасибо что откликнулись. Но я таким способом уже делал, в итоге в консоли выводит ошибку:

core2.js?1588336299:32 Uncaught ReferenceError: _this is not defined
at HTMLInputElement.change (core2.js?1588336299:32)
at HTMLInputElement.dispatch (jquery.js?1588336299:3)
at HTMLInputElement.r.handle (jquery.js?1588336299:3)

У меня версия v2.13.1, дефолтный шаблон.

Получилось добиться нормальной работы только путем добавления всех методов и свойств, а не только нужного для модификации
  1.  
  2. icms.forms = (function ($) {
  3.  
  4. Полностью все методы и свойства
  5.  
  6. }).call(icms.forms || {},jQuery);
  7.  
#4 6 декабря 2020 в 17:44
Максим, в своём файле js, который должен загрузиться позже основного напишите:

  1. icms.forms.initFilterForm = function(selector){
  2. // тут пишите что хотите
  3. };
#5 6 декабря 2020 в 18:09
Fuze, так тоже пробовал. Если этот метод оставить без изменений, то ошибка та же, ругается на свойство _this.
#6 6 декабря 2020 в 18:15

Если этот метод оставить без изменений, то ошибка та же, ругается на свойство _this.

Максим
Замените _this в методе на icms.forms
#7 6 декабря 2020 в 18:23
Fuze, большое спасибо. Все заработало.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.