Улучшение и развитие сайта
#61
Отправлено 30 Май 2012 - 10:32
#62
Отправлено 30 Май 2012 - 10:37
I kill two dwarves at night._________And two in time of war.
I kill two dwarves in the afternoon,__I kill two dwarves before I kill two dwarves
And then I feel all right.___________And then I kill two more.
#65
Отправлено 22 Август 2012 - 23:56
Да и в правильно сформулированном вопросе уже как минимум пол-ответа будет. Может кто и в курсе второй половины будет..
#66
Отправлено 23 Август 2012 - 06:17
<span class="fc"><script type="text/javascript">document.write('<a href="http://eu.battle.net/d3/ru/profile/'+'{content}'.replace('#', '-')+'/">{content}</a>');</script></span>
Работает, НО при постинге страница ломается и кроме профиля пользователя ничего не отображается.
#67
Отправлено 23 Август 2012 - 10:17
именно это собственно команда
document.write(something);
и должна делать - переписывать содержимое document переданным аргументом.
Открой в FF любую страницу, включи консоль firebug(инструмент н.1 любого js developer), набери там команду document.write("somestring"); и посмотри результат.
Там же в консоли собственно и проверяешь весь свой js.
Дальше - забей на чистый js. У тебя уже загружен prototype - им и пользуйся, любой js framework, если он в любом случае уже подгружен на страницу, лучше чем чистый js (кроссброузерность и прочая важная хрень из коробки).
Prototype не пользовался, но все принципы js-фрамеворков похожи, и вообще вся архитектура похожа, так что с ходу, как вся кухня должна выглядеть:
1. Весь свой user js код собираешь в один/несколько файлов, размазывать его кусочками/инлайном по шаблонам это плохо. Читать плохо, контролировать плохо, броузерам плохо.
2. Все что у тебя должно на странице происходить после загрузки (а это похоже наш случай) - на событие onload. Навскидку, поиск по api prototype дает:
http://api.prototype...cument/observe/
внизу пример.
Причем старайся бизнес-логику не пихать прямо в обработчик, а только вызывать там свои методы, так легче читать будет.
3. Собственно твой кусочек хочет а) найти некоторые/все элементы DOM, заменить содержимое. Опять же навскидку это здесь:
http://prototypejs.o...element/replace
В примере использован селектор $, но для твоего случая скорее всего подойдет $$,
разница тут видна:
http://api.prototype.../dollar-dollar/
4. Суммируем:
по onload вызывается твой метод/функ., описанный в файле, который грузится на странице.
В этом коде ты вызываешь селектор, который находит нужные тебе элементы, и для них вызываешь replace, подменяющий контент этих элементов. Все.
(ну и для всех, задающихся вопросом: "не проще ли просто строчку кода написать?", напоминаю притчу про рыбу и удочку. Да, и про лень тоже )
#68
Отправлено 23 Август 2012 - 13:53
>> 2. Все что у тебя должно на странице происходить после загрузки (а это похоже наш случай) - на событие onload.
На наш случай это не похоже, потому что вставку эту я делаю в админке форума, как она там потом обрабатывается - я вообще без понятия.
>> 3. Собственно твой кусочек хочет а) найти некоторые/все элементы DOM, заменить содержимое.
Опять же, неверно. Мой кусочек всего лишь хочет отформатировать определенный кусок HTML на основании исходной строки в формате, который я описал.
Ну и хотелось бы что-то более элегантное, а не такое грубое вмешательство в работу движка форума. Хочется inline-решение, а не пост-обработку HTML через DOM.
По сути, задача вообще тривиальная: заменить # на - в строке.
#69
Отправлено 23 Август 2012 - 14:57
kapxapot (23 Август 2012 - 13:53) писал:
На наш случай это не похоже, потому что вставку эту я делаю в админке форума, как она там потом обрабатывается - я вообще без понятия.
Хотите верьте, хотите нет.
kapxapot (23 Август 2012 - 13:53) писал:
Опять же, неверно. Мой кусочек всего лишь хочет отформатировать определенный кусок HTML на основании исходной строки в формате, который я описал.
kapxapot (23 Август 2012 - 13:53) писал:
kapxapot (23 Август 2012 - 13:53) писал:
Вы получите ваш результат в один короткий инлайн добавив к document нужный вам selector getelementby..... и дальше применив ваш реплейс - это будет коротко, работающе и плохо.
Все разваливается, ибо вы весь документ переписываете. Добавьте селектор - сработает (повторю - это плохо!).
Более длинно, чуть больше времени почитать доки, но правильно - selector любого фреймворка.
Если элементы в доме появляются один раз при загрузке - все же лучше onload или производное событие фреймворка от него.
Если они добавляются аяксом, посмотрите где идет post , какие к нему коллбэки - 99% фреймворков позволяют цепочкой к нему свои коллбэки вешать - сможете менять нужные вам элементы после всех штатных коллбэков.
#70
Отправлено 23 Август 2012 - 17:23
У пользователей есть дополнительные поля профиля. Я добавил поле - BattleTag, который имеет формат "xxxxx#1111", как я выше писал уже. Для вывода этой строки в профиле используется такой шаблон:
<span class="fc">{content}</span>
Соответственно, content - это именно то, что вводится в поле профиля BattleTag. Но чтобы получить ссылку на этот профиль на батлнете, нужно построить ссылку вида:
http://eu.battle.net/d3/ru/profile/xxxxx-1111/
Т.е., в этой ссылке нужно заменить # на - из той исходной строки. Но выглядеть ссылка должна все равно как BattleTag (хотя это и не критично, конечно, но все же так правильно).
Все что есть в данном случае - строка форматирования этого кусочка страницы. Когда именно он парсится и каким именно образом - я не знаю. Но решать эту проблему перелопачиванием результирующей HTML-страницы форума и исправлением полей как-то слишком сложно и тяжеловесно получается. Не факт, что это не приведет к каким-то еще побочным эффектам, а также придется эту надстройку форума поддерживать со временем при внесении исправлений в форум (новые версии, новые скины и т.п.).
Тогда уж есть пара способов попроще:
1. Заменить формат вводимого BattleTag'а на формат с тире изначально. Это будет неудобно и не интуитивно, но не надо будет морочиться с форматированием ссылки.
2. Разбить BattleTag на две части, вот только как их потом соединять снова - не понятно, потому что каждое поле форматируется отдельно и в его поле действия нет доступа к другим полям...
3. Только что мне в голову пришла еще одна идея: сделать редирект! Например, делаем страницу:
http://warcry.ru/redirect/battletag/xxxxx#1111
Которая перенаправляет на нужную нам:
http://eu.battle.net/d3/ru/profile/xxxxx-1111/
И что скажешь?
#71
Отправлено 23 Август 2012 - 18:19
$$('span.fc').each(function(name){ name.update('<a href="http://eu.battle.net/d3/ru/profile/' + name.innerHTML.replace('#','-') + '/">' + name.innerHTML + '</a>'); });
ну это снаружи. Из админки заменить name.innerHTML на шаблон '{content}' скорее всего.
Ссылка будет на бнет профиль, а вид останется.
#72
Отправлено 24 Август 2012 - 08:48
#73
Отправлено 24 Август 2012 - 11:09
- клиент отсылает request (тип не важен) с кучкой аргументов, добавив от себя немножко контекста
- сервер получает его, быренько срабатывает немножко нам сейчас неважной черной магии, находится точка вызова и тип интерпретатора, которому все что сервер получил, будет отдано (ну и сервер от себя добавит всякого контекста)
- по чудесному стечению обстоятельств, в случае Ipb окажется что нужным серверу интерпретатором окажется php, ну и собственно какой код и откуда загрузить тоже прояснится
- Ipb, который и окажется искомым кодом, заполучит весь реквест с аргументами, ид сессии из контекста, по которой достанет еще огромный слой контекста с файловой системы(на правильных серваках - из мемкэша) и начнет выполняться
- Ipb достанет шаблоны, постучит в базу, а наткнувшись на placeholder типа {content}, разрешит его имеющейся уже у него информацией (с базы либо из аргументов)
- результатом работы Ipb будет уже чистый html
- сервер, радостно дождавшись ответа, добавит к респонсу опять своего контекста(да-да, headers и прочая фигота) и бодро отошлет его клиенту
- ну и для простоты опустим магию, чего происходит на клиенте - а там в зависимости от клиента тоже много интересного
Собственно это я несколько упрощенно, но в общем к тому, что сервер html вообще не формирует. Но это все фигня, я просто занудлив
Чего я собственно сказать-то думал...
js -код вперемежку с разметкой - точно нехорошо.
Это не вопрос веры, это просто так и есть
( и я глянул в сорс, который сгенерирован IPBдвижком - там уже есть такие "внедрения". Я понимаю, что для движка Ipb это самый простой способ предложить механизм плагинов по месту. Но это от лукавого. Разметку так кастомизировать - это хорошо и удобно, а вот с js надо чуток не так. )
Однако если ближе к сути:
- "а также придется эту надстройку форума поддерживать со временем при внесении исправлений в форум (новые версии, новые скины)"
Это верно, одобрямс и действительно можно напороться, характерная задача для любых сторонних "улучшателей". Решение тоже должно быть типовое. Ща "придумаем"
Общая картина должна быть примерно такой ( я внутренностей Ipb не видел, просто вся механика очень похожа, так что это "обоснованное предположение", поправь, если я мимо где-то ):
Все пользовательские/сторонние скрипты должны быть собраны в одно место, в один файл. В нем вся реализация, наружу торчит только api.
В идеале - из админки есть доступ к <head> разделу. Тогда вообще никаких проблем нет - там подключается наш файл и пишется вызов обработчика,
который заработает после загрузки документа. Внутри обработчика - вызовы всего, чем мы хотим дополнить/улучшить документ.
Никаких проблем с обновлениями и прочим тогда нет - ибо мы не меняли оригинальные файлы.
Наш код отдельно, Ipb - отдельно.
Никаких вызовов js по ходу загрузки не должно быть - нужны очень сильные аргументы, чтобы такими вызовами пользоваться.
(Обычно аргументация - так проще. Я отлично понимаю, что когда выбор между "так и проще и сразу ясно, как делать" и "а так правильно, но блин надо разбираться и выглядит сложно" - найдется еще всяких слов в поддержку вкраплений.
Да, тогда порядок действий именно такой и будет - сначала делаем как быстрее, чтобы сразу заработало. Это логично, между "неправильно работает" и "правильно не работает" выбор в пользу "работает" обоснован.
Но подведение под это теорий это перебор.)
Теперь самый худший случай, какой я могу представить: доступ к <head> только через доступ непосредственно к файлу.
Тогда лучше иметь два "наших" файла - в одном реализация, в другом "основной" обработчик с вызовами.
Соответственно тогда в файле с шаблоном две строки с включениями наших файлов. (второй файл только чтобы копировать 1 строку, а не 7, к примеру. Если это не проблема, то 2-й файл не нужен )
Обновляется версия Ipb - снова придется включить эти две строки руками. Увы, этих 5 минут не избежать, если доступ только непосредственно на уровне файлов. Но и тогда проблем нет с обновлениями.
Когда может возникнуть проблема с обновлениями:
- мы все сделали по науке, логика(js) отдельно, разметка(html) отдельно, дизайн(css) отдельно. Мы круты.
- мы в нашей логике обращались к штатным классам/ид и у нас всё круто работает
- в команду Ipb пришел чертов гений и первым его гениальным решением было - поменять пару названий классов
- в очередном шабырнадцатом обновлении были реализованы несколько таких гениальных решений
- наша логика перестала находить цели. Не, никаких вылетов и ничего такого - мы не вчера родились и логика сделана по уму. Нет цели - нет действия.
Просто наши "улучшайзеры" перестали улучшать и нам грустно. У нас по наведению мышкой на профиль сразу показывалась иконка класса самого сильного персонажа из профиля - а тут перестала показываться.
Опять же, я бы сказал грабли, но не особо трагично.
Рецепт простой, придуман задолго до нас, наша задача только знать и помнить - неймспейсы, в самом широком смысле.
Либо собственные классы с характерными префиксами, либо собственные ид (префикс). И только к ним и привязываться. И тогда никакие чертовы гении не страшны.
Эээээ.... Мы все еще на форуме про игрушки, я чего-то запутался...?
#74
Отправлено 24 Август 2012 - 12:00
Придрался к моей фразе о том, что сервер генерирует HTML. А IPB где, по-твоему, расположен, на клиенте или в астрале? Если рассматривать клиент-серверную архитектуру на самом высоком уровне, то она и состоит из клиента и сервера (внезапно), соответственно, HTML, т.е. ответ сервера, формируется на сервере и сервером, который в себя включает уже PHP, IPB и прочие Апачи.
Вот глянул бы ты в админку, не пришлось бы фантазировать. Ну или спросил бы у меня. Есть возможность редактировать через админку шаблоны скинов форума, в том числе, и общий шаблон HTML. Файлы IPB при этом никак затронуты не будут. Т.е. внедрить JS-скрипт, который будет дергаться при загрузке страницы, в принципе, проблемы нет.
Проблемы тут только вот в чем могут быть:
1. Внедрять придется в каждый скин форума. И если набор этих скинов будет меняться, требуется заниматься поддержкой этого внедрения.
2. При обновлении форума скины обычно слетают, а с ними и все наши надстройки.
В принципе, и то и другое - не проблема, все это просто добавляет необходимые телодвижения в определенных случаях, от которых хотелось бы избавиться по возможности.
А почему ты ничего не сказал о моем предложении с редиректом? Это будет сделать чуть-чуть труднее, чем внедрение доп. JS в форум, но зато решение будет более чистым и поддерживать его будет впоследствии намного проще и удобнее.
#75
Отправлено 24 Август 2012 - 13:01
kapxapot (24 Август 2012 - 12:00) писал:
Замнём, я слез с броневика уже
kapxapot (24 Август 2012 - 12:00) писал:
Если заголовок отделен (а там скин должен подключаться, поэтому заголовок должен быть отделен) - то если мы не используем для выделения элементов никаких привязок к тому, что скин приносит (а что он приносит, кроме определений css- классов? неужто и разметку?), никаких изменений кода с изменениями скина не будет.
kapxapot (24 Август 2012 - 12:00) писал:
Можно конечно для каких-то элементов делать свои обертки, уйдя вообще от зависимости от чужих идей с разметкой, но это уже действительно будет стрельба тяжелой артиллерией - нужно будет уже не только js(clien-side) , но и нарисовать свои хуки на стороне сервера, которые должны свои обертки сделать прозрачными с двух точек зрения - 1) с точки зрения Ipb (сложнее, ибо непредсказуемы пути их девелоперов) 2) с точки зрения рендеринга клиентских броузеров (легко, ибо стандарты).
В общем да, для обновлений форума, не трогающих разметку - особых проблем со скинами не видно.
Для меняющих разметку - есть некоторый гемор.
kapxapot (24 Август 2012 - 12:00) писал:
ну ок, написали допустим мы фиготу типа (примерно):
Redirect ^/redirect/battletag/(.*)#(.*)$ http://eu.battle.net/d3/ru/profile/$1-$2/Для чего редирект? Чтобы просто не было js, твой сервер получил url, нашел для него редирект, отпарсил и выполнил?
Конечно сработает, но зачем? Цена ресурса запуска Rewrite-кода сервера намного выше простого js (на клиенте). Это неважно для мелких залепух, но в принципе.
Вот если бы вдруг случилось так, что у тебя уже на серваке работает сервис, у котого есть внешний api по http, с неким сложным набором аргументов и он что-то интересное отдает, при этом ты конечно захотел бы всю внутреннюю кухню скрыть и дать снаружи только красивые url, а всю реальную сложность вызова отдать на rewrite engine - ну тогда оправдано. Для этого он и нужен. А для задачи "сформировать ссылку" , имхо, не то.
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных