Jump to content

Featured Replies

Есть такая штука называется примеси или mixins. Очень мало инфы в инете которую я так и не смог применить
Нашел такое https://invisioncommunity.com/4guides/themes-and-customizations/javascript-framework/introduction-to-the-framework/mixins-r285/
Там приводится пример, дополнить возвращаемые данные:

this.around('parentMethod', function (origFn) {
	var returned = origFn();
	
	return _.extend( returned, {
		key1: true,
		key2: false
	});
});

а есть ли возможность, например в методе parentMethod есть переменная var bruh; как мне её переопределить на мою переменную с нужным мне значением, чтобы код в parentMethod выполнился с значением из моей переменной? Нужно расширить родительский метод чтобы он уже выполнялся с частью моего кода. Или это вообще работает не так как я думаю?

Link to comment
https://ipbmafia.ru/topic/23139-mixins-jquery-v-ips/
Share on other sites

или проще скопировать родительский метод (оригинал) и внести в него правки?:

this.parentMethod = function () {
	//весь код оригинала + мои правки
};

просто например когда хукают код php, запрещено копировать полностью родительскую функцию:

Цитата

When overriding a method, you MUST NOT copy code from the original method into your hook. This is necessary to ensure that your hook does not interfere with any bug fixes or changes made to the original class in future versions. Also, it is against the terms of the IPS Community Suite license to distribute any code within it.

Цитата

При переопределении метода вы НЕ ДОЛЖНЫ копировать код из исходного метода в свой хук. Это необходимо для того, чтобы ваша ловушка не мешала исправлению ошибок или изменениям, внесенным в исходный класс в будущих версиях. Кроме того, распространение любого кода внутри нее противоречит условиям лицензии IPS Community Suite.

 

Link to comment
https://ipbmafia.ru/topic/23139-mixins-jquery-v-ips/?&do=findComment&comment=169252
Share on other sites

Какой конкретно контроллер и метод?

Link to comment
https://ipbmafia.ru/topic/23139-mixins-jquery-v-ips/?&do=findComment&comment=169253
Share on other sites
6 минут назад, WaNted сказал:

Какой конкретно контроллер и метод?

в принципе любой где объявляются переменные, например тот же контроллер core.front.core.commentFeed, метод addToCommentFeed
там есть такой участок кода:

var commentFeed = this.scope.find('[data-role="commentFeed"]');
if( commentFeed.find('[data-role="moderationTools"]').length ){
	commentFeed = commentFeed.find('[data-role="moderationTools"]');
}

мне нужно чтобы этот метод выполнился не с тем значением который объявляется в методе родителя, а с моим, например:

var commentFeed = this.scope.find('#my_element');

я просто думаю что скорее всего такое использование миксинов невозможно

Edited by ZIKURIK

Link to comment
https://ipbmafia.ru/topic/23139-mixins-jquery-v-ips/?&do=findComment&comment=169254
Share on other sites

Интересно, а если попробовать убрать атрибут data-role="commentFeed" с оригинального элемента и поставить на нужный до выполнения метода, а после вернуть на место, убрав со своего. 😂

Ну а если серьёзно, переопределять полностью методы можно. Если верить этому:

Цитата

Finally, you can create new methods in your mixin, or completely replace methods from the parent controller by redefining them.

 

Цитата

Of course, if you replace an existing method, be sure it plays nicely with any calls to it!

 

Link to comment
https://ipbmafia.ru/topic/23139-mixins-jquery-v-ips/?&do=findComment&comment=169255
Share on other sites
14 минут назад, WaNted сказал:

Интересно, а если попробовать убрать атрибут data-role="commentFeed" с оригинального элемента и поставить на нужный до выполнения метода, а после вернуть на место, убрав со своего. 😂

Ну а если серьёзно, переопределять полностью методы можно. Если верить этому:

 

 

Я просто подумал что это запрещено условиями лицензии IPS, так как я все же копирую ИХ код js в свой но с правками

Link to comment
https://ipbmafia.ru/topic/23139-mixins-jquery-v-ips/?&do=findComment&comment=169256
Share on other sites
3 часа назад, ZIKURIK сказал:

Я просто подумал что это запрещено условиями лицензии IPS

Эти ограничения касаются только приложений и плагинов, которые вы хотите выставить в маркет инвижына для других людей. В рамках своего форума вы можете делать с кодом что угодно. 

Link to comment
https://ipbmafia.ru/topic/23139-mixins-jquery-v-ips/?&do=findComment&comment=169257
Share on other sites
4 часа назад, ZIKURIK сказал:

я просто думаю что скорее всего такое использование миксинов невозможно

Да, именно так. Вы не можете залезть в функции и переменные родителя и что-то изменить, но вы можете дополнить базовый класс своими функциями или полностью заменить функции родителя своими. 

 

Link to comment
https://ipbmafia.ru/topic/23139-mixins-jquery-v-ips/?&do=findComment&comment=169258
Share on other sites
18 минут назад, Desti сказал:

Эти ограничения касаются только приложений и плагинов, которые вы хотите выставить в маркет инвижына для других людей. В рамках своего форума вы можете делать с кодом что угодно. 

это понятно, у меня вопрос по this.parentMethod = function () и возник если я вдруг захочу распространять плагины\приложения как мне лучше использовать их функции.

2 минуты назад, Desti сказал:

Да, именно так. Вы не можете залезть в функции и переменные родителя и что-то изменить, но вы можете дополнить базовый класс своими функциями или полностью заменить функции родителя своими. 

 

