Posted 28 апреля, 20213 yr comment_169251 Есть такая штука называется примеси или 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 выполнился с значением из моей переменной? Нужно расширить родительский метод чтобы он уже выполнялся с частью моего кода. Или это вообще работает не так как я думаю?
28 апреля, 20213 yr Author comment_169252 или проще скопировать родительский метод (оригинал) и внести в него правки?: 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.
28 апреля, 20213 yr Author comment_169254 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 28 апреля, 20213 yr by ZIKURIK
28 апреля, 20213 yr comment_169255 Интересно, а если попробовать убрать атрибут 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!
28 апреля, 20213 yr Author comment_169256 14 минут назад, WaNted сказал: Интересно, а если попробовать убрать атрибут data-role="commentFeed" с оригинального элемента и поставить на нужный до выполнения метода, а после вернуть на место, убрав со своего. 😂 Ну а если серьёзно, переопределять полностью методы можно. Если верить этому: Я просто подумал что это запрещено условиями лицензии IPS, так как я все же копирую ИХ код js в свой но с правками
28 апреля, 20213 yr comment_169257 3 часа назад, ZIKURIK сказал: Я просто подумал что это запрещено условиями лицензии IPS Эти ограничения касаются только приложений и плагинов, которые вы хотите выставить в маркет инвижына для других людей. В рамках своего форума вы можете делать с кодом что угодно.
28 апреля, 20213 yr comment_169258 4 часа назад, ZIKURIK сказал: я просто думаю что скорее всего такое использование миксинов невозможно Да, именно так. Вы не можете залезть в функции и переменные родителя и что-то изменить, но вы можете дополнить базовый класс своими функциями или полностью заменить функции родителя своими.
28 апреля, 20213 yr Author comment_169259 18 минут назад, Desti сказал: Эти ограничения касаются только приложений и плагинов, которые вы хотите выставить в маркет инвижына для других людей. В рамках своего форума вы можете делать с кодом что угодно. это понятно, у меня вопрос по this.parentMethod = function () и возник если я вдруг захочу распространять плагины\приложения как мне лучше использовать их функции. 2 минуты назад, Desti сказал: Да, именно так. Вы не можете залезть в функции и переменные родителя и что-то изменить, но вы можете дополнить базовый класс своими функциями или полностью заменить функции родителя своими. Вот по поводу замещения функции Мне нужно немного изменить например один из методов под свой плагин, допустим одну переменную внутри функции parentMethod, т.е. мне придется как ни крути скопировать код родителя, немного подправить и переопределить this.parentMethod = function () { //весь код оригинала + мои правки }; получается такой плагин уже нельзя будет распространять? Если нет то как тогда другие разработчики переписывают функции, не писать же идентичную функцию которая выполняет все тоже самое что и родительская, только ради работы одной переменной.
29 апреля, 20213 yr comment_169260 Я разговаривал на эту тему с разрабами движка, почитайте. Там есть ответы на некоторые вопросы. invisioncommunity.com/forums/topic/455654-plugin-code-hooks/ 17 минут назад, ZIKURIK сказал: мне придется как ни крути скопировать код родителя, немного подправить и переопределить Иногда проще сделать свой JS файл, а не модифицировать оригинал. Ограничение по копированию кода относится только к "When overriding a method...". Но в любом случае команда, проверяющая код перед публикацией укажет вам на нарушения и предложит их исправить, так что всё можно решить. Edited 29 апреля, 20213 yr by Desti
29 апреля, 20213 yr Author comment_169268 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
29 апреля, 20213 yr comment_169269 1 час назад, ZIKURIK сказал: в конечном итоге вы смогли реализовать плагин для продажи? Не, задачи такой не стояло, я просто немножко докопался до разрабов А сам плагин - да, сделал, работает себе на сайте, но честно нарушает все правила ипс-ов и, скорее всего, не может быть размещен в магазине. Как быть вам - не знаю. Если пишете на продажу - придется следовать рекомендациям.
29 апреля, 20213 yr comment_169270 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.
29 апреля, 20213 yr comment_169271 Цитата 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)
29 апреля, 20213 yr comment_169272 43 минуты назад, Desti сказал: Не, задачи такой не стояло, я просто немножко докопался до разрабов А сам плагин - да, сделал, работает себе на сайте, но честно нарушает все правила ипс-ов и, скорее всего, не может быть размещен в магазине. Как быть вам - не знаю. Если пишете на продажу - придется следовать рекомендациям. Как показывает практика, разрабы довольно лояльны в этом.
29 апреля, 20213 yr Author comment_169273 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
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.