Russian TYPO3 community Форум больше не используется. Присоединяйтесь к каналу #community-ru в Slack for TYPO3 community  

Вернуться   Russian TYPO3 community > Тематические форумы > TypoScript практикум

Ответ
 
Опции темы Опции просмотра
Старый 01.06.2008, 22:54   #1
-=UncleByte=-
Senior Member
 
Регистрация: 14.04.2006
Сообщений: 1,159
Отправить сообщение для -=UncleByte=- с помощью ICQ Отправить сообщение для -=UncleByte=- с помощью Skype™
По умолчанию Вопрос по Conditions и Opera

Решил попробовать сделать чистый и валидный код с разделением по браузерам и, само собой, начал с основного конфига и css предполагая разделить выдачу разным браузерам при помощи Conditions.
Написал следующий код, который должен предохранить MSIE6 от перехода в quirks mode:
Код:
temp.doctypeSwitch = TEXT
temp.doctypeSwitch = 0 
[browser = msie]&&[version = <7]
temp.doctypeSwitch = 1
[end]

config {
  ...
  doctype = xhtml_trans
  doctypeSwitch < temp.doctypeSwitch
  ...
}
Все работает идеально — Firefox, Safari, IE7 определяются Typo3 нормально и вывод соответствует ожиданиям, но вот Opera определяется как IE6 и никак не определяется как Opera. Причем не определяется даже и прямом условии [browser = opera].
Opera у меня самая что ни на есть стандартная, версии 9.27. Ничего из дефолтного конфига ее не менялось вообще, поскольку ставилась она исключительно для тестирования верстки сайтов. Версии Typo3, на которых проверял этот код 4.2 и 4.1.6 — результат идентичный.
Возможно все дело в строке идентификации браузера
Код:
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 9.27
но, как я понимаю, она стандартна для любой версии Opera 9.x и никак не меняется и Typo3 должна об этом знать применяя Conditions при выводе страниц.
Возможно что и я как-то неверно понимаю и пытаюсь применить Conditions в данном случае.
Поэтому и обращаюсь к сообществу с просьбой помочь разобраться.
-=UncleByte=- вне форума   Ответить с цитированием
Старый 02.06.2008, 01:09   #2
void
Senior Member
 
Аватар для void
 
Регистрация: 14.03.2006
Адрес: Russia, Penza
Сообщений: 1,504
Отправить сообщение для void с помощью ICQ
По умолчанию

