Отправляет email-рассылки с помощью сервиса Sendsay

Веб-дизайн. От А до Я.

  Все выпуски  

Веб-дизайн. От А до Я. # 11 (37) Dweb.ru


Информационный Канал Subscribe.Ru


Веб - Дизайн. От А до Я.
# 11 (37)
11 ноября 2002г.
Проект сайта "AGS Design" Dweb.ru
   GoldHost.ru    Jobus.ru    DwebHost.ru
кол-во подписчиков - 16200


    В этом выпуске:

  • Cookie...
  • Дискуссионный форум.
  • Правильный выбор цвета.
  • Клуб друзей.
  •   Ссылки Вебмастеру:

  • Иконки и кнопки
  • Flash и Photoshop
  • Баннеры & Фото
  • 3D анимация & Фоны
  • Скрипты (CGI,JS,Applet)
  • Анимация
  • Форум
  • Хостинг
  • Web-дизайн
  • Обменные сети

  • Доброе время суток!


    Форум на DWEB.RU. Ответы на ВСЕ Ваши вопросы.

    Последние темы форума:
  • ЯваСкрипт и форма и фрейм
  • Выпадающее меню
  • PHP debuger
  • Java Script для открытия нового окна ( метод Clear) »Новое окно с генерируемым документом
  • Скрипт отправки файла на мыло
  • Как из JavaScript читать адресную строку »разбор формы на сайтах без серверных скриптов
  • Нужна помощь по размещению чата!
  • (Photoshop) »Проблемы с работой инструментов
  • Flas+фрейм
  • FLASH »обрезание, вырезание, нарезание, отрезание ...
  • Работаем с CrelDraw11 »Не получается изменить единицы измерения по умолчанию(мм)
  • Photoshop »почему картинки в ВЕБ квадратные?
  • CSS
  • Выпадающее меню
  • Кавычки в атрибутах
  • Отправка сообщения на e-mail
  • Шрифты в Macromedia Dreamweaver4 и Flash
  • Продолжать или нет...? »Продолжать или нет...? Сам не могу решить...
  • Создание сайта »Что нужно для создания сайта
  • MP3 топы »для вебмастеров работающих с mp3
  • Small Server
  • Курсы веб
  • Золотой Хостинг Без Ограничений!



    Cookie: Web-дизайн, Интернет-торговля и Хак

    Зачем Cookie нужен?
        Дело в том, что HTTP-протокол - одноразовый, если так можно выразиться. Т.е. каждый раз заходя на страничку, пользователь начинает сначала, что бы он не вводил, и какие изменения бы не делал. Cookie помогает создать иллюзию, что пользователя помнят на сайте. Пользователю не нужно вводить сотню раз одну и ту же информацию от странички к страничке, и даже от сессии к сессии, она хранится у него на диске. К удобству можно отнести еще и то, что эту информацию пользователь всегда сможет сменить у себя на диске "на лету". В Cookie также могут храниться другие разнообразные данные. Например, количество посещений какой-то страницы, время посещений. С помощью cookie не составляет труда сделать маленький органайзер или корзину в виртуальном магазине.

        Cookie многие не любят из-за ее небезопасности. Многие аналитики говорят, что это не проблема, и ничего плохого с помощью данной технологии сделать нельзя. Я с этим глубоко не согласен, если кто-то может читать информацию из файла(ов) cookie, то это уже небезопасно. Приведу чисто теоретические примеры, которые, при желании, не трудно воплотить в реальность.
        1. Допустим, пользователь зашел на почтовый сайт, заполнил форму с login'ом и паролем, которые записались в cookie, пускай даже через Secure Socket Level. Взломщик написал письмо пользователю в формате HTML с параметрами чтения cookie с паролями. Прочитав cookie, HTML-файл или запрашивает у пользователя разрешение отослать информацию взломщику, где пользователя можно обмануть ложной надписью а ля "Ошибки в сценариях Javascript!". Даже довольно опытный пользователь не задумываясь нажмет OK, после чего login и пароль отошлется взломщику. Или взломщик может добавить 0-ой фрейм, где будет временно содержаться информация из cookie, которая при ответе на письмо, будет вставляться в конец письма. Все это нетрудно сделать с помощью FORM и Javascript.
        2. Пример с виртуальным магазином. Допустим, мы имеем гипотетический магазин shop.provider.com. Совершая покупки в данном магазине, пользователь хранит информацию в cookie. Параллельно или до захода в магазин, пользователь зашел на гипотетическую страницу взломщика hacker.provider.com, где изменялись настройки cookie виртуального магазина. Взломщик может изменить количество покупок, имя, адрес, и все то, что хранится в данном cookie. Я думаю, вам бы не понравилось, если к вашим покупкам прибавили пару мониторов или отвезли ваши покупки не тому пользователю. Сделать это довольно просто, если иметь страничку в домене магазина второго или третьего уровня.
        Несколько других, уже ПРАКТИЧЕСКИХ примеров, я описывал в статье "Взлом через Cookie" (http://www.nvkz.kuzbass.net/gazzzeta/htm/136.htm).

        Итак, для пользователя технология cookie представляет собой несколько файлов в папке %WINDOWS%\Cookies (по умолчанию в Internet Explorer), либо всего один файл cookie.txt (если это Netscape Navigator и другие броузеры). Сайты периодически добавляют информацию в cookie и ее же забирают. Естественно, в спецификациях Cookie предусмотрены некоторые элементы защиты.

    • Всего Cookies может быть не больше 300.

    • Каждый Cookie не может быть больше 4kb.

    • С одного домена второго уровня (плюс подуровни) не может быть получено больше 20 Cookies.

    • Информация из Cookie одного домена второго уровня (плюс подуровни) не может быть прочитана другими доменами.

    • Если документ кэшируется, то информация о cookie не кэшируется.

    • Информация в\из Cookie может передавать с помощью протокола SSL.

        Если лимит исчерпывается, первые записи удаляются. Если Cookie становится больше 4kb, первые байты вырезаются.

        Формат Cookie.
        Полную спецификацию на английском можно найти на http://www.netscape.com/newsref/std/cookie_spec.html. В моей статье только сокращенное описание.
        Информация в Cookie задается принципом ИМЯ=ЗНАЧЕНИЕ. В одном документе может содержаться несколько Cookies (не больше 20). Минимальное описание поля Cookie выглядит так:
    Set-Cookie: NAME=VALUE;
    Максимальное выглядит так:
    Set-Cookie: NAME=VALUE; expires=DATE; path=PATH; domain=DOMAIN_NAME; secure

    • NAME=VALUE - NAME - Имя Cookie, VALUE - Значение. Можно менять как NAME, так и VALUE. Используются любые символы, кроме символа переноса строки, двоеточия, запятой и пробела.
      Пример: Имя=Вася

    • expires=DATE - Дата окончания действия Cookie. Менять только DATE. Вид такой: "expires=День, Число-Ден-ГГГГ ЧЧ:ММ:СС GMT". Если expires не обозначен, Cookie хранится до закрытия окна броузера.
      Пример: expires=Fri, 14-Sep-2005 13:13:13 GMT

    • domain=DOMAIN_NAME - домен на котором действителен Cookie. Вид такой: "domain=domain.com". Cookie будет действителен как для www.domain.com, так и для myname.domain.com. В зоне RU и других локальных зонах не работает. Используется только для COM, EDU, NET, ORG, GOV, MIL и INT. Если domain не обозначен, используется доменное имя сервера с Cookie.
      Пример1: domain=mamapapa.com
      Пример2: domain=gazzzeta.da.ru

    • path=PATH - Указывает имена докментов, для которых действительно значение Cookie. Вид такой: "path=/word". Cookie будет отсылаться в директориях /word, /word2000 и файлов в текущей директории с именами word.htm, wordchampion.html. Для применения Cookie ко всему серверу указывается корневой каталог сервера /. Если path не указан, Cookie распространяется только на текущую директорию.
      Пример1: path=/gazzzeta
      Пример2: path=/

    • secure - Если указан, при передаче Cookie используется HTTPS (HTTP с SSL - Secure Socket Level). Если secure не указан, Cookie передается HTTP.

        Если Cookie использует одинаковое значение NAME, domain и path - старое значение заменяется новым.

        Вставка Cookie в HTML.
        Вставить Cookie можно несколькими способами. Самые простой - это через META-тег. Альтернативным способом является Javascript и всевозможные другие технологии (CGI, PHP, SSI и т.д.). Рассматривать CGI, PHP, SSI и прочие мы не будем, т.к. это требует от вашего домена, где располагается страница, возможности использования этих технологий, что бывает не всегда.

        Использование Cookie через META-тег.
        Между тегов <HEAD> и </HEAD> Cookie вписывается так:
    <META HTTP-EQUIV="Set-Cookie" CONTENT="NAME=VALUE; expires=DATE; domain=DOMAIN_NAME; path=PATH; secure">
    Можно использовать несколь META-тегов с Cookie в одном документе.
    Пример: <META HTTP-EQUIV="Set-Cookie" CONTENT="Имя=Вася; expires=Fri, 14-Sep-2005 13:13:13 GMT; path=/; domain=provider.com; secure">

        Использование Cookie через Javascript.
        Использование Cookie с помощью Javascript является самым популярным способом, т.к. это довольно просто для разработчика, не требует от сервера определенного программного обеспечения и может использовать динамичные данные, генерируемые внутренним Javasript-скриптом, либо вводимые пользователем.
        Вот примера скрипта Javascript, используещего Cookie. Скрипт не мой, но он точно описывает те возможности, о которых мы говорим. К сожалению, автора скрипта я не знаю поэтому указать не могу.
    <script language="JavaScript">
    <!--
    var username = GetCookie('username');
    if (username == null) {
    username = prompt(' Пожалуйста, введите Ваше им\я\n (в противном случае нажмите cancel)',"");
    if (username == null) {
    alert('Ну хорошо, тогда я буду звать Вас ВебСёрфером');
    username = 'ВебСёрфер';
    } else {
    pathname = location.pathname;
    myDomain = pathname.substring(0,pathname.lastIndexOf('/')) +'/';
    // Установка параметра expire на год вперед.
    var largeExpDate = new Date ();
    largeExpDate.setTime(largeExpDate.getTime() + (365 * 24 * 3600 * 1000));
    SetCookie('username',username,largeExpDate,myDomain);
    }
    }
    function getCookieVal (offset) {
    var endstr = document.cookie.indexOf (";", offset);
    if (endstr == -1)
    endstr = document.cookie.length;
    return unescape(document.cookie.substring(offset, endstr));
    }
    function GetCookie (name) {
    var arg = name + "=";
    var alen = arg.length;
    var clen = document.cookie.length;
    var i = 0;
    while (i < clen) {
    var j = i + alen;
    if (document.cookie.substring(i, j) == arg)
    return getCookieVal (j);
    i = document.cookie.indexOf(" ", i) + 1;
    if (i == 0)
    break;
    }
    return null;
    }
    function SetCookie (name, value) {
    var argv = SetCookie.arguments;
    var argc = SetCookie.arguments.length;
    var expires = (argc > 2) ? argv[2] : null;
    var path = (argc > 3) ? argv[3] : null;
    var domain = (argc > 4) ? argv[4] : null;
    var secure = (argc > 5) ? argv[5] : false;
    document.cookie = name + "=" + escape (value) +
    ((expires == null) ? "" : ("; expires=" +
    expires.toGMTString())) +
    ((path == null) ? "" : ("; path=" + path)) +
    ((domain == null) ? "" : ("; domain=" + domain)) +
    ((secure == true) ? "; secure"; : "");
    }
    document.write('<p align=center>Здравствуйте, ' + username + '</p>');
    // --></SCRIPT>

        Останавливаться на данном скрипте смысла нет, статья о Cookie, а не о Javascript.

        Как видите, технология Cookie предоставляет огромные возможности для разработчиков сайтов. Cookie поддерживается всеми более или менее известными броузерами, такими как Netscape Navigator, Microsoft Internet Explorer, Mosaic, Opera и другими, начиная с самых первых версий.

    Автор: [X]-tenDead MoPo[3]
    E-mail: gazzzeta@inbox.ru
    Home Page: http://gazzzeta.da.ru



    Оглавление/Вверх


    Дискуссионный форум (perl+mySQL)

    Форум — это неотъемлемая часть любого серьезного сайта в Интернет. Веб-мастеру очень важно предоставить своему посетителю возможность задать вопрос и получить на него ответ по заданной теме. Это делает ваш сайт более интерактивным и более содержательным. Следовательно, сайт становится привлекательнее не только для тех, кому нужна помощь, но и кто хочет выразить свое мнение, поспорить или просто помочь нуждающимся.

    Предположим, вы захотели иметь у себя такую приятную вещь, как дискуссионный форум. Первой посещает вашу голову мысль о том, что можно просто найти подходящий готовый форум в Интернет. Берем готовый код, размещаем его на сервере, делаем некоторые настройки и все. Форум готов к использованию. Однако при такой идеологии вы натыкаетесь на множество проблем: необходимо блюсти закон об авторских правах, общедоступность сказывается на надежности и ваши потребности могут быть не удовлетворены возможностями найденного вами форума. Поэтому всегда лучше (если, конечно же, есть возможность) писать самому. Таким образом, вы без проблем сможете вылавливать возникающие ошибки, добавлять и изменять код, ну и, естественно, вы приобретаете бесценный опыт в программировании форумов.

    Итак, после долгих и мучительных раздумий вы все же решились писать форум своими силами. Первой предстает проблема выбора технологии. На ум приходят три варианта: первый — это Java-апплеты, второй — php, и третий — CGI.

    Java-апплетами можно воспользоваться только совместно с CGI или JDBC. И не факт, что в браузер пользователя встроена поддержка Java или просто она отключена, как опция. Поэтому этот вариант можно опустить.

    Теперь предстоит выбрать: php или CGI? У каждой из этих технологий есть свои преимущества и недостатки. Однако остановимся на последнем. Для CGI воспользуемся уже ставшим просто родным языком для написания CGI-скриптов — языком perl.

    Что касается СУБД, то здесь выбор большой. Это может быть любая СУБД, которая имеет драйвер DBD. К примеру, mySQL.

    Перед тем, как перейти непосредственно к написанию, необходимо определиться с форматом таблиц базы данных. Любой форум должен подразделяться на обсуждаемые темы, в которых в свою очередь есть свои подтемы (вопросы). Их и обсуждают участники форума. Создавать на каждый тематический форум отдельную таблицу было бы очень расточительно, поэтому надо найти альтернативное решение. Для списка названий тематических форумов и их идентификаторов создадим отдельную таблицу, предварительно создав новую базу данных. Пусть имя базы данных будет FORUM, а таблицу назовем FIDS (Forum's IDentificatorS):

    CREATE TABLE FIDS(FID CHAR(5), NAME CHAR(25));

    Имеем два поля: первое — FID, идентификатор форума со строковым типом и размером в 5 символов, и второе — NAME, имя соответствующее идентификатору форума, размер этого поля 25 символов. Теперь добавим туда несколько записей:

    INSERT INTO FIDS VALUES('01','Основной');
    INSERT INTO FIDS VALUES('02','Программирование на perl');
    INSERT INTO FIDS VALUES('03','Служебный');


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

    CREATE TABLE MESSAGES (ID CHAR(10), FID CHAR(10), FROM_N CHAR(45), TO_N CHAR(45), SUBJ CHAR(70), EMAIL CHAR(70), MSG_TEST TEXT, DATETIME CHAR(20));

    где ID — идентификатор записи (сообщения);
    FID — идентификатор форума, куда было помещено это сообщение;
    FROM_N — имя пользователя, который отправил сообщение;
    TO_N — имя адресата сообщения;
    SUBJ — тема сообщения (причем для того, чтобы отличать темы исходного сообщения от ответов, можно в начале темы вставлять, к примеру, "0" и потом делать проверку);
    EMAIL — электронный адрес отправителя;
    MSG_TEXT — непосредственно текст сообщения;
    DATETIME — это время и дата в Unix-формате;

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

    В результате мы получили реляционную базу данных, состоящую из двух таблиц, связанных по полю FID. Почему мы вынесли названия форумов в отдельную таблицу, станет понятно далее.

    Существуют форумы, для участия в которых вам необходимо сначала зарегистрироваться, чтобы в дальнейшем участвовать в дискуссиях. Это тот же www.talk.ru. Но это специализированный сайт. Мы же пытаемся спроектировать форум для собственного сайта, поэтому регистрация нужна только для тех, кто не боится, что посетитель не захочет проходить процедуру регистрации ради того, чтобы задать один единственный вопрос. Для регистрации нужно выделить отдельную таблицу. В ней будут храниться основные сведения о зарегистрированных пользователях, их пароли и идентификаторы. Чтобы не позволить не зарегистрированным пользователям пользоваться форумом, есть два способа.

    Первый — записать ему cookie, где будут храниться его идентификатор и пароль на длительный срок. Считывая их при попытке входа в форум и проверяя на соответствие с данными в таблице, допускаем зарегистрированного пользователя и обновляем его cookie (хотя это и не обязательно).

    Второй — это каждый раз при попытке входа в форум запрашивать пользовательский логин и пароль, после чего записывать ему временный cookie (если требуется абсолютная проверка при каждом обновлении страниц форума).

    Теперь что касается непосредственно кода скрипта. Я за долгое время работы с CGI понял, что использование одного файла-скрипта является наиболее оптимальным, нежели написание отдельного скрипта для выполнения каждой функции. Для того чтобы разделить функции внутри одного скрипта, достаточно передавать ему дополнительный параметр с номером выполняемого действия. Важно также то, как вы его назовете. Не надо придумывать явное имя, по которому можно с легкостью определить, что этот параметр делает. Назовите его, к примеру, "a"(Action). Каждая цифра (значение параметра "a") будет обозначать какое-то действие:
    1 — вывести сообщения форума;
    2 — добавить сообщение в форум;
    3 — ответить на сообщение в форуме.

    Для того чтобы определять, сообщения какого форума будем выводить, введем дополнительный параметр. Он будет иметь значение идентификатора форума. Тут нам и пригодилось то выделение отдельной таблицы с идентификаторами форумов. Это освобождает от передачи имени форума в качестве параметра скрипта, что было бы очень не удобно. Назовем это параметр "fn" (Forum Number).

    Таким образом, если нам надо вывести сообщения из форума "Основной", зная, что его идентификатор равен 1, то скрипту мы передаем следующую строчку параметров:

    "a=1&fn=1"

    Сразу оговорюсь насчет метода передачи параметров скрипту. В случае, когда вы хотите вывести форум, то оптимальным вариантом будет использование метода GET. Почему? Просто ссылку на форум проще будет оформить обычным тегом <a>, а не формой. Т.е. для того, чтобы вызвать "Служебный" форум, просто вставляем в HTML-документ следующую ссылку:

    <a href="адрес_вашего_скрипта?a=1&fn=1">Перейти к "Служебному" форуму</a>

    При ответе на сообщения возникает необходимость передавать скрипту идентификатор сообщения, на которое пользователь пожелал ответить. Следует ввести новый параметр с именем, например, mid (Message IDentificator). 
    Пример строки запроса (параметров) скрипту:

    "a=3&fn=1&mid=2"

    Т.е. мы говорим скрипту, что мы хотим ответить (a=2) в форуме с идентификатором 1(fn=1) на сообщение с идентификатором 2(mid=2).

    В ответ на этот запрос скрипт должен построить следующий запрос к базе данных:

    SELECT * FROM MESSAGES WHERE (ID = 2);

    Если вам не нужны все поля из этой таблицы, то вместо * можно в круглых скобках указать список полей через запятую, которые вам нужно выбрать. После выборки сообщения скрипт должен сформировать HTML-документ. В нем должна присутствовать форма, в которой уже будут заполнены некоторые поля данными из базы данных. Плюсом к вашему форуму может стать квотинг текста. Квотинг — это пометка текста инициалами автора. Это значит, что перед каждой строчкой нужно вставить что-то такое: "AL>", где AL — это инициалы автора. Квотить нужно только то сообщение, на которое собираются отвечать. Вот как это выглядит:

    AL> Кто-нибудь уже занимался программированием систем дистанционного обучения?
    AL> Посоветуйте чего бы почитать на эту тему?

    А ниже пользователь, отвечающий на это сообщение, будет писать свой ответ. Такой подход позволяет легко ориентироваться, кто что писал.

    После вывода этого документа пользователь отвечает на сообщение, нажимает кнопку "отправить". Форму нужно связать с функцией добавления сообщения (a=2). Это осуществляется при помощи скрытых полей:

    <input type=hidden name="a" value=2>

    Это что касается метода GET при выводе форума и ответе на сообщение. По-другому дело обстоит, когда пользователь производит добавление сообщения в форум. В этом случае лучше использовать метод POST: пользователь не будет смущен множеством непонятных символов в строке ввода адреса; этот метод более приспособлен к отправке скрипту больших объемов данных. Позволю себе напомнить, что при использовании метода POST параметры в скрипте необходимо считывать со стандартного устройства ввода (STDIN), а не из переменной окружения QUERY_STRING, как с методом GET.

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

    Очень полезный момент при добавлении сообщения — это возможность получать ответы на свой вопрос по электронной почте, например, когда пользователь по какой-либо причине не может вовремя зайти на форум, но очень сильно ждет ответа на свой вопрос. Для этого в форме ввода сообщения добавьте элемент checkbox примерно так:

    <input type=checkbox name=um> Отсылать сообщения, адресованные мне

    В базе данных вам нужно будет либо добавить новую таблицу, либо добавить новое поле в таблицу сообщений или просто установить флажок в начале одного из полей (это может быть 0 или 1 в начале темы сообщения). И при каждой операции добавления сообщения нужно проверять наличие флажка, и если он установлен, то посылать этот ответ на адрес электронной почты пользователю. Этот электронный адрес и флажок находятся в том же сообщении, на которое отвечает пользователь. Реализация этой опции не должна вызвать у вас затруднения. Теперь перейдем к вопросу реализации самого скрипта. Первое, что хотелось бы отметить, — это шаблоны. Сейчас мало кто использует эту технологию. Но в CGI-программировании она просто не заменима. Без шаблонов попытка изменить внешний вид HTML-документов и форм в них вынуждает делать изменения в самом скрипте. Этого можно избежать, пользуясь шаблонами. Вы пишите любой код на HTML, параллельно вставляя специальные теги в те места, где должны находиться переменные, которые предварительно будут заменяться скриптом на значения переменных. Приведу пример шаблона:

    <html>
    <head><title>%%vmForumName%%</title> </head>
    <body>
    <table border = 0>
    %%vmMessages%%
    </table>
    <form>
    <!-здесь описывается форма для добавления нового сообщения
    </form>
    </body>
    </html>


    В этом шаблоне текст, заключенный в %%, и есть те самые специальные теги. В нашем случае vmForumName будет заменен на имя форума, а vmMessages — на список сообщений. Причем список сообщений должен быть сгенерирован на основании склеивания предварительно заполненных шаблонов сообщения. Это означает, что нужно описать еще один шаблон для сообщений:

    <tr>
    <tr>
    <td>#%%vMsgID%%</td><td>%%vMsgDateTime%%</td>
    </tr>
    <tr>
    <td>%%vSubj%%</td><td>From: %%vFrom%%</td><td>To: %%vTo%%</td>
    </tr>
    <tr>
    <td>%%vText%%</td>
    </tr>
    </tr>


    Здесь описан шаблон одного сообщения. По названиям переменных можно догадаться, на что они будут заменены. Этот шаблон, естественно, не несет в себе чего-то такого, что можно было бы назвать дизайном. Это просто пример.
    Эти шаблоны чем-то напоминают XML.:)

    Теперь рассмотрим пример парсеров (обработчиков) этих шаблонов. Нам нужно две функции. Первая будет обрабатывать шаблон и выводить его непосредственно на стандартный поток вывода (STDOUT), что фактически означает вывод на экран браузера. А другая будет просто парсить шаблон и возвращать его уже обработанным. Вторая функция нам необходима для того, чтобы создать строчку, содержащую все склеенные и обработанные шаблоны с сообщениями.

    Приведу пример кода:

    sub put_template {
    my($tpl_n) = $_[0];
    my($fn);
    $fn = $VAR{$tpl_n};
    if (!open (TPL, "$fn"))
    {
    print "Content-type: text/html\n\n",
    $q->start_html("$lng1{'2'}"),
    $q->h1("Error: $lng1{'1'} шаблон"),
    $q->end_html;
    die;
    }
    while (<TPL>)
    {
    chomp($_);
    $_ =~ s#%%([^>%]+)%%#$HTML_VAR {$1}#g;
    print "$_"."\n";
    }
    close (TPL);
    }

    sub parse_template {
    my($tpl_n) = $_[0];
    my($fn,$r_s);
    $fn = $VAR{$tpl_n};
    if (!open (TPL, "$fn"))
    {
    print "Content-type: text/html\n\n",
    $q->start_html("$lng1{'2'}"),
    $q->h1("Error: $lng1{'1'} шаблон"),
    $q->end_html;
    die;
    }
    while (<TPL>)
    {
    chomp($_);
    $_ =~ s#%%([^>%]+)%%#$HTML_VAR{$1}#g;
    $r_s.= "$_"."\n";
    }
    close (TPL);
    return $r_s;
    }


    Первая подпрограмма выводит результат на STDOUT, а вторая возвращает значение.

    Я сознательно не захотел объединять их в одну подпрограмму.

    Подпрограммы пользуются значениями двух хешев: %VAR и %HTML_VAR. В первом хранятся соответствия названий (альясов) шаблонов с именами файлов этих шаблонов, а во втором — переменные. Вот как они выглядят:

    %VAR = (
    'msg_tpl' => './tpl/message.tpl',
    'main_tpl' => './tpl/main.tpl'
    );

    %HTML_VAR = (
    'vmForumName' => '',
    'vFrom' => ''
    );


    Перед выводом шаблона мы должны переопределить все переменные, которые используются в данном шаблоне:

    $HTML_VAR{'vmForumName'} = "Основной";
    put_template('main_tpl');


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

    Важным моментом является выбор пакета для работы с CGI на perl. Их существует масса (www.cpan.org). Однако огромной популярность по праву обладает CGI.pm, разработанный Линкольном Штейном. Но зачем? Вы ведь можете написать свою библиотеку подпрограмм и работать с ней. У этого способа есть множество недостатков. Первый — это ошибки, второй — это то, что такие крупные пакеты, как CGI.pm, постоянно совершенствуются и стремятся за новшествами, которые вводит W3C, да и стоит ли изобретать велосипед?:-/

    Если вы пишете программный продукт и хотите, чтобы им могли пользоваться не только вы, то надо обеспечить его как можно большим числом настроек. Под настройками в данном случае понимается инициализация переменных в начале скрипта. Это могут быть: количество выводимых на экран сообщений; имя базы данных, с которой будем работать; IP-адрес СУБД; различные флажки, к примеру, на предмет удаления старых писем. Это позволит вашему скрипту быть как можно гибким при переносе на другой сервер.

    Обязательно добавляйте комментарии. Это позволит вам не только самому, после долгого отвлечения от проекта, восстановить все в памяти, но и другим людям понимать ваш код (что очень важно при написании серьезных проектов).

    Хотелось бы отметить еще один момент. После добавления будет лучше, я думаю, вывести сразу список сообщений вместе с добавленным сообщением. Это можно сделать при помощи добавления в заголовок HTML опции Refresh:

    Content-type: text/html
    Refresh: 0;url=ваш_скрипт?a=1&fn=1


    Параметр url указывает, на что сменить адрес, 0 — это время задержки перед тем, как сменить текущий адрес. Хотя это можно было бы сделать и при помощи JavaScript:

    <body onLoad="location.href='ваш_ скрипт?a=1&fn=1';">

    Т.е. при загрузке страницы переходим на новый адрес. Это позволит пользователю сразу увидеть, что его сообщение было внесено в базу данных.

    Кстати, насчет баз данных. SQL-запросы надо строить на основании возможностей СУБД. Если вы планируете переносить свою программу на разные СУБД, то нужно поддерживать ANSI SQL. Однако это тоже не всегда помогает. Например, в mySQL я не нашел вложенных запросов. Так что лучше формировать несколько простых, нежели один, но сложный. Тем более что небольшие запросы отрабатывают намного быстрее. К этому также относится и проблема выборки больших объемов. Лучше и проще пытаться сформировать запросы, как можно больше ограничивающие рамки результативных данных. Т.е. ставить четкое условие, потому как постоянная передача больших объемов данных может существенно замедлить работу. А это никак не повысит имидж вашего форума.

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

    Источник: http://www.nestor.minsk.by/kg

    Алексей Литвинюк


    Оглавление/Вверх


    Правильный выбор цвета

    Цвет - воспринимаемая сетчаткой глаза область светового спектра, видимая часть света с длинами волн в диапазоне от 400 до 700 нанометров. Что? Думаете я только что прочитал Энциклопедию? Определение конечно же верно, но не передаёт всей важности цвета. Ведь всё, что нас окружает, не имеет в действительности никакой окраски. Просто у всех предметов разная способность отражать и поглощать свет, в результате чего мы видим отражённый телами или средами часть света, но уже с другим спектром волн (Дальтоникам дальше не читать). Цвет воспринимает глаз человека, но затрагивает его эмоции. Что может быть красивее заката у побережья тёплого моря в компании красивой девушки? Вот тут сердце стучит нормально, жизнь прекрасна и всё такое... А теперь представьте, что Вы не воспринимаете цвета, всё вокруг чёрно-белое... ну, или 256 оттенков серого :-) Это всё равно, что иметь чёрно-белый монитор.

    Важность цвета в нашей жизни поистине огромна. Так же огромна она и в Интернете, где всё на этом и держится. Умение правильно использовать цвет является атрибутом профессионализма WEB-дизайнеров. Это умение позволяет оформителю правильно задать атмосферу сайта, погрузить посетителя в свой мир. Хороший дизайнер всегда сначала продумывает цветовую схему, потом только начинает создавать графику. Искусство оформления приходит с опытом и всегда зависит от количества экспериментов разработчика. Чем больше цветовых комбинаций Вы переберёте, тем быстрее найдёте лучший вариант для своего сайта. Конечно, при этом следует знать некоторые тонкости этого дела:

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

    Согласованность оттенков: используйте для разных типов данных разные оттенки. Например, заголовки делайте синим цветом, предупреждения лучше делать красным, цвет основного текста должен быть тоже определён однозначно. При этом очень удобно пользоваться каскадными таблицами стилей, где Вы можете заранее определить стиль оформления Вашей странички.

    Контрастность: цвета фона и основного текста должны быть контрастными. Чем контрастнее, тем удобнее будет читать текст. Попробуйте читать голубой текст на белом фоне :-) Чёрный на белом, белый на чёрном, жёлтый на синем гораздо удобочитаемы. Всегда указывайте в теге <BODY> нужный Вам цвет фона, иначе рискуете столкнуть читателя с настройками его же собственного браузера. Некоторые специально прописывают браузеру использовать серый или пурпурный фон. Хотят смотреть сайты на фоне своего любимого цвета :-) К примеру, может получиться так, что цвет Вашего текста и их фона совпадут или будут схожи, тогда читатель может вообще текста не увидеть :-( Поэтому, не забывайте указывать на странице цвет её фона. На тёмном фоне лучше всего использовать белый или жёлтый цвета, голубой читается сложнее, можно и зелёный использовать. При выборе цвета фона и текста представляйте себе свою аудиторию. Для молодёжи с домашним Интернетом более привычен ночной выход в Интернет. Для них лучше создавать тёмный фон, светлый текст. Если Ваша аудитория состоит из людей пользующихся Интернетом на своей работе (в офисах, учреждениях), следует делать светлый сайт с тёмным текстом. По статистике светлый фон лучше тёмного.

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

    Красный:
    Возбуждение, энергия, страсть, желание, скорость, прочность, мощность, тепло, любовь, агрессия, опасность, огонь, кровь, война, насилие, агрессия, всё интенсивное и страстное.

    Желтый:
    Радость, счастье, оптимизм, идеализм, воображение, надежда, солнечный свет, лето, золото, философия, мошенничество, малодушие, предательство, ревность, жадность, обман, болезнь, риск.

    Синий:
    Мир, спокойствие, спокойствие, устойчивость, гармония, объединение, доверие, истина, доверие, консерватизм, безопасность, чистота, порядок, лояльность, небо, вода, холод, технология, депрессия, подавитель аппетита.

    Оранжевый:
    Энергия, баланс, тепло, энтузиазм, оживленный, экспансивный, пышный, требующий внимания.

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

    Пурпурный:
    Авторский Гонорар, духовность, благородство, церемония, непостижимый, преобразование, мудрость, просвещение, жестокость, высокомерие.

    Серый:
    Безопасность, надежность, интеллект, степенный, скромность, достоинство, завершенность, твердый, консерватор, практический, старость, печаль, сверление

    Коричневый:
    Земля, очаг, дом, на открытом воздухе, надежность, удобство, выносливость, устойчивость, простота и удобство.

    Белый:
    Почтение, чистота, простота, чистота, мир, смиренность, точность, невиновность, молодость, рождение, зима, снег, хорошо, стерильность, брак (Западные культуры), смерть (Восточные культуры), холодный, клинический, стерильный.

    Черный:
    Мощность, сексуальность, сложность, формальность, элегантность, богатство, тайна, страх, зло, анонимность, недовольство, глубина, стиль, зло, печаль, раскаяние, гнев, метрополитен, хороший технический цвет, траур, смерть (Западные культуры).

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

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

    А что может быть лучше этого?

    Евгений Жданов
    Источник: http://www.vebius.dax.ru/



    Оглавление/Вверх


      Рекомендуем
    Хотите получить диплом канадского колледжа график- и вэб-дизайна, не выходя из дома? . New Image School (Торонто, Канада) продолжает набор на дистанционное отделение. Подробности – на сайте колледжа.

    Клуб друзей
    * Строительство дач, домов - коттеджей, бань и т.д. в Подмосковье (100$ кв.м)
    * Изучение английского - Школьникам, взрослым людей. Рассылка сайта.
    * Практическая помощь веб-мастеру - услуги и помощь веб-мастеру.
    * Музыка, кино - музыка в кино и в мультипликации, ЗАПОВЕДЬник, языки.
    * Для Дизайнера
    * Праздник каждый день - традиции, обычаи, приметы, рецепты, гороскоп.
    В "Клуб друзей" может попасть любой сайт. Ссылки вращаются по КРУГУ постоянно. Как в рассылке, так и на сайте. Правила.

    ICQ - Клуб

    Адрес Клуба http://dweb.ru/1/icq.htm

    Если у Вас возник вопрос по дизайну, графике, скриптам и т.п. То Вы в любой момент можете его задать на странице Клуба любому консультанту находящегося в on-лайне.

    Для тех, кто может, а главное хочет поделиться своими знаниями, Вы можете вступить в наш Клуб, для этого присылайте # ICQ, Имя, E-mail, Город, и темы по которым возможна консультация.


    Оглавление/Вверх

    Авторам

    Вы хотите, чтобы ваши статьи были опубликованы в рассылках 'Веб-Дизайн, азы' и 'Веб-Дизайн. От А до Я'? Если вы считаете, что можете написать о дизайне, скриптам, графике и т.п., если Вам есть что сказать и о чем рассказать, я буду рад сотрудничеству с Вами. Присылайте свои предложения и статьи.
    Давайте вместе делать общее дело! Присылайте свои соображения, мысли, истории... поделитесь своим опытом.
    В качестве гонорара Вы получите несколько строк под Вашей статьёй, для рекламы/описания Вашего сайта.
    Буду рад сотрудничеству.


    Давыденко Дмитрий.     http://dweb.ru/

    © 2000-2002 Copyright by Dweb.RU
    Копирование материалов рассылки возможно только в случае явного указания на сайт "Dweb.RU" как на источник информации. При этом обязательно явное указание адреса: http://dweb.ru/


  • http://subscribe.ru/
    E-mail: ask@subscribe.ru
    Отписаться
    Убрать рекламу

    В избранное