+4.25
Рейтинг
11.40
Сила

Антон

Ошибка скрипта при вставке из Твиттера

Уважаемые коллеги,

В файле engine/lib/internal/template/js/main.js происходит переопределение метода .bind():
	Function.prototype.bind = function(context) {
		var fn = this;
		if(jQuery.type(fn) != 'function'){
			throw new TypeError('Function.prototype.bind: call on non-function');
		};
		if(jQuery.type(context) == 'null'){
			throw new TypeError('Function.prototype.bind: cant be bound to null');
		};
		return function() {
			return fn.apply(context, arguments);
		};
	};


Вроде бы невинная проверка, но она падает, если в заметку вставлен эмбед Твиттера, поскольку в подключаемом widgets.js идёт прямой вызов .bind() с нуллом:
e.exports = {tweet: o(r.bind(null, "tweet")),timeline: i,video: o(r.bind(null, "video")),tweetRefresh: r.bind(null, "tweet")}


Это приводит к выбрасыванию исключения «Function.prototype.bind: cant be bound to null» (как есть, без апострофа).

Я эту ситуацию смог воспроизвести: jsfiddle.net/NPC42/z89o15em/ (см. консоль), но только если поставить запуск JQuery на onDomready, иначе всё работает без проблем (каким-то образом).

Вопрос мой состоит из двух частей — во-первых, может я что-то не так понял? :) Проблема происходит при определённых обстоятельствах, и я не до конца понимаю, при каких именно. С полгода назад вставка Twitter работала, а теперь мы видим, что начала падать на этом месте — хотя теоретически должна была падать всегда.

Во-вторых, будет ли безопасно поменять определение в main.js следующим образом?
if (!Function.prototype.bind) {
	Function.prototype.bind = function(context) {
		var fn = this;
		if(jQuery.type(fn) != 'function'){
			throw new TypeError('Function.prototype.bind: call on non-function');
		};
		if(jQuery.type(context) == 'null'){
			throw new TypeError('Function.prototype.bind: cant be bound to null');
		};
		return function() {
			return fn.apply(context, arguments);
		};
	};
}


Проблему вставки Твиттера это решает, но я тревожусь, не поломает ли это что-то ещё, ведь по какой-то причине LS решил определить собственный метод .bind() (для поддержки IE8, возможно?).

Буду благодарен за любые объяснения и подсказки.

Передать параметр by reference между методами разных классов

Добрый день!

Есть ли причины, чтобы передача параметров функции по референсу не работала между классами?

У меня примерно такой код:
class One {
    function foo($a, &$var, $c)
    {
        $var++;
    }
}

class Two {
    function bar() {
        $b=5;
        $oOne = new One();
        $oOne->foo(1, $b, 3);
        echo $b;
    }
}

$oTwo = new Two();
$oTwo->bar();

В www.tehplayground.com/#ja9CHhWZ5 он работает (выводит 6), а в моём плагине в рамках LS, когда разношу по классам, унаследованным от Module, почему-то возвращается 5.

(естественно, мне это надо не для того, чтобы 5 на 1 увеличивать :), но если даже 5 не получается, то и мой код не сработает — буду вынужден заворачивать возврат из функции в объект и т.п.)

Хук на выводе результата поиска

Коллеги, а есть ли хук (наподобие «topics_list_show») на выводе списка топиков в поиске, т.е. по пути /search/topics/…? Искал по исходникам, пока не смог найти, буду благодарен за подсказку.

И то же самое интересует для вывода комментариев в поиске (/search/comments/…).

Плагин «AutoAlt» — автоматические alt-ы изображений

Уважаемые коллеги,

Пользователи вашего сайта всегда заполняют описание (alt) изображений в создаваемых топиках? А вы сами — всегда? Но по идее это важно, из соображений доступности для людей с ограниченными возможностями, и для поисковой оптимизации.

Поэтому вам может оказаться полезным плагин AutoAlt, который заполняет пустые alt-аттрибуты на изображениях топика автоматически (при сохранении топика).



Плагин написан для и используется на сайте ММОзговед. Отправной точкой в создании плагина стал фрагмент TopicExtend, который был значительно переработан для работы с названием блога.

Работает по следующему сценарию:

  • Если alt-а нет или он пустой, то создаёт его со значением «Название блога: Название топика».
  • Если alt есть и не содержит название блога, то добавляет «Название блога: Существующий ALT». Иначе alt не изменяется.

В config/config.php можно отключить добавление названия блога (тогда берётся только название топика).