Как нам говорит исходный кот,
PHP код:
    function browserInfo($useragent)    {
        foreach(
$this->hookObjectsArr as $hookObj)    {
            if (
method_exists($hookObj'browserInfo')) {
                
$result $hookObj->browserInfo($useragent);
                if (
strlen($result)) {
                    return 
$result;
                }
            }
        }

        
$useragent trim($useragent);
        
$browserInfo=Array();
        
$browserInfo['useragent']=$useragent;
        if (
$useragent)    {
            
// browser
            
if (strstr($useragent,'MSIE'))    {
                
$browserInfo['browser']='msie';
            } elseif(
strstr($useragent,'Konqueror'))    {
                
$browserInfo['browser']='konqueror';
            } elseif(
strstr($useragent,'Opera'))    {
                
$browserInfo['browser']='opera';
            } elseif(
strstr($useragent,'Lynx'))    {
                
$browserInfo['browser']='lynx';
            } elseif(
strstr($useragent,'PHP'))    {
                
$browserInfo['browser']='php';
            } elseif(
strstr($useragent,'AvantGo'))    {
                
$browserInfo['browser']='avantgo';
            } elseif(
strstr($useragent,'WebCapture'))    {
                
$browserInfo['browser']='acrobat';
            } elseif(
strstr($useragent,'IBrowse'))    {
                
$browserInfo['browser']='ibrowse';
            } elseif(
strstr($useragent,'Teleport'))    {
                
$browserInfo['browser']='teleport';
            } elseif(
strstr($useragent,'Mozilla'))    {
                
$browserInfo['browser']='netscape';
            } else {
                
$browserInfo['browser']='unknown';
            }
            
// version
            
switch($browserInfo['browser'])    {
                case 
'netscape':
                    
$browserInfo['version'] = $this->browserInfo_version(substr($useragent,8));
                    if (
strstr($useragent,'Netscape6')) {$browserInfo['version']=6;}
                break;
                case 
'msie':
                    
$tmp strstr($useragent,'MSIE');
                    
$browserInfo['version'] = $this->browserInfo_version(substr($tmp,4));
                break;
                case 
'opera':
                    
$tmp strstr($useragent,'Opera');
                    
$browserInfo['version'] = $this->browserInfo_version(substr($tmp,5));
                break;
                case 
'lynx':
                    
$tmp strstr($useragent,'Lynx/');
                    
$browserInfo['version'] = $this->browserInfo_version(substr($tmp,5));
                break; 
в нём проверка на наличие в useragent строки MSIE стоит раньше, чем Opera, и, видимо, до этого case просто не доходит выполнение кода.
Стало быть, можно написать патч и послать его в core team, а можно воспользоваться любезно предоставленным Hook и написать мааленький экстеншен, и возвращать в нём значение только для оперы.
__________________
TYPO3 FAQ
void вне форума   Ответить с цитированием
Старый 02.06.2008, 01:24   #3
-=UncleByte=-
Senior Member
 
Регистрация: 14.04.2006
Сообщений: 1,159
Отправить сообщение для -=UncleByte=- с помощью ICQ Отправить сообщение для -=UncleByte=- с помощью Skype™
По умолчанию

Спасибо за разъяснения, Алексей. Наверное действительно нужно написать патч, поскольку Opera, в отличие от IE6, не нуждается в специальных css-трюках и нормально воспринимает xml пролог, а сделать для нормального браузера чистый и валидный вывод это хорошо и правильно.
К сожалению лично я врядли смогу написать патч или экстеншн в силу того, что я не программист, а дизайнер, хотя что-то простое и могу сделать при помощи php.
Поэтому остается надеятся на помощь сообщества.
-=UncleByte=- вне форума   Ответить с цитированием
Старый 02.06.2008, 02:10   #4
pomotom
Senior Member
 
Регистрация: 09.12.2007
Сообщений: 281
По умолчанию

хочу только отметить, что с точки зрения w3c валидатора отсутствие xml пролога ошибкой не является.
pomotom вне форума   Ответить с цитированием
Старый 02.06.2008, 02:30   #5
-=UncleByte=-
Senior Member
 
Регистрация: 14.04.2006
Сообщений: 1,159
Отправить сообщение для -=UncleByte=- с помощью ICQ Отправить сообщение для -=UncleByte=- с помощью Skype™
По умолчанию

Цитата:
Сообщение от pomotom Посмотреть сообщение
хочу только отметить, что с точки зрения w3c валидатора отсутствие xml пролога ошибкой не является.
Это я знаю и от пролога вполне можно отказаться, но вот в деле разделения css для нормальных браузеров и IE6 хотелось бы использовать возможности Typo3. Конечно, есть conditional comments, которые работают прекрасно, но если есть возможность не засорять код всякими "хитростями", думаю, ее можно и нужно использовать.
-=UncleByte=- вне форума   Ответить с цитированием
Старый 02.06.2008, 02:58   #6
pomotom
Senior Member
 
Регистрация: 09.12.2007
Сообщений: 281
По умолчанию

Это понятно. Подводные камни правда тоже есть - невозможность использовать статическое кеширование.
pomotom вне форума   Ответить с цитированием
Старый 02.06.2008, 03:03   #7
-=UncleByte=-
Senior Member
 
Регистрация: 14.04.2006
Сообщений: 1,159
Отправить сообщение для -=UncleByte=- с помощью ICQ Отправить сообщение для -=UncleByte=- с помощью Skype™
По умолчанию

Цитата:
Сообщение от pomotom Посмотреть сообщение
Это понятно. Подводные камни правда тоже есть - невозможность использовать статическое кеширование.
То есть для кеширования лучше не фильтровать браузеры на уровне Typo3?
-=UncleByte=- вне форума   Ответить с цитированием
Старый 02.06.2008, 08:15   #8
pomotom
Senior Member
 
Регистрация: 09.12.2007
Сообщений: 281
По умолчанию

Только при использовании кеширования в статику. Еще один возможный источник неприятностей - кеширующие прокси по дороге.
ИМХО, только добавит сложностей. Сonditional comments надежнее.
pomotom вне форума   Ответить с цитированием
Старый 02.06.2008, 17:01   #9
-=UncleByte=-
Senior Member
 
Регистрация: 14.04.2006
Сообщений: 1,159
Отправить сообщение для -=UncleByte=- с помощью ICQ Отправить сообщение для -=UncleByte=- с помощью Skype™
По умолчанию

Скорее всего так и придется поступить, оставлю conditional comments.
Но вот что странно — пробовал убрать условие для msie в conditions и оставить только условие для opera, так все равно Opera никак не определяется силами Typo3. Мистика какая-то.
-=UncleByte=- вне форума   Ответить с цитированием
Старый 02.06.2008, 19:27   #10
pomotom
Senior Member
 
Регистрация: 09.12.2007
Сообщений: 281
По умолчанию

Да нет, просто код такой. Сначала определяется useragent, а уже потом сравнивается. И на стадии определения Опере присваивается msie. А будет условие на msie или не будет - уже неважно.
pomotom вне форума   Ответить с цитированием
Ответ

Теги
conditions, opera

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB code is Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
opera кеширует FE demav Общие вопросы 0 07.04.2008 14:10
Вопрос по sr_language_menu Tod Общие вопросы 14 10.08.2007 19:29
Как работать с Typo3 в Opera? Boni-M Общие вопросы 9 07.06.2007 04:53
Поддержка Opera 9.x в TYPO3 4.1 Pavel Antonov Новости TYPO3-разработки 0 28.02.2007 16:29
Неудобства работы в IE и Opera GF Общие вопросы 3 16.01.2006 12:21


Часовой пояс GMT +4, время: 01:25.


Работает на vBulletin® версия 3.8.1.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot

Хостинг и техническая поддержка: TYPO3 Лаборатория