Вот по поводу замещения функции
Мне нужно немного изменить например один из методов под свой плагин, допустим одну переменную внутри функции parentMethod, т.е. мне придется как ни крути скопировать код родителя, немного подправить и переопределить this.parentMethod = function () { //весь код оригинала + мои правки }; получается такой плагин уже нельзя будет распространять? Если нет то как тогда другие разработчики переписывают функции, не писать же идентичную функцию которая выполняет все тоже самое что и родительская, только ради работы одной переменной.

Link to comment
https://ipbmafia.ru/topic/23139-mixins-jquery-v-ips/?&do=findComment&comment=169259
Share on other sites

Я разговаривал на эту тему с разрабами движка, почитайте. Там есть ответы на некоторые вопросы. 

invisioncommunity.com/forums/topic/455654-plugin-code-hooks/

17 минут назад, ZIKURIK сказал:

мне придется как ни крути скопировать код родителя, немного подправить и переопределить

Иногда проще сделать свой JS файл, а не модифицировать оригинал. Ограничение по копированию кода относится только к "When overriding a method...".

Но в любом случае команда, проверяющая код перед публикацией укажет вам на нарушения и предложит их исправить, так что всё можно решить. 

Edited by Desti

Link to comment
https://ipbmafia.ru/topic/23139-mixins-jquery-v-ips/?&do=findComment&comment=169260
Share on other sites
13 часов назад, Desti сказал:

Я разговаривал на эту тему с разрабами движка, почитайте. Там есть ответы на некоторые вопросы. 

invisioncommunity.com/forums/topic/455654-plugin-code-hooks/

Иногда проще сделать свой JS файл, а не модифицировать оригинал. Ограничение по копированию кода относится только к "When overriding a method...".

Но в любом случае команда, проверяющая код перед публикацией укажет вам на нарушения и предложит их исправить, так что всё можно решить. 

в конечном итоге вы смогли реализовать плагин для продажи?

13 часов назад, Desti сказал:

Иногда проще сделать свой JS файл, а не модифицировать оригинал

ну у меня ситуация идентичная я так полагаю, только у вас там переопределение для php функции, у меня тут для js и так же нужно переопределение всего метода, ибо this.around, this.before, this.after это не сделать. Хотя я тоже могу не трогать метод в js, а затронуть функцию обработчик в php, НО мне опять же придется вырезать или изменять код родителя для переопределения функции php, так как он в любом случае выполнится если использовать code hook

Link to comment
https://ipbmafia.ru/topic/23139-mixins-jquery-v-ips/?&do=findComment&comment=169268
Share on other sites
1 час назад, ZIKURIK сказал:

в конечном итоге вы смогли реализовать плагин для продажи?

Не, задачи такой не стояло, я просто немножко докопался до разрабов :) А сам плагин - да, сделал, работает себе на сайте, но честно нарушает все правила ипс-ов и, скорее всего, не может быть размещен в магазине. 

Как быть вам - не знаю. Если пишете на продажу - придется следовать рекомендациям.

 

 

Link to comment
https://ipbmafia.ru/topic/23139-mixins-jquery-v-ips/?&do=findComment&comment=169269
Share on other sites
20 часов назад, WaNted сказал:

Интересно, а если попробовать убрать атрибут data-role="commentFeed" с оригинального элемента и поставить на нужный до выполнения метода, а после вернуть на место, убрав со своего. 😂

Я думаю стоит попробовать это. Пример:

this.around('addToCommentFeed', function (origFn, e, data) {
	this.scope.find('[data-role="commentFeed"]').attr('data-role', 'oldCommentFeed');
	this.scope.find('#yourElement').attr('data-role', 'commentFeed');
	origFn(e, data);
	this.scope.find('#yourElement').removeAttr('data-role');
	this.scope.find('[data-role="oldCommentFeed"]').attr('data-role', 'commentFeed');
});

В теории комментарий будет добавлен в нужный элемент #yourElement.

Link to comment
https://ipbmafia.ru/topic/23139-mixins-jquery-v-ips/?&do=findComment&comment=169270
Share on other sites
Цитата

Notice that the parent method is passed in as a parameter (if the method has any other parameters, these will appear first, and the parent method will be the last parameter).

function (e, data, origFn)

Link to comment
https://ipbmafia.ru/topic/23139-mixins-jquery-v-ips/?&do=findComment&comment=169271
Share on other sites
43 минуты назад, Desti сказал:

Не, задачи такой не стояло, я просто немножко докопался до разрабов :) А сам плагин - да, сделал, работает себе на сайте, но честно нарушает все правила ипс-ов и, скорее всего, не может быть размещен в магазине. 

Как быть вам - не знаю. Если пишете на продажу - придется следовать рекомендациям.

Как показывает практика, разрабы довольно лояльны в этом.

Link to comment
https://ipbmafia.ru/topic/23139-mixins-jquery-v-ips/?&do=findComment&comment=169272
Share on other sites
1 час назад, WaNted сказал:

В теории комментарий будет добавлен в нужный элемент #yourElement.

похоже на костыль) Но как вариант "анти-переопределение метода" работает

this.around('addToCommentFeed', function ( origFn, e, data ) {
	this.scope.find('[data-role="commentFeed"]').attr('data-role', 'dis_commentFeed');
	this.scope.find('#myElement').after('<div data-role="commentFeed"></div>');
	origFn( e, data );
	$('.ipsComment').unwrap('[data-role="commentFeed"]');
	this.scope.find('[data-role="dis_commentFeed"]').attr('data-role', 'commentFeed');
});

#myElement динамичный элемент и по завершению тоже удаляется, получаем чистый DOM

Link to comment
https://ipbmafia.ru/topic/23139-mixins-jquery-v-ips/?&do=findComment&comment=169273
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.


Guest
Ответить в этой теме...

Последние посетители 0

  • No registered users viewing this page.