Перейти к содержимому


Улучшение и развитие сайта


Сообщений в теме: 124

#61 partizan

    Рядовой

  • Посетители
  • Pip
  • 88 сообщений
  • partizan#2455

Отправлено 30 Май 2012 - 10:32

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

#62 drauglin

    Лейтенант

  • Друзья сайта
  • PipPip
  • 361 сообщений
  • drauglin#2503

Отправлено 30 Май 2012 - 10:37

хех, ладно, и на том спасибо
I kill two dwarves in the morning.___I kill two dwarves in time of peace,
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.

#63 kapxapot

    Зангармаршал

  • Администраторы
  • PipPipPipPipPip
  • 19 687 сообщений
  • kapxapot#2853

Отправлено 30 Май 2012 - 11:09

Рылся рылся сейчас, но почему-то не нашел настроек аватарок вообще. :/

#64 kapxapot

    Зангармаршал

  • Администраторы
  • PipPipPipPipPip
  • 19 687 сообщений
  • kapxapot#2853

Отправлено 21 Август 2012 - 09:23

Есть спецы по HTML / Javascript? Нужна помощь. :)

#65 Marek

    Лейтенант

  • Посетители
  • PipPip
  • 348 сообщений

Отправлено 22 Август 2012 - 23:56

а лучше сразу вопрос, а то спецы - они профессионально-ленивые. На конкретный вопрос ответить еще могут, а вот абстрактную "помощь" - это им "сложно"(оно же "лениво").
Да и в правильно сформулированном вопросе уже как минимум пол-ответа будет. Может кто и в курсе второй половины будет..

#66 kapxapot

    Зангармаршал

  • Администраторы
  • PipPipPipPipPip
  • 19 687 сообщений
  • kapxapot#2853

Отправлено 23 Август 2012 - 06:17

Нужно преобразовать с помощью HTML/JS строку "xxxx#1111" в строку "xxxx-1111". Я написал вот так:

<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 Marek

    Лейтенант

  • Посетители
  • PipPip
  • 348 сообщений

Отправлено 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, B) заменить содержимое. Опять же навскидку это здесь:
http://prototypejs.o...element/replace
В примере использован селектор $, но для твоего случая скорее всего подойдет $$,
разница тут видна:
http://api.prototype.../dollar-dollar/
4. Суммируем:
по onload вызывается твой метод/функ., описанный в файле, который грузится на странице.
В этом коде ты вызываешь селектор, который находит нужные тебе элементы, и для них вызываешь replace, подменяющий контент этих элементов. Все.
(ну и для всех, задающихся вопросом: "не проще ли просто строчку кода написать?", напоминаю притчу про рыбу и удочку. Да, и про лень тоже :))

#68 kapxapot

    Зангармаршал

  • Администраторы
  • PipPipPipPipPip
  • 19 687 сообщений
  • kapxapot#2853

Отправлено 23 Август 2012 - 13:53

Спасибо за ликбез по document.write, я вообще-то в курсе, не совсем дурачок. И что ошибок в этом коде нет, я тоже знаю, но на форуме эта вставка НЕ РАБОТАЕТ как должно, есть побочные эффекты.

>> 2. Все что у тебя должно на странице происходить после загрузки (а это похоже наш случай) - на событие onload.

На наш случай это не похоже, потому что вставку эту я делаю в админке форума, как она там потом обрабатывается - я вообще без понятия.

>> 3. Собственно твой кусочек хочет а) найти некоторые/все элементы DOM, заменить содержимое.

Опять же, неверно. Мой кусочек всего лишь хочет отформатировать определенный кусок HTML на основании исходной строки в формате, который я описал.

Ну и хотелось бы что-то более элегантное, а не такое грубое вмешательство в работу движка форума. Хочется inline-решение, а не пост-обработку HTML через DOM.

По сути, задача вообще тривиальная: заменить # на - в строке.

#69 Marek

    Лейтенант

  • Посетители
  • PipPip
  • 348 сообщений

Отправлено 23 Август 2012 - 14:57

Просмотр сообщенияkapxapot (23 Август 2012 - 13:53) писал:

>> 2. Все что у тебя должно на странице происходить после загрузки (а это похоже наш случай) - на событие onload.
На наш случай это не похоже, потому что вставку эту я делаю в админке форума, как она там потом обрабатывается - я вообще без понятия.
никак не обрабатывается - мы же видим ее в коде. И это плохо.
Хотите верьте, хотите нет.

Просмотр сообщенияkapxapot (23 Август 2012 - 13:53) писал:

>> 3. Собственно твой кусочек хочет а) найти некоторые/все элементы DOM, заменить содержимое.
Опять же, неверно. Мой кусочек всего лишь хочет отформатировать определенный кусок HTML на основании исходной строки в формате, который я описал.
Убейте меня совсем, но нет такого процесса - "форматирования определенного куска html". Вот когда мы будем рассматривать html как неструктурированный текст, тогда да. А до тех пор - html ли там, xml, json или еще что-то с четко формализованным строением, будем именно в терминах его строения и делать все. Т.е. - через DOM.

Просмотр сообщенияkapxapot (23 Август 2012 - 13:53) писал:

Ну и хотелось бы что-то более элегантное, а не такое грубое вмешательство в работу движка форума. Хочется inline-решение, а не пост-обработку HTML через DOM.
Это плохо. Вы вероятнее всего хотели написать что-то типа либо document.getelementsbyclassname(classname) ( дальне перебор и присваивание вашего реплейса всем элементам класса) или если у вас есть id to document.getelementbyid и присваивание реплейса. Это сработает, но это плохо. Я попытался коротко сказать, почему плохо, зря вы как-то странно..

Просмотр сообщенияkapxapot (23 Август 2012 - 13:53) писал:

По сути, задача вообще тривиальная: заменить # на - в строке.
я здорово рискую и не пойму зачем, но все же - забудьте, что в html есть строки, пока не опустились до уровня innerHTML. А лучше вообще забудьте :)
Вы получите ваш результат в один короткий инлайн добавив к document нужный вам selector getelementby..... и дальше применив ваш реплейс - это будет коротко, работающе и плохо.
Все разваливается, ибо вы весь документ переписываете. Добавьте селектор - сработает (повторю - это плохо!).
Более длинно, чуть больше времени почитать доки, но правильно - selector любого фреймворка.
Если элементы в доме появляются один раз при загрузке - все же лучше onload или производное событие фреймворка от него.
Если они добавляются аяксом, посмотрите где идет post , какие к нему коллбэки - 99% фреймворков позволяют цепочкой к нему свои коллбэки вешать - сможете менять нужные вам элементы после всех штатных коллбэков.

#70 kapxapot

    Зангармаршал

  • Администраторы
  • PipPipPipPipPip
  • 19 687 сообщений
  • kapxapot#2853

Отправлено 23 Август 2012 - 17:23

Marek, давай, я тебе дам доступ к админке форума, сам посмотришь, что это и как там настраивается. И не надо на "вы", пожалуйста. ;)

У пользователей есть дополнительные поля профиля. Я добавил поле - 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 Marek

    Лейтенант

  • Посетители
  • PipPip
  • 348 сообщений

Отправлено 23 Август 2012 - 18:19

Если для других целей span.fc не используется, то этот кусочек сделает:
$$('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 kapxapot

    Зангармаршал

  • Администраторы
  • PipPipPipPipPip
  • 19 687 сообщений
  • kapxapot#2853

Отправлено 24 Август 2012 - 08:48

Да, вот только этот {content} превратится в настоящий текст еще до того, как сервер вообще сформирует HTML. Хотя адресация по имени класса должно быть достаточно. В принципе, наверное, это будет работать, точнее, работать должно точно, и, возможно, даже не будет побочных эффектов. Мне не нравится такое грубое вмешательство в структуру форума, но попробовать можно.

#73 Marek

    Лейтенант

  • Посетители
  • PipPip
  • 348 сообщений

Отправлено 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 kapxapot

    Зангармаршал

  • Администраторы
  • PipPipPipPipPip
  • 19 687 сообщений
  • kapxapot#2853

Отправлено 24 Август 2012 - 12:00

Эк тебя понесло. :)

