Russian TYPO3 community

Russian TYPO3 community (http://forum.typo3.ru/index.php)
-   TypoScript практикум (http://forum.typo3.ru/forumdisplay.php?f=27)
-   -   Вопрос по Conditions и Opera (http://forum.typo3.ru/showthread.php?t=6360)

-=UncleByte=- 01.06.2008 22:54

Вопрос по 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 в данном случае.
Поэтому и обращаюсь к сообществу с просьбой помочь разобраться.

void 02.06.2008 01:09

Как нам говорит исходный кот,
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 и написать мааленький экстеншен, и возвращать в нём значение только для оперы.

-=UncleByte=- 02.06.2008 01:24

Спасибо за разъяснения, Алексей. Наверное действительно нужно написать патч, поскольку Opera, в отличие от IE6, не нуждается в специальных css-трюках и нормально воспринимает xml пролог, а сделать для нормального браузера чистый и валидный вывод это хорошо и правильно.
К сожалению лично я врядли смогу написать патч или экстеншн в силу того, что я не программист, а дизайнер, хотя что-то простое и могу сделать при помощи php.
Поэтому остается надеятся на помощь сообщества.

pomotom 02.06.2008 02:10

хочу только отметить, что с точки зрения w3c валидатора отсутствие xml пролога ошибкой не является.

-=UncleByte=- 02.06.2008 02:30

Цитата:

Сообщение от pomotom (Сообщение 19261)
хочу только отметить, что с точки зрения w3c валидатора отсутствие xml пролога ошибкой не является.

Это я знаю и от пролога вполне можно отказаться, но вот в деле разделения css для нормальных браузеров и IE6 хотелось бы использовать возможности Typo3. Конечно, есть conditional comments, которые работают прекрасно, но если есть возможность не засорять код всякими "хитростями", думаю, ее можно и нужно использовать.

pomotom 02.06.2008 02:58

Это понятно. Подводные камни правда тоже есть - невозможность использовать статическое кеширование.

-=UncleByte=- 02.06.2008 03:03

Цитата:

Сообщение от pomotom (Сообщение 19264)
Это понятно. Подводные камни правда тоже есть - невозможность использовать статическое кеширование.

То есть для кеширования лучше не фильтровать браузеры на уровне Typo3?

pomotom 02.06.2008 08:15

Только при использовании кеширования в статику. Еще один возможный источник неприятностей - кеширующие прокси по дороге.
ИМХО, только добавит сложностей. Сonditional comments надежнее.

-=UncleByte=- 02.06.2008 17:01

Скорее всего так и придется поступить, оставлю conditional comments.
Но вот что странно — пробовал убрать условие для msie в conditions и оставить только условие для opera, так все равно Opera никак не определяется силами Typo3. Мистика какая-то.

pomotom 02.06.2008 19:27

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


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

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