Авторские статьи Некоторые советы и мысли о программировании для Wap

Discussion in 'Статьи' started by Twoster, 3 Nov 2008.

  1. Twoster

    Twoster Members of Antichat

    Joined:
    20 Aug 2008
    Messages:
    287
    Likes Received:
    402
    Reputations:
    159
    Итак, я хочу поднять затертую до дыр тему wap’a!
    Многие в этот момент пойдут юзать поиск на сайте, чтобы показать, что таких тем было много! Однако я думаю, что в это статье будет нечто другое! (это по сути даже не статья, а мини-пособие для желающих начать работать в вапе)

    Я планирую описать проблемы при программировании на php под wap. И дать несколько советов (я всей душой надеюсь, что они будут полезны)

    1. Две версии разметки

    Новички, которые только начинают осваивать wap-программирование зачастую сталкиваются с проблемой создания своего сайта (скрипта) в двух версиях (обычно xHTML+WML). Многие делают два файла с разными разметками.
    Вот пример:

    xHTML-mobile Версия

    PHP:
    <?php
    header
    ("Content-type:application/vnd.wap.xhtml+xml; charset=utf-8");
    print 
    '<?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru">
    <head>
    <meta http-equiv="Content-Type" content="application/vnd.wap.xhtml+xml; charset=UTF-8" />'
    ;
    print 
    '<title>xHTML-mobile</title>';
    print 
    '</head><body><div>';

    print 
    'Текст, который нам нужно отобразить и в xHTML-mobile версии и в WML версии!<br/>';

    print
    '</div></body></html>';
    ?>
    WML Версия

    PHP:
    <?php
    header 
    ("Content-type:text/vnd.wap.wml; charset=utf-8");
    print 
    '<?xml version="1.0" encoding="UTF-8"?>';
    print 
    '<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">';
    print 
    '<wml><head><meta http-equiv="Cache-Control" content="no-cache" forua="true"/></head>';
    print 
    '<card title="WML-version">';
    print 
    '<p align="center">';

    print 
    'Текст, который нам нужно отобразить и в xHTML-mobile версии и в WML версии!<br/>';

    print 
    '</p></card></wml>';
    ?>
    Попробуем сделать один файл из этих двух!
    Я обычно разделяю обе версии оператором условия if, либо switch, так называемым «оператором выбора». Вот пример файла:
    PHP:
    <?php
    switch(@$_GET['version'])
    {
        case 
    'wml':
            
    header ("Content-type:text/vnd.wap.wml; charset=utf-8");
            print 
    '<?xml version="1.0" encoding="UTF-8"?>';
            print 
    '<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">';
            print 
    '<wml><head><meta http-equiv="Cache-Control" content="no-cache" forua="true"/></head>';
            print 
    '<card title="WML-version">';
            print 
    '<p align="left">';
            print 
    '<a href="?version=xhtml">xHTML-mobile Version</a><br/>';
        break;

        default:
            
    header("Content-type:application/vnd.wap.xhtml+xml; charset=utf-8");
            print 
    '<?xml version="1.0" encoding="utf-8"?>
            <!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
            <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru">
            <head>
            <meta http-equiv="Content-Type" content="application/vnd.wap.xhtml+xml; charset=UTF-8" />'
    ;
            print 
    '<title>xHTML-mobile</title>';
            print 
    '</head><body><div>';
            print 
    '<a href="?version=wml">WML Version</a><br/>';
        break;
    }
    ######################## Текст страницы ########################
    print 'Текст, который нам нужно отобразить и в xHTML-mobile версии и в WML версии!<br/>';
    ################################################################

    if(@$_GET['version']==='wml')
    {
        print 
    '</p></card></wml>';
    }
    else
    {
        print
    '</div></body></html>';
    }
    ?>

    Этот файл уже выдает валидные страницы в зависимости от выбранной разметки!


    1.1 Небольшое добавление к этому пункту!
    Как известно, наш «любимый» IE не хочет признавать разметки заточенные под wap! =( Для решения этой проблемы нам нужно, чтобы IE распознал страницу как валидную ему html. Действуем! Заменим 15 строку нашего скрипта:

    PHP:
    header("Content-type:application/vnd.wap.xhtml+xml; charset=utf-8");
    на

    PHP:
    if (ereg('xhtml',getenv("HTTP_ACCEPT")))
    {
    header("Content-type:application/vnd.wap.xhtml+xml; charset=utf-8");
    }
    else
    {
    header("Content-type:text/html; charset=utf-8");
    }

    (данный тип проверки можно сменить, при желании, например, проверять имя браузера, однако этот метод мне не нравится!)

    Все готово! Дальше!



    2. Сессии и WAP

    Как известно многие телефоны не поддерживают прием кукисов.
    (сейчас многие подумают, что последние модели телефонов поддерживают ВСЕ от mp3 до зубной щетки, однако не хочется обижать и владельцев стареньких моделей)
    Поэтому сделаем так, чтобы все передавалось только через идентификатор сессии.
    Создаем файл .htaccess в директории со скриптом следующего содержания:

    Отлично, теперь все в порядке!
    Теперь можно присвоить идентификатору имя и передавать его по ссылкам.
    Например:

    PHP:
    session_name("SID");

    print '<a href="?action=view&amp;'.SID.'">Просмотр</a><br/>';
    Некоторые замечания, советы и просто мысли по теме:
    a) Если Вы все таки решились использовать сессии вместо ранее популярных в WAP’е методов передачи авторизационных данных GET’ом (типа index.php?id=1&pass=1234), то желательно написать функцию, которая сверяет IP-адрес и Броузер пользователя в данный момент, с этими же переменными записаными в базе при последнем вызове скрипта (т.к. идентификатор передаваемый GET'ом довольно опасен в плане перехвата)! Я написал функцию, которая сверяет юзер-агент и Айпи по первым трем разрядам маски, т.к. телефоны подключенные через GPRS обычно имеют динамические адреса.

    b) Еще один момент, на который я хотел бы обратить внимание – это частое использование юзер-агента (getenv('HTTP_USER_AGENT')). В отличие от WEB в вапе юзер-агент используется практически повсюду, однако очень многие забывают его фильтровать! На это тоже стоит обратить внимание.

    Конечно многие вряд ли узнают что то новое из этого, однако я надеюсь, что эта тема кому-нибудь да поможет!
    Спасибо за внимание!
     
    4 people like this.
  2. satana8920

    satana8920 Палач Античата

    Joined:
    22 Sep 2006
    Messages:
    396
    Likes Received:
    138
    Reputations:
    6
    За старанья + но ты не затронул даже тему как его потом раскручивать на каких хостах размещать итд
     
  3. Twoster

    Twoster Members of Antichat

    Joined:
    20 Aug 2008
    Messages:
    287
    Likes Received:
    402
    Reputations:
    159
    satana8920, это уже тема другой статьи! В этой я планирую выкладывать только приемы и хитрости кодинга по wap, т.к. он немного различается с традиционным!
     
  4. AkeLLa

    AkeLLa Banned

    Joined:
    30 Aug 2008
    Messages:
    133
    Likes Received:
    243
    Reputations:
    1
    Для себя ничего нового не нашел, ты написал очень малую часть всех ньюансов которые там встречаються..
     
  5. zL0Bniy keNt

    zL0Bniy keNt Elder - Старейшина

    Joined:
    10 Sep 2006
    Messages:
    25
    Likes Received:
    22
    Reputations:
    -6
    Мне не знающему,только въезжаемому в эти темы!Было очень познавательно!+ за старание!