Подмена команд удаления своим обработчиком

Не подскажете, как идеологически правильно подменить обработчик удаления записи?
Создан замещающий модуль раздела Контрагенты, нужно выполнить определенную логику при удалении, и возможно отменить удаление.
И с учетом того, что удаление происходит:
- либо после выбора записи и нажатии кнопки Удалить
- либо в режиме выбора нескольких записей и выбора действия Удалить

Нравится

6 комментариев

Валерий, Вам необходимо в замещающем модуле страницы раздела [Контрагенты] переопределить функцию OnDelete.
Пример кода:

var baseOnDelete = this.methods.OnDelete;
this.methods.OnDelete = function() {
 //Ваша проверка
            if (Ext.isFunction(baseOnDelete)) {
                baseOnDelete.call(this);
            }
 
        };

Наталья, не работает...
Вот полный код замещающего модуля: (раздел Лиды, но думаю это не принципиально)

define('LeadSection', ['Lead', 'sandbox', 'LeadSectionStructure', 'LeadSectionResources', 'MaskHelper'],
	function(Lead, sandbox, structure, resources, MaskHelper) {
		structure.userCode = function() {
			// deleting
			var baseOnDelete = this.methods.OnDelete;
			this.methods.OnDelete = function() {
				alert('my check');
				if (Ext.isFunction(baseOnDelete)) {
					baseOnDelete.call(this);
				}
			};
		};
		return structure;
	});

Сообщение не выводится, запись удаляется... Если закомментировать, запись тоже удаляется:

define('LeadSection', ['Lead', 'sandbox', 'LeadSectionStructure', 'LeadSectionResources', 'MaskHelper'],
	function(Lead, sandbox, structure, resources, MaskHelper) {
		structure.userCode = function() {
			// deleting
			var baseOnDelete = this.methods.OnDelete;
			this.methods.OnDelete = function() {
				//alert('my check');
				//if (Ext.isFunction(baseOnDelete)) {
				//	baseOnDelete.call(this);
				//}
			};
		};
		return structure;
	});

Валерий, попробуйте так:

define('LeadSection', ['Lead', 'sandbox', 'LeadSectionStructure', 'LeadSectionResources', 'MaskHelper'],
        function(Lead, sandbox, structure, resources, MaskHelper) {
                structure.userCode = function() {
                        // deleting
			var baseInitViewModel = this.methods.initViewModel;
			this.methods.initViewModel = function() {
			baseInitViewModel.call(this);
			var baseOnDelete = this.onDelete;
			this.onDelete = function() {
                            alert('my check');
			    baseOnDelete.call(this);
			 }
			};
 
                };
                return structure;
        });

Наталия, спасибо, работает!

Но только в режиме выбора одной записи... Если переключиться в режим выбора нескольких записей, пометить их и выбрать действие "Удалить" - этот обработчик не работает.
Как в таком случае быть? Переопределять действие "Удалить", видимо...

Валерий, во втором случае нужно переопределять метод onMultiSelectDelete (this.onMultiSelectDelete).

Спасибо, Наталия, все получилось! :smile:

Показать все комментарии