Форум пользователей Impera CMS
Impera CMS - отличный движок для лёгкого создания интернет магазина.
Обладает невероятным количеством функций, необходимых в онлайн торговле.

Следить
Главная
01:10
03 янв
#
?
написал:

Доброго времени суток, Дмитрий.
Вы просили подсказать, почему шаблон Electronics неправильно виден в Internet Explorer.
Источник проблемы в первой строке файла index.tpl.

<!DOCTYPE html>

Эта запись тега для стандарта HTML5.
Старые версии IE не поймут ее и будут показывать сайт только в режиме совместимости.
Нужно записать тег с указанием стрикта. Что там у вас по стилям в шаблоне я еще не смотрел.
От примененных стилей зависит стрикт. Примеры правильного тега.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

Попробуйте первый пример.

11:20
26 янв
#
?
написал:

При указании первого примера, валидатор выдает такие результаты: 106 Errors, 63 warning(s)

Если прописать так, как указано в вотором примере, получается: 114 Errors, 63 warning(s)

Если ничего не трогать: 6 Errors, 12 warning(s)

Плюс, когда прописывал по примерам, послазили некторые стили. Наверное, лучше действительно ничего не трогать...)

14:56
26 янв
#
?
написал:

IE особый случай. Везде под него пишут отдельные js-css фиксы.
Нельзя менять просто так doctype чтобы в IE стало красиво. В других броузерах может всё поехать к чертям.
Поэтому надо проверять user agent в шаблоне и если IE отдавать его doctype.

{$agent = $smarty.server.HTTP_USER_AGENT|default:'none'}
{if $agent|regex_replace:'/[ ;\(]msie \d+(\.\d+)?[;\(]/i':'' != $agent}
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
{else}
    <!DOCTYPE html>
{/if}

Наверно правильно проверять всё же версии IE. От версии к версии doctype менялся.

{if $agent|regex_replace:'/[ ;\(]msie 6(\.\d+)?[;\(]/i':'' != $agent}
    версия 6
{elseif $agent|regex_replace:'/[ ;\(]msie 7(\.\d+)?[;\(]/i':'' != $agent}
    версия 7
{elseif $agent|regex_replace:'/[ ;\(]msie 8(\.\d+)?[;\(]/i':'' != $agent}
    версия 8
{elseif $agent|regex_replace:'/[ ;\(]msie 9(\.\d+)?[;\(]/i':'' != $agent}
    версия 9
{elseif $agent|regex_replace:'/[ ;\(]msie 10(\.\d+)?[;\(]/i':'' != $agent}
    версия 10
{else}
    не IE или версия >=11
{if}

IE 11 уже понимает doctype на html5.

15:56
26 янв
#
написал:

Спасибо Клод. Поправлю ваше регулярное выражение следующим образом - на проверку любого пробельного символа в начале и конце отслеживаемой метки браузера и закрывающей скобки в конце, а не открывающей. Внесенные мной правки помечены таким цветом.

regex_replace:'/[\s;\(]msie \d+(\.\d+)?[\s;\)]/i':''


На мой взгляд пробельный символ в конце метки необходимо проверять на случай (конечно теоретический, но вполне возможный), когда метка браузера представлена какой-нибудь нестандартной строкой, например MSIE 8.0 Special Edition;, ведь в этом случае ваше регулярное выражение просто не опознает метку браузера, потому что в конце метки ожидает или точку с запятой, или скобку.

А пользователям движка объясню суть решения, предложенного Клодом. Взглянем на типичное содержимое браузерного заголовка User Agent, когда браузер сообщает о совместимости с Microsoft Internet Explorer.

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)


Поскольку эта информация доступна в PHP через переменную $_SERVER['HTTP_USER_AGENT'], содержимое которой шаблонизатор Smarty помещает в свою переменную $smarty.server.HTTP_USER_AGENT, то Клод предложил отследить метку браузера прямо в шаблоне, а именно в первой строке файла index.tpl, на основании чего сформировать тот или иной тег <!DOCTYPE html ...>.

В первой строке своего решения Клод получает значение браузерного заголовка User Agent в локальную переменную $agent. Модификатор |default:'' применен на случай отсутствия заголовка (нет жесткого требования, чтобы браузеры обязательно сообщали информацию о себе).

    {$agent = $smarty.server.HTTP_USER_AGENT|default:''}


В следующих строках решения производится сравнение локальной переменной (исходного значения заголовка) с тем же значением, пропущенным через модификатор |regex_replace:'искать':'заменить_на', который ищет в значении метку браузера и заменяет пустой строкой. Если сравнение дало несовпадение, значит в строке присутствовала искомая метка, и следовательно это искомый браузер.

Синтаксис регулярных выражений не все знают, поэтому объясню, что было закодировано в регулярном выражении. Я размечу выражение разными цветами и опишу смысл каждого.

    {if $agent|regex_replace:'/[\s;\(]msie \d+(\.\d+)?[\s;\)]/i':'' != $agent}

  • само выражение должно быть заключено в подобие кавычек (произвольный символ)
  • перед меткой должен быть пробельный символ, или точка с запятой, или открывающая скобка
  • метка состоит из текста MSIE и за ним через пробел некоторое ЧИСЛО
  • за ЧИСЛОМ не исключено что может быть точка и за ней число
  • за меткой должен быть пробельный символ, или точка с запятой, или закрывающая скобка
  • само выражение должно быть заключено в подобие кавычек (тот же произвольный символ)
  • за "кавычками" перечисляются флаги: i = обрабатывать выражение без учета регистра букв


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

Любые простые текстовые символы, - например s, d, w и некоторые другие, - которые хотят интерпретировать именно как специальные символы, должны предваряться слешем.

Написание ответа

Перед публикацией рекомендуется использовать Предпросмотр, чтобы увидеть конечный вид сообщения.


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