Перейти к содержанию

mixins jquery в ips


Рекомендуемые сообщения

Есть такая штука называется примеси или 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 выполнился с значением из моей переменной? Нужно расширить родительский метод чтобы он уже выполнялся с частью моего кода. Или это вообще работает не так как я думаю?

Ссылка на комментарий
Поделиться на другие сайты

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

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.

 

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

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');

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

Изменено пользователем ZIKURIK
Ссылка на комментарий
Поделиться на другие сайты

Интересно, а если попробовать убрать атрибут 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!

 

Ссылка на комментарий
Поделиться на другие сайты

14 минут назад, WaNted сказал:

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

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

 

 

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

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, ZIKURIK сказал:

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

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

Ссылка на комментарий
Поделиться на другие сайты

4 часа назад, ZIKURIK сказал:

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

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

 

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

 

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

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

Изменено пользователем Desti
Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, ZIKURIK сказал:

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

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

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

 

 

Ссылка на комментарий
Поделиться на другие сайты

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.

Ссылка на комментарий
Поделиться на другие сайты

Цитата

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)

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...