Изменение производится при сохранении топика — т.е. чтобы увидеть его на существующих топиках, их необходимо пересохранить. Фотосеты не затрагиваются данным плагином.

Исходный код доступен на GitHub (только надо переименовать папку с плагином в autoalt, если будете качать его оттуда до прохождения модерации).

Дайте знать, если встретятся какие-либо проблемы.

PS Аватар сгенерен забавным сервисом RoboHash по тексту “AutoAlt LS plugin”. Не всегда же быть серьёзными! :)

Плагин «Фильтрация комментариев»

Уважаемые коллеги,

Представляю дополнительную функциональность для пользовательской фильтрации комментариев по рейтингу. Особенно это помогает, если человек приходит в топик, когда там уже написали много комментариев, и позволяет найти самые интересные (с точки зрения плюсовавших их пользователей).


Плагин в действии можно увидеть на сайте ММОзговед — mmozg.net (помимо этой логики там также переделана работа с рейтингом, но эти изменения я, возможно, выложу позже). Идея фильтрации комментариев по рейтингу позаимствована у сайта Eurogamer.

Плагин должен работать на всех шаблонах, в которых отдельный комментарий находится по критерию "#comments .comment", а значение рейтинга записано в числовом виде в элементе ".vote-count". Если в вашем шаблоне другие классы, критерии выборки можно изменить в файле «templates/skin/default/js/comment_filter.js» этого плагина.

Работа плагина Comment Filter, см.блок справа

Исходный код доступен на GitHub: github.com/NPC/ls-comment-filter (только надо переименовать папку с плагином в commentfilter, если будете качать его оттуда до прохождения модерации).

Дайте знать, если встретятся какие-либо проблемы.

Ежедневное вознаграждение пользователей за визит

Уважаемые коллеги,

Может кому-то будет полезно описание решения задачи ежедневного вознаграждения пользователей за заход на ЛС-сайт (для версии 1.0.1).
Читать дальше →

Вопрос: Переопределение метода класса ядра в плагине

Уважаемые коллеги,

Каким образом можно (правильно :)) переопределить (делегировать) методы классов ядра в плагине? В частности, я хотел бы перегрузить методы класса Router (Exec и RewriteRequest в частности).

Насколько я пока нашёл (статьи по похожей теме были найдены здесь, тут и там) можно делегировать Actions (но это не action), и методы классов модулей — но вроде бы Router не является частью модуля (или я что-то упустил). Эксперименты (методом тыка) с разными названиями хуков результата не дали, мой код не вызывается.

В API определена функция AddDeletageFunction, но я не могу понять, как сформировать к ней правильное название хука — найденные примеры, опять таки, опираются на экшины и модули.

Заранее благодарю за любые конструктивные подсказки и помощь.

Вопрос: Псевдонимы и канонический URL, или как добиться 301 средствами движка?

Уважаемые коллеги,

Надеюсь, кто-то сможет подсказать, как добиться правильной отработки альтернативных url-ов средствами движка. Я надеюсь, что это возможно, поскольку, заходя на адрес типа site.com/1.html происходит перенаправление с кодом 301 (moved permanently — то, что надо!) на адрес site.com/blog/blog_name/1.html (это можно увидеть по адресной строке браузера, и, например, по инспектору в Хроме).

Странно, что это работает даже когда я убираю соответствующую запись из $config['router']['uri'] в локальном конфиге.

Так вот — я хотел бы добиться того же эффекта для псевдонимов, которые задаю я. Чтобы псевдоним перенаправлял на корректный адрес LS с кодом 301. $config['router']['rewrite'] для этого не подходит, поскольку он полностью убирает один экшин, заменяя его другим. Старый становится недоступен. А вот создание псевдонимов в $config['router']['uri'] справляется с этой задачей наполовину — страница доступна по обоим адресам, но при этом по обоим с кодом 200.

Переход с кодом 301 совершает функция Location в классе Router, есть ли возможность вызывать её для стандартных псевдонимов (понятно, что нахачить можно чего угодно, но зачем, если это уже доступно?).

Заранее благодарю за любую помощь и подсказки!

Корректная локализация строк в JS-коде плагина

Уважаемые коллеги,

Как корректно локализовать строки, используемые в js-коде, который подключается моим плагином через Viewer_AppendScript? Например, различные сообщения и т.п. вспомогательные строки. Хотелось бы сделать изначально правильно.

Заранее благодарю за любую помощь.