Придрался к моей фразе о том, что сервер генерирует HTML. А IPB где, по-твоему, расположен, на клиенте или в астрале? Если рассматривать клиент-серверную архитектуру на самом высоком уровне, то она и состоит из клиента и сервера (внезапно), соответственно, HTML, т.е. ответ сервера, формируется на сервере и сервером, который в себя включает уже PHP, IPB и прочие Апачи.

Вот глянул бы ты в админку, не пришлось бы фантазировать. Ну или спросил бы у меня. Есть возможность редактировать через админку шаблоны скинов форума, в том числе, и общий шаблон HTML. Файлы IPB при этом никак затронуты не будут. Т.е. внедрить JS-скрипт, который будет дергаться при загрузке страницы, в принципе, проблемы нет.

Проблемы тут только вот в чем могут быть:

1. Внедрять придется в каждый скин форума. И если набор этих скинов будет меняться, требуется заниматься поддержкой этого внедрения.

2. При обновлении форума скины обычно слетают, а с ними и все наши надстройки.

В принципе, и то и другое - не проблема, все это просто добавляет необходимые телодвижения в определенных случаях, от которых хотелось бы избавиться по возможности.

А почему ты ничего не сказал о моем предложении с редиректом? Это будет сделать чуть-чуть труднее, чем внедрение доп. JS в форум, но зато решение будет более чистым и поддерживать его будет впоследствии намного проще и удобнее.

#75 Marek

    Лейтенант

  • Посетители
  • PipPip
  • 348 сообщений

Отправлено 24 Август 2012 - 13:01

Просмотр сообщенияkapxapot (24 Август 2012 - 12:00) писал:

Эк тебя понесло. :)
Сам в шоке :)
Замнём, я слез с броневика уже :)

Просмотр сообщенияkapxapot (24 Август 2012 - 12:00) писал:

1. Внедрять придется в каждый скин форума. И если набор этих скинов будет меняться, требуется заниматься поддержкой этого внедрения.
Вот тут зависит от того, что из себя представляет "скин".
Если заголовок отделен (а там скин должен подключаться, поэтому заголовок должен быть отделен) - то если мы не используем для выделения элементов никаких привязок к тому, что скин приносит (а что он приносит, кроме определений css- классов? неужто и разметку?), никаких изменений кода с изменениями скина не будет.

Просмотр сообщенияkapxapot (24 Август 2012 - 12:00) писал:

2. При обновлении форума скины обычно слетают, а с ними и все наши надстройки.
Все тоже самое - если скин это переопределение классов(как я надеюсь и как по чистой науке должно быть), а обновление форума уберет из разметки часть этих классов, добавив какие-то другие (чертовы гении и не на то способны), то конечно код, который опирался на поиск элементов по теперь отсутствующим классам, не сработает. Без ошибок, просто молча и корректно не сработает. Рецепт зависит от конкретного кода и элемента дома, с коротым он должен сработать - когда/где/сколько элементов появляется.
Можно конечно для каких-то элементов делать свои обертки, уйдя вообще от зависимости от чужих идей с разметкой, но это уже действительно будет стрельба тяжелой артиллерией - нужно будет уже не только js(clien-side) , но и нарисовать свои хуки на стороне сервера, которые должны свои обертки сделать прозрачными с двух точек зрения - 1) с точки зрения Ipb (сложнее, ибо непредсказуемы пути их девелоперов) 2) с точки зрения рендеринга клиентских броузеров (легко, ибо стандарты).
В общем да, для обновлений форума, не трогающих разметку - особых проблем со скинами не видно.
Для меняющих разметку - есть некоторый гемор.

Просмотр сообщенияkapxapot (24 Август 2012 - 12:00) писал:

А почему ты ничего не сказал о моем предложении с редиректом? Это будет сделать чуть-чуть труднее, чем внедрение доп. JS в форум, но зато решение будет более чистым и поддерживать его будет впоследствии намного проще и удобнее.
а я его пропустил. А сейчас перечитал и не увидел в чем тут выигрыш.
ну ок, написали допустим мы фиготу типа (примерно):
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 анонимных