Использование пакета Cold Fusion для MS Windows при построении WWW - интерфейсов к базам данных

Использование пакета Cold Fusion для MS Windows при построении WWW - интерфейсов к базам данных.

5.1Введение

5.2Установка Cold Fusion

5.3Администрирование Cold Fusion

5.4Взаимодействие Cold Fusion с базами данных

5.5Передача параметров в DBML - шаблон

5.6Занесение и модификация данных с использованием тегов DBINSERT и DBUPDATE

5.7Выполнение запросов к базам данных

5.8Использование результатов запроса для динамического создания HTML - документа

5.9Вывод результата выполнения запроса в виде таблицы

5.10Дополнительные замечания по созданию DBML - шаблонов

5.11Использование параметров и переменных в шаблонах
5.11.1Поля формы и параметры URL
5.11.2Переменные окружения CGI
5.11.3Применение тега DBSET для создания переменных
5.11.4HTTP Cookies
5.11.5Использование результатов выполнения запросов

5.12Проверка корректности данных и форматирование вывода
5.12.1Проверка корректности данных в полях формы
5.12.2Функции вывода в DBML

5.13Динамическое изменение содержимого документа
5.13.1Условный оператор (DBIF & DBELSE)
5.13.2Перенаправление на другой URL (DBLOCATION & DBABORT)
5.13.3Включение в шаблон других шаблонов
5.13.4Определение типа данных MIME для содержимого документа

5.14Расширенные возможности
5.14.1Динамическое определение SQL выражения
5.14.2Поддержка транзакций
5.14.3Вложенные области вывода и группирования
5.14.4Использование списочных полей с множественным выбором
5.14.5Дополнительные команды SQL

При подготовке данной главы отчета использовались материалы " Cold Fusion User Guide " (Руководство пользователя пакета Cold Fusion).

5.1 Введение

Пакет Cold Fusion фирмы Allaire - это средство для быстрой разработки интерактивных, динамических документов для Web основанное на обработке информации из баз данных, в основе которого лежит следующий набор технологий:

  • HTML (Hyper-Text Markup Language)

  • CGI (Common Gateway Interface)

  • SQL (Structured Query Language)

  • ODBC (Open Database Connectivity)

Разработка приложений с использованием Cold Fusion не требует программирования на таких языках как Perl, C/C++, Visual Basic или Delphi. Вместо этого вы создаете приложение, встраивая в обычный (стандартный) HTML файл специальные теги для работы с базами данных.

В данной главе рассматривается Cold Fusion версии 1.5 .

5.2 Установка Cold Fusion

Cold Fusion запускается как CGI приложение на различных Web-серверах под Windows NT и Windows 95 и должен быть совместим с любым сервером поддерживающим CGI.

Cold Fusion тестировался на совместимость со следующими серверами:

  • O'Reilly WebSite

  • Microsoft Internet Server

  • EMWAC HTTPS

  • Process Software Purveyor

  • Netscape Communications/Commerce Server

  • Internet Factory Communications/Commerce Builder

  • Spry Safety Web Server

  • CSM Alibaba

Для связи с различными СУБД Cold Fusion использует 32-разрядные ODBC - драйвера. Для корректной работы с Cold Fusion ODBC - драйвер должен удовлетворять следующим требованиям:

  • Это должен быть 32-разрядный драйвер.

  • Он должен поддерживать Уровень 1 ODBC API.

  • Должна поддерживаться базовая грамматика SQL.

  • Для совместимости с функциями ввода даты/времени, драйвер должен поддерживать соответствующие типы данных.

Для установки и использования Cold Fusion система должна удовлетворять следующим требованиям:

  • Операционная система Windows NT 3.51(или выше) или Windows 95.

  • Микропроцессор 80386 или выше; рекомендуется Pentium.

  • 10Mb свободного дискового пространства.

  • 24Mb RAM для Windows NT или 16Mb для Windows 95

  • Установленная сетевая поддержка TCP/IP.

  • Установленный WWW сервер.

Для установки Cold Fusion нужно запустить программу SETUP.EXE, которая должна находится на инсталляционном диске 1.

Помимо копирования файлов, необходимых для работы Cold Fusion, в процессе установки, в корневой директории с документами Web сервера создается директория с именем CFPRO. Эта директория содержит:

  • Тест, для проверки правильности установки системы.

  • Мини-учебник, в формате HTML, помогающий освоить азы Cold Fusion.

  • Примеры приложений, демонстрирующие различные способы использования Cold Fusion.

Чтобы проверить правильность установки Cold Fusion, нужно открыть документ, URL до которого имеет вид http://myserver/cfpro/getstart.htm, где myserver - имя или IP адрес вашего Web сервера.

5.3 Администрирование Cold Fusion

Для администрирования в Cold Fusion предусмотрен специальный интерфейс администратора. Этот интерфейс позволяет изменять различные параметры настройки Cold Fusion по четырем категориям:

  • Data Sources - используется для настройки источников данных ODBC, для использования их с Cold Fusion. Чтобы добавить источник данных, нужно нажать на кнопку "Add...", выбрать один из установленных в системе драйверов ODBC и задать определенные для него настройки. Переопределить эти настройки можно воспользовавшись кнопкой "Setup...", предварительно выделив конкретный источник данных. Если нужно определить способы взаимодействия Cold Fusion с источником данных, то нужно нажать на кнопку "Preferences..." и определить такие атрибуты как имя пользователя, пароль, допустимые операции с базой данных и др.

  • Templates - используется для настройки логических путей до директорий в которых расположены файлы с шаблонами Cold Fusion.

  • Debugging - используется для настройки отладочных сообщений и сообщений об ошибках.

  • Mail - используется для настройки параметров SMTP mail и позволяет просматривать журнал сообщений и ошибок.

5.4 Взаимодействие Cold Fusion с базами данных

Cold Fusion позволяет динамически генерировать HTML документы основанные на запросах пользователя. Эти запросы передаются в Cold Fusion CGI - скрипт (DBML.EXE), который пересылает данные в Cold Fusion Engine обрабатывающий эти данные в соответствии с заданным шаблоном, выполняя необходимые запросы и генерируя HTML документ, который отправляется пользователю.

Основой динамического создания документов являются специальные теги, входящие в язык разметки DBML, ориентированные на работу с базами данных. Почти все основные возможности Cold Fusion сосредоточены в четырех тегах:

  • DBQUERY - выполнение SQL - запроса к базе данных;

  • DBINSERT & DBUPDATE - создание и модификация записей в базе данных;

  • DBOUTPUT - отображение результата запроса, допускающее его произвольное размещение среди HTML - тегов.

Шаблон, на основе которого генерируется HTML - документ, представляет собой комбинацию тегов HTML и DBML:

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

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

На рисунке 5-1 показывается, как Cold Fusion обрабатывает запрос, полученный от клиента:


Рисунок 5-1

  1. Когда пользователь нажимает кнопку типа "Submit" в форме или выбирает гипертекстную ссылку в документе, Web - браузер отправляет запрос на Web - сервер.

  2. Web - сервер, если в запросе указан DBML - шаблон, запускает процесс Cold Fusion, отправляя ему данные полученные от клиента.

  3. Cold Fusion принимает данные полученные от клиента обрабатывает теги DBML в шаблоне, включая подготовку запроса к базе данных и форматирование, которое будет использоваться в результирующем документе.

  4. Cold Fusion взаимодействует с базой данных используя ODBC.

  5. Cold Fusion динамически генерирует HTML - документ содержащий результат выполнения запросов к базе данных и возвращает его Web - серверу. Cold Fusion может также динамически генерировать почтовое сообщение и отправлять его через почтовый SMTP - сервер.

  6. Web - сервер возвращает сгенерированный HTML - документ Web - клиенту.

5.5 Передача параметров в DBML-шаблон

Существует несколько способов передачи параметров между шаблонами. Можно передавать параметры непосредственно в URL, использовать для этого форму либо cookie.

Если параметры передаются через URL, то они добавляются к адресу вызываемого шаблона через символ "&" (амперсант) в виде параметр = значение. Например, гипертекстовая ссылка, приведенная ниже, отправляет параметр с именем 'user_id' и значением 5 в шаблон 'example.dbm':

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




Заметим, что при обращении к CGI - программе DBML.EXE должен быть определен стандартный параметр Template, указывающий на конкретный шаблон.

Переменные, занесенные в cookie браузера и переменные окружения CGI доступны в любом шаблоне. Способы занесения информации в cookie описаны в п.5.11.

5.6 Занесение и модификация данных с использованием тегов DBINSERT и DBUPDATE

При использовании тегов DBINSERT и DBUPDATE для занесения или модификации данных, параметры должны быть переданы в шаблон обязательно из формы, используя метод POST.

Для создания новой записи в базе данных используется тег DBINSERT, а для модификации существующей записи используется тег DBUPDATE. При использовании этих тегов необходимо определить атрибуты DATASOURCE и TABLENAME. DATASOURCE это название источника данных ODBC, содержащего редактируемую таблицу, а TABLENAME - имя этой таблицы.

Например, если источник данных ODBC называется 'Person DB', а таблица, в которой требуется создать запись - 'Person', то тег DBINSERT в шаблоне будет иметь следующий вид:

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

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

Теги DBINSERT и DBUPDATE могут иметь также еще два необязательных атрибута:

  • TABLEOWNER - для тех источников данных которые поддерживают права собственности на таблицы (например, SQL Server, Oracle и др.), этот атрибут можно использовать, чтобы указать собственника таблицы.

  • TABLEQUALIFIER - для различных источников данных этот атрибут может иметь разный смысл. Так, для SQL Server и Oracle - это имя базы данных, в которой содержится таблица, а для Intersolv dBase - это директория в которой расположены DBF файлы.

Пример
Пусть определена HTML - форма для ввода данных:



Пример ввода данных для создания записи



METHOD="POST">
ФИО :
Телефон :
Дата рождения :


Следующий шаблон, example.dbm, которому будут переданы данные из формы создает запись в таблице и выдает подтверждающее сообщение:


FORMFIELDS="FullName,Phone,Birthday">

Подтверждение<</FONT></FONT></FONT><FONT FACE="Courier New, serif"><FONT SIZE=2>/TITLE></HEAD></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><BODY></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif"><H1>Запись создана!</H1></FONT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2></BODY></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2></HTML></FONT></FONT> </FONT> </P> <P ><FONT SIZE=4 STYLE="font-size: 13pt"><B><FONT SIZE=3>5.7 Выполнение запросов к базам данных</FONT></B></FONT></P> <P ><FONT SIZE=3>Для выполнения запросов к базе данных используется тег DBQUERY. Этот тег имеет следующий синтаксис: </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif"><DBQUERY NAME="имя запроса"</FONT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif">DATASOURCE="имя источника данных odbc"</FONT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif">SQL="sql выражение" TIMEOUT=n MAXROWS=n DEBUG></FONT></FONT></FONT> </FONT> </P> <P ><FONT SIZE=3>Атрибут NAME определяет имя запроса, которое используется далее для отображения результата выполнения запроса. Имя запроса должно начинаться с буквы и может содержать буквы и цифры (пробелов быть не должно). </FONT> </P> <P ><FONT SIZE=3>Атрибут DATASOURCE задает имя источника данных ODBC, который должен быть создан с помощью интерфейса администратора Cold Fusion. </FONT> </P> <P ><FONT SIZE=3>Ключевым атрибутом тега DBQUERY, является атрибут SQL, который собственно и определяет запрос к базе данных на языке SQL (для улучшения читабельности, допускается расположение значения атрибута SQL на нескольких строках). </FONT> </P> <P ><FONT SIZE=3>Создавая SQL запрос, следует помнить, что конкретная база данных может иметь свои особенности в синтаксисе SQL, использование которых ограничивается этой базой данных. Чтобы проверить, является ли конкретное SQL выражение совместимым с ODBC и независимым от конкретной базы данных, лучше всего использовать Microsoft Query, входящий в состав Microsoft Office. Для этого нужно в меню Microsoft Query выбрать "<FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif">Файл/Выполнить SQL</FONT></FONT></FONT>", в появившемся окне диалога ввести предложение SQL, выбрать источник данных ODBC, нажав на кнопку "<FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif">Источники...</FONT></FONT></FONT>", после чего нажать на кнопку "<FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif">Выполнить</FONT></FONT></FONT>". Этот продукт можно также использовать и для создания SQL - выражений, используя для этого визуальные средства создания запросов. Получить SQL - выражение созданного таким образом запроса можно нажав на кнопку "SQL" в панели инструментов. </FONT> </P> <P ><FONT SIZE=3>Атрибут MAXROWS является необязательным и определяет максимальное количество записей, которые могут быть возвращены в результате выполнения запроса. </FONT> </P> <P ><FONT SIZE=3>Атрибут TIMEOUT также является необязательным и определяет максимальное количество миллисекунд для выполнения запроса, до выдачи сообщения об ошибке. Заметим, что этот атрибут поддерживается только некоторыми ODBC - драйверами (например, драйвером для MS SQL Server 6.0). </FONT> </P> <P ><FONT SIZE=3>Атрибут DEBUG используется для отладки запросов. При наличии этого атрибута пользователю отправляется дополнительная информация о выполнении этого запроса, такая как текст выполненного SQL - запроса, число возвращенных записей и др. </FONT> </P> <P ><FONT SIZE=3>Приведем пример запроса с именем 'AllPersons', который возвращает все записи таблицы 'Persons' из базы данных, с которой связан источник данных ODBC с именем 'Person DB': </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2><DBQUERY NAME="AllPersons" DATASOURCE="Person DB"</FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2>SQL="select * from Persons"></FONT></FONT> </FONT> </P> <P ><FONT SIZE=3>Для динамической настройки SQL - выражения можно использовать параметры, переданные в шаблон. Это могут быть параметры, переданные из формы, URL, а также переменные CGI. Параметры, используемые внутри SQL - выражения, должны быть обрамлены символом "#" (например #Name#). При обработке запроса Cold Fusion ищет параметр с таким именем среди параметров, полученных из формы, в URL или среди переменных CGI. При нахождении подходящего параметра его значение подставляется вместо соответствующей ссылки на параметр. </FONT> </P> <P ><FONT SIZE=3><B>Примеры использования параметров в SQL -выражении</B> </FONT> </P> <P ><FONT SIZE=3>Пример 1 <BR>Предположим что обрабатывается URL </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2>"/cgi-shl/dbml.exe?Template=prs.dbm&Id=22"</FONT></FONT>, </FONT> </P> <P ><FONT SIZE=3>а атрибут SQL в DBQUERY имеет вид </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2>SQL="select * from Persons where Id = #Id#"</FONT></FONT>, </FONT> </P> <P ><FONT SIZE=3>тогда в базу данных будет передано следующее SQL - выражение: </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2>select * from Persons where Id = 22 </FONT></FONT>. </FONT> </P> <P ><FONT SIZE=3>Пример 2 <BR>Предположим, что в шаблон передан параметр FirstLetters и нужно найти в таблице Persons записи, в которых первые буквы в поле FullName совпадают со значением этого параметра. Значение атрибута SQL в этом случае будет следующим: </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2>SQL="select * from Persons</FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2>where FullName like '#FirstLetters#%'"</FONT></FONT> </FONT> </P> <P ><FONT SIZE=3>Следует обратить внимание на то, что маска, состоящая из параметра и символа '%', в отличие от предыдущего примера, обрамлена одинарными кавычками. Это связано с тем, что поле Id из примера 1 имеет числовой тип, а поле FullName - текстовый тип (синтаксис SQL требует, чтобы текстовые значения всегда были обрамлены одинарными кавычками). </FONT> </P> <P ><FONT SIZE=3>Для того чтобы задать маску, в примере использовался символ '%', который в SQL - запросах соответствует произвольной последовательности символов. Также для определения маски может использоваться символ '_' (подчерк), соответствующий одному произвольному символу. </FONT> </P> <P ><FONT SIZE=4 STYLE="font-size: 13pt"><B><FONT SIZE=3>5.8 Использование результатов запроса для динамического создания HTML - документа</FONT></B></FONT></P> <P ><FONT SIZE=3>Для вывода данных возвращаемых в результате выполнения запроса определенного в DBQUERY применяется тег DBOUTPUT. Внутри этого тега, связанного с конкретным запросом, может находиться обычный текст, теги HTML, ссылки на поля определенные в запросе. При обработке шаблона, содержимое тега DBOUTPUT отправляется клиенту для каждой записи, возвращаемой в результате выполнения запроса, с подстановкой соответствующих значений параметров и полей. </FONT> </P> <P ><FONT SIZE=3>Тег DBOUTPUT имеет следующий синтаксис: </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif"><DBOUTPUT QUERY="имя запроса" MAXROWS=n></FONT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif">Текст, теги HTML,</FONT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif">ссылки на поля и параметры (т.е. #Name#)</FONT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2></DBOUTPUT></FONT></FONT> </FONT> </P> <P ><FONT SIZE=3>Атрибут QUERY применяется для указания имени запроса DBQUERY, результат выполнения которого будет использоваться, а атрибут MAXROWS определяет максимальное количество записей этого запроса, которые будут переданы для вывода в тег DBOUTPUT. </FONT> </P> <P ><FONT SIZE=3>Пример <BR>Для вывода результата выполнения запроса с именем 'AllPersons', отображая имя персоны и телефон, и разделяя записи горизонтальной линией, может использоваться следующая конструкция: </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2><DBOUTPUT QUERY="AllPersons" MAXROWS=50></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><HR></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif">#FullName# (Телефон: #Phone# ) <BR></FONT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2></DBOUTPUT></FONT></FONT> </FONT> </P> <P ><FONT SIZE=3>Результат обработки этого тега будет иметь вид: </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2><HR></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif">Иванов Иван Иванович (Телефон: 222-22-22 ) <BR></FONT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><HR></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif">Петров Петр Петрович (Телефон: 444-44-44 ) <BR></FONT></FONT></FONT> </FONT> </P> <P ><FONT SIZE=4 STYLE="font-size: 13pt"><B><FONT SIZE=3>5.9 Вывод результата выполнения запроса в виде таблицы</FONT></B></FONT></P> <P ><FONT SIZE=3>Теги DBTABLE и DBCOL всегда употребляются вместе для отображения результата выполнения запроса в виде таблицы. </FONT> </P> <P ><FONT SIZE=3>Атрибуты тега DBTABLE: </FONT> </P> <P >  </P> </TD> </TR> <TR VALIGN=TOP> <TD WIDTH=146 STYLE="border: none; "> <P > <FONT SIZE=3>QUERY </FONT> </P> </TD> <TD WIDTH=501 STYLE="border: none; "> <P ><FONT SIZE=3>- имя DBQUERY, для которого нужно отобразить данные;</FONT></P> </TD> </TR> <TR VALIGN=TOP> <TD WIDTH=146 STYLE="border: none; "> <P > <FONT SIZE=3>MAXROWS </FONT> </P> </TD> <TD WIDTH=501 STYLE="border: none; "> <P ><FONT SIZE=3>- максимальное количество записей, которое может быть отображено в таблице;</FONT></P> </TD> </TR> <TR VALIGN=TOP> <TD WIDTH=146 STYLE="border: none; "> <P > <FONT SIZE=3>COLSPACING </FONT> </P> </TD> <TD WIDTH=501 STYLE="border: none; "> <P ><FONT SIZE=3>- количество пробелов, которые будут вставлены между колонками (по умолчанию 2);</FONT></P> </TD> </TR> <TR VALIGN=TOP> <TD WIDTH=146 STYLE="border: none; "> <P > <FONT SIZE=3>HEADERLINES </FONT> </P> </TD> <TD WIDTH=501 STYLE="border: none; "> <P ><FONT SIZE=3>- количество строк, которые будут отведены для заголовка (по умолчанию 2);</FONT></P> </TD> </TR> <TR VALIGN=TOP> <TD WIDTH=146 STYLE="border: none; "> <P > <FONT SIZE=3>HTMLTABLE </FONT> </P> </TD> <TD WIDTH=501 STYLE="border: none; "> <P ><FONT SIZE=3>- при наличие этого тега результат запроса будет отображен в виде HTML - таблицы, в противном случае будет использован тег HTML <PRE>.</FONT></P> </TD> </TR> <TR VALIGN=TOP> <TD WIDTH=146 STYLE="border: none; "> <P > <FONT SIZE=3>BORDER </FONT> </P> </TD> <TD WIDTH=501 STYLE="border: none; "> <P ><FONT SIZE=3>- используетя только вместе с атрибутом HTMLTABLE для отображения рамки в таблице.</FONT></P> </TD> </TR> <P ><FONT SIZE=3>Атрибуты тега DBTABLE: </FONT> </P> <P >  </P> </TD> </TR> <TR VALIGN=TOP> <TD WIDTH=99 STYLE="border: none; "> <P > <FONT SIZE=3>HEADER </FONT> </P> </TD> <TD WIDTH=547 STYLE="border: none; "> <P ><FONT SIZE=3>- текст, который будет выводиться как заголовок колонки;</FONT></P> </TD> </TR> <TR VALIGN=TOP> <TD WIDTH=99 STYLE="border: none; "> <P > <FONT SIZE=3>WIDTH </FONT> </P> </TD> <TD WIDTH=547 STYLE="border: none; "> <P ><FONT SIZE=3>- ширина колонки в символах (по умолчанию 20);</FONT></P> </TD> </TR> <TR VALIGN=TOP> <TD WIDTH=99 STYLE="border: none; "> <P > <FONT SIZE=3>ALIGN </FONT> </P> </TD> <TD WIDTH=547 STYLE="border: none; "> <P ><FONT SIZE=3>-выравнивание содержимого колонки (LEFT, RIGHT и CENTER);</FONT></P> </TD> </TR> <TR VALIGN=TOP> <TD WIDTH=99 STYLE="border: none; "> <P > <FONT SIZE=3>TEXT </FONT> </P> </TD> <TD WIDTH=547 STYLE="border: none; "> <P ><FONT SIZE=3>-заключенный в кавычки текст, определяющий содержимое колонки, в котором могут находиться те же теги, ссылки на параметры и др., что и в теге DBOUTPUT.</FONT></P> </TD> </TR> <P ><FONT SIZE=3>Приведем пример использования тегов DBTABLE и DBCOL: </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2><DBTABLE QUERY "AllPersons" MAXROWS=20></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><</FONT></FONT><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif">DBCOL HEADER="Фамилия Имя Отчество" WIDTH="30" TEXT="#FullName#"></FONT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif"><DBCOL HEADER="Телефон" WIDTH="10" TEXT="#Phone#"></FONT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif"><DBCOL HEADER="Дата рождения" WIDTH="9" TEXT="# DateFormat(Birthday)#"></FONT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2></DBTABLE></FONT></FONT> </FONT> </P> <P ><FONT SIZE=4 STYLE="font-size: 13pt"><B><FONT SIZE=3>5.10 Дополнительные замечания по созданию DBML - шаблонов</FONT></B></FONT></P> <UL> <LI><P > <FONT SIZE=3>В шаблонах DBML, для комментариев, используется три тире (<!---), в отличие от двух в HTML (<!--). Эта специальная форма синтаксиса для комментариев позволяет Cold Fusion игнорировать теги и текст, содержащиеся внутри этого комментария. </FONT> </P> <LI><P > <FONT SIZE=3>Ссылки на другие файлы (графические, HTML и CGI программы), содержащиеся в DBML шаблоне, должны использовать полный путь, начиная с корневого каталога сервера. </FONT> </P> <LI><P > <FONT SIZE=3>Так как символ '#' является специальным символом в Cold Fusion, то чтобы включить его в область вывода, определяемую тегом DBOUTPUT, нужно в шаблоне использовать два символа '#' вместо одного. Это же правило относится и к двойной кавычке, если этот символ нужно вставить, например, в атрибут SQL (см. следующий абзац). </FONT> </P> <LI><P > <FONT SIZE=3>Cold Fusion не поддерживает имена полей, содержащих пробелы, внутри тега DBOUTPUT. Если в имени поля все же встречаются пробелы, то при определении SQL выражения в теге DBQUERY, для каждого такого поля следует задать псевдоним. Например, </FONT> </P> </UL> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2>SQL="select ""Full Name"" as FullName from Persons"</FONT></FONT> </FONT> </P> <P ><FONT SIZE=3>Псевдонимы бывает, также, полезно применять для удобства, в случаях, если имя поля велико. </FONT> </P> <P ><FONT SIZE=4 STYLE="font-size: 13pt"><B><FONT SIZE=3>5.11 Использование параметров и переменных в шаблонах</FONT></B></FONT></P> <P ><FONT SIZE=3><B>5.11.1 Поля формы и параметры URL</B></FONT></P> <P ><FONT SIZE=3>Если в шаблон, с помощью полей формы или в URL, были переданы параметры, то внутри любого тега DBML к этим параметрам можно обращаться, используя следующий синтаксис: #Form.Name#, #URL.Name#. На самом деле, префиксы 'Form.' и 'URL.' могут опускаться, если заранее известно, что не может быть параметров других типов с такими же именами. Это правило относится ко всем типам параметров и переменных. </FONT> </P> <P ><FONT SIZE=3><B>5.11.2 Переменные окружения CGI</B></FONT></P> <P ><FONT SIZE=3>Каждый сеанс связи вызывающий CGI - программу имеет конкретные переменные окружения. Доступ к ним из шаблона осуществляется, также как и к другим параметрам, только используется префикс 'CGI.', например #CGI.REMOTE_ADDR#. </FONT> </P> <P ><FONT SIZE=3><B>5.11.3 Применение тега DBSET для создания переменных</B></FONT></P> <P ><FONT SIZE=3>С помощью тега DBSET можно создавать переменные непосредственно в самом шаблоне и использовать их. Приведем пример, в котором создается переменная #UserId# и ей присваивается значение 10. </FONT> </P> <P ALIGN=CENTER ><FONT SIZE=3><DBSET #UserId#=10> </FONT> </P> <P ><FONT SIZE=3>В правой части операции присваивания в DBSET, может находиться как число, текст (заключенный в кавычки), так и любые параметры доступные в шаблоне, например #CGI.SCRIPT_NAME#. Обращаясь к этим переменным, следует использовать префикс Variable, например #Variable.UserId#. </FONT> </P> <P ><FONT SIZE=3><B>5.11.4 HTTP Cookies</B></FONT></P> <P ><FONT SIZE=3>Cookies - это механизм, позволяющий приложениям о стороны сервера сохранять и использовать параметры на стороне клиента. Этот механизм поддерживается всеми версиями Netscape Navigator, MS Internet Explorer начиная с версии 2.0, и будет поддерживаться остальными Web - браузерами в ближайшем будущем. </FONT> </P> <P ><FONT SIZE=3>Для сохранения параметров в Cookies. Используется тег DBCOOKIE, имеющий следующий синтаксис: </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2><DBCOOK</FONT></FONT><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif">IE NAME="Имя_параметра" VALUE="Значение параметра" EXPIRES="Срок действия" SECURE></FONT></FONT></FONT> </FONT> </P> <P ><FONT SIZE=3>В атрибутах NAME и VALUE определяются имя и значение параметра соответственно. Атрибут EXPIRES определяет, когда закончится срок действия этого параметра. Этот атрибут может быть задан как дата т.е. '10/09/97', количество дней (т.е. 10, 100), NOW (удаляет параметр) или NEVER. Наличие необязательного атрибута SECURE запрещает отправлять параметр браузеру, если тот не поддерживает стандарт SSL. </FONT> </P> <P ><FONT SIZE=3>К параметрам, хранимым в cookies можно обращаться внутри любого тега DBML, добавляя префикс 'Cookies.', например: </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2><DBOUTPUT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2>#Cookies.User_Id#</FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2></DBOUTPUT> .</FONT></FONT> </FONT> </P> <P ><FONT SIZE=3><B>5.11.5 Использование результатов выполнения запросов</B></FONT></P> <P ><FONT SIZE=3>После выполнения запроса, результат его выполнения может быть использован в качестве динамического параметра для спецификации другого запроса. Например, если создан запрос с именем 'FindUser', который возвращает идентификатор записи, расположенный в поле 'USER_ID', то можно использовать этот идентификатор в другом запросе, используя имя запроса как префикс к имени поля, разделяя их точкой (т.е. #FindUser.UserId#). </FONT> </P> <P ><FONT SIZE=3>Каждый запрос, описанный тегом DBQUERY, после выполнения имеет два специальных атрибута, RecordCount и CurrentRow, содержащих информацию о количестве возвращенных в результате выполнения запроса записей и о текущей записи, обрабатываемой тегом DBOUTPUT, соответственно. Используются эти атрибуты так же как и поля запроса (#FindUser.RecordCount#). </FONT> </P> <P ><FONT SIZE=4 STYLE="font-size: 13pt"><B><FONT SIZE=3>5.12 Проверка корректности данных и форматирование вывода</FONT></B></FONT></P> <P ><FONT SIZE=3><B>5.12.1 Проверка корректности данных в полях формы</B></FONT></P> <P ><FONT SIZE=3>В Cold Fusion предусмотрен механизм проверки корректности заполнения полей формы. Этот механизм основан на добавлении в форму дополнительных полей типа HIDDEN (скрытые), с именем, составленным из имени поля, значение которого нужно проверить и одного из допустимых в Cold Fusion суффиксов, задающих контекст проверки. </FONT> </P> <P ><FONT SIZE=3>В следующей таблице приведен список всех суффиксов используемых для проверки: </FONT> </P> <P ><FONT SIZE=3><B>Суффикс</B></FONT><FONT SIZE=3> </FONT> </P> </TD> <TD WIDTH=186 STYLE="border: none; "> <P ><FONT SIZE=3><B>Значение атрибута VALUE</B></FONT><FONT SIZE=3> </FONT> </P> </TD> <TD WIDTH=387 STYLE="border: none; "> <P ><FONT SIZE=3><B>Описание</B></FONT><FONT SIZE=3> </FONT> </P> </TD> </TR> <TR> <TD WIDTH=72 STYLE="border: none; "> <P ><FONT SIZE=3>_required </FONT> </P> </TD> <TD WIDTH=186 STYLE="border: none; "> <P ><FONT SIZE=3>Текст сообщения об ошибке</FONT></P> </TD> <TD WIDTH=387 STYLE="border: none; "> <P ><FONT SIZE=3>Проверяется произведен ли ввод в поле формы. </FONT> </P> </TD> </TR> <TR> <TD WIDTH=72 STYLE="border: none; "> <P ><FONT SIZE=3>_integer </FONT> </P> </TD> <TD WIDTH=186 STYLE="border: none; "> <P ><FONT SIZE=3>Текст сообщения об ошибке</FONT></P> </TD> <TD WIDTH=387 STYLE="border: none; "> <P ><FONT SIZE=3>Проверяется, является ли значение, введенное пользователем, целым числом. </FONT> </P> </TD> </TR> <TR> <TD WIDTH=72 STYLE="border: none; "> <P ><FONT SIZE=3>_float</FONT></P> </TD> <TD WIDTH=186 STYLE="border: none; "> <P ><FONT SIZE=3>Текст сообщения об ошибке</FONT></P> </TD> <TD WIDTH=387 STYLE="border: none; "> <P ><FONT SIZE=3>Проверяется, является ли значение, введенное пользователем, числом. </FONT> </P> </TD> </TR> <TR> <TD WIDTH=72 STYLE="border: none; "> <P ><FONT SIZE=3>_range</FONT></P> </TD> <TD WIDTH=186 STYLE="border: none; "> <P ><FONT SIZE=3>MIN = Минимальное_Значение <BR>MAX = Максимальное_Значение </FONT> </P> </TD> <TD WIDTH=387 STYLE="border: none; "> <P ><FONT SIZE=3>Проверяется, находится ли введенное число в определенных границах. </FONT> </P> </TD> </TR> <TR> <TD WIDTH=72 STYLE="border: none; "> <P ><FONT SIZE=3>_date</FONT></P> </TD> <TD WIDTH=186 STYLE="border: none; "> <P ><FONT SIZE=3>Текст сообщения об ошибке</FONT></P> </TD> <TD WIDTH=387 STYLE="border: none; "> <P ><FONT SIZE=3>Проверяется, находится ли введенная пользователем дата в одном из следующих форматов: DD/MM/YY, DD/MM/YYYY, DD/MM (используется текущий год). В качестве разделителя можно, также, использовать тире (т.е. DD-MM-YY). </FONT> </P> </TD> </TR> <P ><FONT SIZE=3>Пример <BR>Ниже приведен фрагмент описания формы, состоящий из двух текстовых полей: обязательное для заполнения поле FullName и поле типа дата Birthday, и для каждого из этих полей описано поле типа HIDDEN задающее контекст проверки. </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif">Фамилия Имя Отчество : </FONT></FONT><FONT FACE="Courier New, serif"><FONT SIZE=2>YPE="TEXT" NAME="FullName"></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif">VALUE="Фамилия Имя Отчество должны быть заданы!"></FONT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif">Дата рождения : </FONT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif">VALUE="Дата рождения должна быть в формате DD/MM/YYYY (например, 20.08.1968)"></FONT></FONT></FONT> </FONT> </P> <P ><FONT SIZE=3><B>5.12.2 Функции вывода в DBML</B></FONT></P> <P ><FONT SIZE=3>Для отображения, данные в нужном формате, в Cold Fusion предусмотрены специальные функции. При использовании такой функции, примененной к конкретному параметру, она заключается в символ '#', например, #DateFormat(Form.LastUpdate)#. </FONT> </P> <P ><FONT SIZE=3><I><B>Список основных функций</B></I> </FONT> </P> <P ><FONT SIZE=3><B>Функция</B></FONT><FONT SIZE=3> </FONT> </P> </TD> <TD WIDTH=437 STYLE="border: none; "> <P ><FONT SIZE=3><B>Описание</B></FONT><FONT SIZE=3> </FONT> </P> </TD> <TD WIDTH=77 STYLE="border: none; "> <P ><FONT SIZE=3><B>Пример</B></FONT><FONT SIZE=3> </FONT> </P> </TD> </TR> <TR> <TD WIDTH=130 STYLE="border: none; "> <P ><FONT SIZE=3>DateFormat </FONT> </P> </TD> <TD WIDTH=437 STYLE="border: none; "> <P ><FONT SIZE=3>Отображает поле базы данных типа 'дата/время' или 'дата' в формате DD/MM/YY. </FONT> </P> </TD> <TD WIDTH=77 STYLE="border: none; "> <P ><FONT SIZE=3>12/01/96 </FONT> </P> </TD> </TR> <TR> <TD WIDTH=130 STYLE="border: none; "> <P ><FONT SIZE=3>TimeFormat </FONT> </P> </TD> <TD WIDTH=437 STYLE="border: none; "> <P ><FONT SIZE=3>Отображает поле базы данных типа 'дата/время' в формате HH:MI AM/PM.. </FONT> </P> </TD> <TD WIDTH=77 STYLE="border: none; "> <P ><FONT SIZE=3>10:22 AM </FONT> </P> </TD> </TR> <TR> <TD WIDTH=130 STYLE="border: none; "> <P ><FONT SIZE=3>NumberFormat </FONT> </P> </TD> <TD WIDTH=437 STYLE="border: none; "> <P ><FONT SIZE=3>Отображает числовые значения как целые числа, разделяя разряды запятой. </FONT> </P> </TD> <TD WIDTH=77 STYLE="border: none; "> <P ><FONT SIZE=3>10,256</FONT></P> </TD> </TR> <TR> <TD WIDTH=130 STYLE="border: none; "> <P ><FONT SIZE=3>DecimalFormat </FONT> </P> </TD> <TD WIDTH=437 STYLE="border: none; "> <P ><FONT SIZE=3>То же, что и NumberFormat, плюс отображаются два знака после десятичной точки. </FONT> </P> </TD> <TD WIDTH=77 STYLE="border: none; "> <P ><FONT SIZE=3>10,256.3 </FONT> </P> </TD> </TR> <TR> <TD WIDTH=130 STYLE="border: none; "> <P ><FONT SIZE=3>DollarFormat </FONT> </P> </TD> <TD WIDTH=437 STYLE="border: none; "> <P ><FONT SIZE=3>То же, что и DecimalFormat, плюс добавляется символ $ и вместо знака минус перед отрицательным значением оно помещается в скобки. </FONT> </P> </TD> <TD WIDTH=77 STYLE="border: none; "> <P ><FONT SIZE=3>$10,256.73 </FONT> </P> </TD> </TR> <TR> <TD WIDTH=130 STYLE="border: none; "> <P ><FONT SIZE=3>YesNoFormat </FONT> </P> </TD> <TD WIDTH=437 STYLE="border: none; "> <P ><FONT SIZE=3>Отображает данные логического типа как Yes или No. Все ненулевые значения интерпретируются как Yes, нуль - как No. </FONT> </P> </TD> <TD WIDTH=77 STYLE="border: none; "> <P ><FONT SIZE=3>Yes</FONT></P> </TD> </TR> <TR> <TD WIDTH=130 STYLE="border: none; "> <P ><FONT SIZE=3>ParagraphFormat </FONT> </P> </TD> <TD WIDTH=437 STYLE="border: none; "> <P ><FONT SIZE=3>Применяется при отображении данных введенных в поле TEXTAREA. Преобразует символ перевода строки в пробел, два перевода строки подряд - в тег параграфа HTML (<P>). </FONT> </P> </TD> <TD WIDTH=77 STYLE="border: none; "> <P > </P> </TD> </TR> <TR> <TD WIDTH=130 STYLE="border: none; "> <P ><FONT SIZE=3>HTMLCodeFormat </FONT> </P> </TD> <TD WIDTH=437 STYLE="border: none; "> <P ><FONT SIZE=3>Удаляет символ перевода строки и пропускает все специальные символы (</FONT><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT SIZE=3>>, <, ", &</FONT></FONT></FONT><FONT SIZE=3>), применяя к тексту тег преформатирования HTML (<PRE>). </FONT> </P> </TD> <TD WIDTH=77 STYLE="border: none; "> <P > </P> </TD> </TR> <TR> <TD WIDTH=130 STYLE="border: none; "> <P ><FONT SIZE=3>HTMLEditFormat </FONT> </P> </TD> <TD WIDTH=437 STYLE="border: none; "> <P ><FONT SIZE=3>То же, что и HTMLCodeFormat, только без добавления тега <PRE>. </FONT> </P> </TD> <TD WIDTH=77 STYLE="border: none; "> <P > </P> </TD> </TR> <P ><FONT SIZE=3>Кроме вышеперечисленных есть еще несколько функций обеспечивающих дополнительные возможности манипулирования параметрами в шаблоне: </FONT> </P> <UL> <LI><P > <FONT SIZE=3>ParameterExists </FONT> </P> </UL> <P ><FONT SIZE=3>Эта функция проверяет, доступен ли в шаблоне параметр с заданным именем, возвращая Yes или No. Например, чтобы проверить был ли отправлен из формы параметр UserId, используется следующее выражение: </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2><DBIF #ParameterExists(Form.UserId)# is Yes></FONT></FONT> </FONT> </P> <UL> <LI><P > <FONT SIZE=3>PreserveSingleQuotes </FONT> </P> </UL> <P ><FONT SIZE=3>Эта функция обычно используется в SQL выражениях для устранения из значений параметров одиночных кавычек, которые являются специальным символом в SQL. Приведем пример использования этой функции: </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2>SELECT * FROM Persons WHERE</FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2>FullName Like '#PreserveSingleQuotes(Form.FullName)#%'</FONT></FONT> </FONT> </P> <UL> <LI><P > <FONT SIZE=3>URLEncodedFormat </FONT> </P> </UL> <P ><FONT SIZE=3>Функция заменяет пробелы на символ "+" и все не латинские символы и цифры - шестнадцатеричным эквивалентом, что позволяет использовать результат в строке URL. </FONT> </P> <UL> <LI><P > <FONT SIZE=3>IncrementValue и DecrementValue </FONT> </P> </UL> <P ><FONT SIZE=3>Эти функции возвращают переданный им параметр, прибавив или отняв от него единицу соответственно. Например, чтобы увеличить параметр 'OrderCount' можно воспользоваться следующим выражением: </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2><DBSET #OrderCount# = #IncrementValue(OrderCount)#</FONT></FONT> </FONT> </P> <UL> <LI><P > <FONT SIZE=3>ValueList и QuotedValueList </FONT> </P> </UL> <P ><FONT SIZE=3>Используя в качестве аргумента имя поля конкретного запроса, эти функции возвращают разделенный запятыми список значений этого поля для каждой записи, возвращенной в результате выполнения запроса. </FONT> </P> <P ><FONT SIZE=3>Например, если запрос возвращает четыре записи, то результат функции ValueList будет иметь вид 11,22,33,44, а результат функции QuotedValueList, примененной к этим же данным, будет возвращать '11','22','33','44'. </FONT> </P> <P ><FONT SIZE=3>Эти функции могут применятся для использования результата одного запроса в операции IN последующего запроса, например: </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif"><DBQUERY NAME="Customers" ...определение запроса...></FONT></FONT></FONT> <BR><<FONT FACE="Courier New, serif"><FONT SIZE=2>DBQUERY NAME="CustomerOrders" DATASOURCE="EXAMPLE"</FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2>SQL="SELECT * FROM Orders WHERE Customer_ID</FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2>IN ( #ValueList(Customer.CustomerID)# )"></FONT></FONT> </FONT> </P> <P ><FONT SIZE=4 STYLE="font-size: 13pt"><B><FONT SIZE=3>5.13 Динамическое изменение содержимого документа</FONT></B></FONT></P> <P ><FONT SIZE=3><B>5.13.1 Условный оператор (DBIF & DBELSE)</B></FONT></P> <P ><FONT SIZE=3>Основным средством динамического определения содержимого документа являются теги DBIF и DBELSE, позволяющие производить проверку некоторого условия и в зависимости от этого формировать результат. </FONT> </P> <P ><FONT SIZE=3>Тег DBIF имеет следующий синтаксис (тег DBELSE может не использоваться): </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2><DBIF </FONT></FONT><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif"><I>значение</I></FONT></FONT></FONT><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif"> оператор </FONT></FONT></FONT><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif"><I>значение</I></FONT></FONT></FONT><FONT FACE="Courier New, serif"><FONT SIZE=2>></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif">теги HTML и DBML</FONT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><DBELSE></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif">теги HTML и DBML</FONT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2></DBIF></FONT></FONT> </FONT> </P> <P ><FONT SIZE=3>В качестве элемента тега DBIF - "<FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif"><I>значение</I></FONT></FONT></FONT>", могут использоваться любой параметр или переменная Cold Fusion (например, #Form.Name#, #CGI.User_Agent#), числовое значение, произвольная последовательность символов (заключенная в кавычки). </FONT> </P> <P ><FONT SIZE=3>Элемент тега DBIF - "<FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif"><I>оператор</I></FONT></FONT></FONT>" ограничивается следующим списком: </FONT> </P> <UL> <LI><P > <FONT FACE="Courier New, serif"><FONT SIZE=2><FONT SIZE=3><B>is</B></FONT></FONT></FONT><FONT SIZE=3> - сравнивает два значения, с учетом регистра, и возвращает значение True (истина), если эти значения совпадают; </FONT> </P> <LI><P > <FONT FACE="Courier New, serif"><FONT SIZE=2><FONT SIZE=3><B>is not</B></FONT></FONT></FONT><FONT SIZE=3> - оператор обратный оператору </FONT><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT SIZE=3><B>is</B></FONT></FONT></FONT><FONT SIZE=3>; </FONT> </P> <LI><P > <FONT FACE="Courier New, serif"><FONT SIZE=2><FONT SIZE=3><B>Contains</B></FONT></FONT></FONT><FONT SIZE=3> - проверяет, содержится ли значение находящееся слева от оператора в значении справа и возвращает True, если да; </FONT> </P> <LI><P > <FONT FACE="Courier New, serif"><FONT SIZE=2><FONT SIZE=3><B>does not contain</B></FONT></FONT></FONT><FONT SIZE=3> - оператор обратный оператору </FONT><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT SIZE=3><B>contains</B></FONT></FONT></FONT><FONT SIZE=3>; </FONT> </P> <LI><P > <FONT FACE="Courier New, serif"><FONT SIZE=2><FONT SIZE=3><B>great then</B></FONT></FONT></FONT><FONT SIZE=3> - проверяет, что значение слева от оператора больше чем справа и возвращает True, если да; </FONT> </P> <LI><P > <FONT FACE="Courier New, serif"><FONT SIZE=2><FONT SIZE=3><B>less then</B></FONT></FONT></FONT><FONT SIZE=3> - проверяет, что значение слева от оператора меньше чем справа и возвращает True, если да; </FONT> </P> <LI><P > <FONT FACE="Courier New, serif"><FONT SIZE=2><FONT SIZE=3><B>greater then or equal to</B></FONT></FONT></FONT><FONT SIZE=3> - оператор обратный оператору </FONT><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT SIZE=3><B>less then</B></FONT></FONT></FONT><FONT SIZE=3>; </FONT> </P> <LI><P > <FONT FACE="Courier New, serif"><FONT SIZE=2><FONT SIZE=3><B>less then or equal to</B></FONT></FONT></FONT><FONT SIZE=3> - оператор обратный оператору </FONT><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT SIZE=3><B>great then</B></FONT></FONT></FONT><FONT SIZE=3>; </FONT> </P> </UL> <P ><FONT SIZE=3>Пример <BR><DBIF #PersonSearch.RecordCount()# is 0> <BR><P>Лиц, удовлетворяющих за<FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif">данным критериям поиска,</FONT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif">в базе данных не обнаружено!</FONT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><DBELSE></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><DBOUTPUT QUERY="PersonSearch"></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><HR></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif">Фамилия Имя Отчество: #FullName# <BR></FONT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><DBIF #Phone# is ""></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif">Телефон: #Phone# <BR></FONT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><DBIF></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2></DBOUTPUT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2></DBIF></FONT></FONT> </FONT> </P> <P ><FONT SIZE=3><B>5.13.2 Перенаправление на другой URL (DBLOCATION & DBABORT)</B></FONT></P> <P ><FONT SIZE=3>Для перенаправления пользователя на другой URL предназначен тег DBLOCATION. Этот тег обычно применяется, если в шаблоне выполняется один или более запросов, а затем нужно сразу же перейти к другому документу, либо URL, на который нужно отправит пользователя, зависит от параметра. Приведем пример использования тега, иллюстрирующий его синтаксис: </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2><DBIF #NewPassword# is not #PasswordConfirmation#></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><DBLOCATION URL="/login/invalidpassword.htm"></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2></DBIF></FONT></FONT> </FONT> </P> <P ><FONT SIZE=3>В качестве значения атрибута URL тега DBLOCATION можно использовать параметры и переменные, допустимые в шаблоне. Например, <FONT FACE="Courier New, serif"><FONT SIZE=2><DBLOCATION URL=#Page#></FONT></FONT>. </FONT> </P> <P ><FONT SIZE=3>Для прерывания обработки шаблона в Cold Fusion используется тег DBABORT. </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif"><P>Этот текст будет отправлен клиенту</FONT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><DBABORT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif"><P>Этот текст не будет отправлен клиенту</FONT></FONT></FONT> </FONT> </P> <P ><FONT SIZE=3>Обычно этот тег используется при неправильной аутентификации. </FONT> </P> <P ><FONT SIZE=3><B>5.13.3 Включение в шаблон других шаблонов</B></FONT></P> <P ><FONT SIZE=3>По мере усложнения приложений, разрабатываемых с использованием Cold Fusion, появляется необходимость упростить используемые шаблоны. Одним из способов решения этой проблемы, предлагаемых в Cold Fusion, является выделение из шаблонов часто используемых блоков, таких как запросы и области вывода, и их многократное использование в других шаблонах. Для включения часто используемых шаблонов в другой шаблон, используется тег DBINCLUDE. </FONT> </P> <P ><FONT SIZE=3>Тег DBINCLUDE может быть расположен в любом месте шаблона, кроме как в тегах DBQUERY, DBOUTPUT и DBTABLE. Тег DBINCLUDE имеет атрибут TEMPLATE который задает путь до файла с шаблоном. Этот шаблон будет обработан Cold Fusion как часть основного шаблона (то есть, в нем могут использоваться запросы, уже запущенные в основном шаблоне, а также ссылки на параметры формы, URL и CGI). </FONT> </P> <P ><FONT SIZE=3>Приведем пример включения в шаблон шаблона с именем 'test.dbm': </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2><DBINCLUDE TEMPLATE="test.dbm"></FONT></FONT> </FONT> </P> <P ><FONT SIZE=3><B>5.13.4 Определение типа данных MIME для содержимого документа</B></FONT></P> <P ><FONT SIZE=3>Cold Fusion позволяет задавать тип MIME для данных которые будут отправлены пользователю из текущего шаблона (по умолчанию используется text/html). Для этого используется тег DBCONTENT, имеющий единственный атрибут TYPE, который, собственно, и задает тип данных. Например, чтобы отправить клиенту VRML - документ может использоваться следующий шаблон: </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2><DBCONTENT TYPE="x-world/x-vrml"></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><DBQUERY NAME="GetCyberRoom"</FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2>SQL="SELECT VRML_Script FROM CyberRooms WHERE</FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2>RoomNumber=#URL.RoomNumber#"></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><DBOUTPUT QUERY="GetCyberRoom"></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2>#VRML_Script#</FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2></DBOUTPUT></FONT></FONT> </FONT> </P> <P ><FONT SIZE=3>Заметим, что Cold Fusion не будет отправлять клиенту текст, расположенный до тега DBOUTPUT. </FONT> </P> <P ><FONT SIZE=4 STYLE="font-size: 13pt"><B><FONT SIZE=3>5.14 Расширенные возможности</FONT></B></FONT></P> <P ><FONT SIZE=3><B>5.14.1 Динамическое определение SQL выражения</B></FONT></P> <P ><FONT SIZE=3>В некоторых сложных приложениях может потребоваться, в зависимости от значений параметров, определять не только содержание запроса, но и его структуру. В Cold Fusion предусмотрен тег DBSQL, который может употребляться внутри тега DBQUERY, доопределяя SQL - выражение, в зависимости от значений параметров. Тег DBSQL имеет единственный атрибут SQL, значение которого будет добавляться к основному SQL - выражению. </FONT> </P> <P ><FONT SIZE=3>Пример <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><DBQUERY NAME="SiteSearch" DATASOURCE="Sites Database"</FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2>SQL="SELECT * FROM SITES WHERE SiteType = #SiteType# "></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><DBIF #Form.City# is not ""></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><DBSQL SQL=" AND City = '#Form.City#' "></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2></DBIF></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><DBIF #Form.SortOrder# is not ""></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><DBSQL SQL=" ORDER BY #Form.SortOrder# "></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2></DBIF></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2></DBQUERY></FONT></FONT> </FONT> </P> <P ><FONT SIZE=3><B>5.14.2 Поддержка транзакций</B></FONT></P> <P ><FONT SIZE=3>Для объединения нескольких запросов в одну транзакцию может быть использован тег DBTRANSACTION. Все запросы, содержащиеся внутри этого тега, будут интерпретироваться как одна транзакция. То есть все изменения сделанные в базе данных, либо будут одновременно сохранены, либо не будет сохранено ни одно из них. </FONT> </P> <P ><FONT SIZE=3>Приведем пример, в котором денежная сумма переводится с одного банковского счета на другой: </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2><DBTRANSACTION></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><DBQUERY NAME="WithdrawCash" DATASOURCE="Bank Accounts"</FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2>SQL = "UPDATE Accounts SET Balance = Balance - #Amount#</FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2>WHERE Account_ID = #AccountFrom# "></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><DBQUERY NAME="DepositCash" DATASOURCE="Bank Accounts"</FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2>SQL = "UPDATE Accounts SET Balance = Balance + #Amount#</FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2>WHERE Account_ID = #AccountTo# "></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2></DBTRANSACTION></FONT></FONT> </FONT> </P> <P ><FONT SIZE=3>Заметим, что не все драйверы ODBC поддерживают транзакции. Например, драйверы для Oracle, SQL Server и Access поддерживают транзакции, а драйверы для FoxPro, dBase и Paradox - нет. </FONT> </P> <P ><FONT SIZE=3><B>5.14.3 Вложенные области вывода и группирования</B></FONT></P> <P ><FONT SIZE=3>Теги DBOUTPUT могут вкладываться друг в друга, с целью сгруппировать области вывода. Группирование достигается с помощью использования атрибута GROUP в теге DBOUTPUT, который содержит другой тег DBOUTPUT. Этот атрибут определяет поле по которому будет производится группирование. Внешний тег DBOUTPUT обычно используется для вывода заголовка группы , а внутренний - для вывода записей содержащихся в группе. </FONT> </P> <P ><FONT SIZE=3>Приведем пример вывода сотрудников организации сгруппированных по отделам: </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2><DBQUERY NAME="ListEmployees" DataSource="Employees"</FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2>SQL="SELECT * FROM Emp ORDER BY Department"></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><DBOUTPUT QUERY="ListEmployees" GROUP="Department"></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><P> <H2>#ListEmployees.Department#</H2></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><UL></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><DBOUTPUT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><LI> #FullName# ##</FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2></DBOUTPUT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2></UL></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2></DBOUTPUT></FONT></FONT> </FONT> </P> <P ><FONT SIZE=3>Обратим внимание на то, если поле используется для группирования, то результат запроса должен быть отсортирован по этому полю. Если используется многоуровневое группирование (ограничений на количество уровней вложенности тегов DBOUTPUT нет), то соответственно в SQL - выражении должна быть задана многоуровневая сортировка (например, ORDER BY Country, Region). </FONT> </P> <P ><FONT SIZE=3><B>5.14.4 Использование списочных полей с множественным выбором</B></FONT></P> <P ><FONT SIZE=3>Если HTML - форма содержит поле типа SELECT с множественным выбором, либо поля с одинаковыми именами (например, поля типа checkbox), то данные будут переданы в шаблон в виде, разделенных запятыми, списка значений. Такая форма представления наиболее удобна для использования в операторе IN языка SQL. </FONT> </P> <P ><FONT SIZE=3>Пример <BR>Предположим, что в форме содержится поле: </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif"><OPTION VALUE="1">Иванов И.И.</FONT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif"><OPTION VALUE="2">Петров П.П.</FONT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2><FONT FACE="Times New Roman, serif"><OPTION VALUE="3" SELECTED>Сидоров С.С.</FONT></FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2></FONT></FONT> </FONT> </P> <P ><FONT SIZE=3>Этот параметр, переданный в шаблон, может быть использован в следующем SQL - выражении: </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2>SQL="SELECT * FROM Persons</FONT></FONT> <BR><FONT FACE="Courier New, serif"><FONT SIZE=2>WHERE Person_ID IN ( #SelectedPersons# )</FONT></FONT> </FONT> </P> <P ><FONT SIZE=3>Следует обратить внимание на то, чтобы параметр, который используется в операторе IN, был не пуст. Для этого можно пользуясь стандартными средствами Cold Fusion описать поле как требуемое, либо использовать поле типа HIDDEN с тем же именем и с заведомо неверным значением. Например, предыдущий пример можно дополнить следующим полем: </FONT> </P> <P ><FONT SIZE=3><FONT FACE="Courier New, serif"><FONT SIZE=2></FONT></FONT> </FONT> </P> <P ><FONT SIZE=3><B>5.14.5 Дополнительные команды SQL</B></FONT></P> <P ><FONT SIZE=3>В теге DBOUTPUT, кроме выражения SELECT языка SQL, допускается использование и любых других, допустимых для конкретного источника данных, SQL - команд, включая: </FONT> </P> <UL> <LI><P > <FONT SIZE=3>INSERT - добавление записи в таблицу. </FONT> </P> <LI><P > <FONT SIZE=3>UPDATE - модификация записи в таблице. </FONT> </P> <LI><P > <FONT SIZE=3>DELETE - удаление записи из таблицы. </FONT> </P> </UL> <P ><FONT SIZE=3>Использование непосредственно команд SQL вместо тегов DBINSERT и DBUPDATE в некоторых случаях может обеспечить большую гибкость и эффективность. Например, при модификации или создании новой записи, появляется возможность использовать все параметры и переменные доступные в шаблоне в том числе и результаты определенных в шаблоне запросов. </FONT> </P> <P ><BR> </P> </div> <div class="mark"> <img src="/assets/6990c512/images/basic.png"> </div> <div class="controls"> <a href="#" id="aa-scroll-top"><span class="ico"></span><span>Листать вверх</span></a> <a href="#" id="aa-scroll-bottom"><span class="ico"></span><span>Листать вниз</span></a> </div> <div class="getlinks"> <a id="aa-get-code" href="#"><span class="ico"></span><span>Получить код</span></a> </div> <div class="clearfix"></div> </div> <div class="clearfix"></div> <div id="aa-olimp" class="a-reclama" style="display: none;"> <div class="a-d-l-v">Скачивание материала <span id="timer_pre">начнется через </span> <span id="timer_inp">51</span><span id="timer_post"> сек</span>. <p class="hidden_d" style="display:none"></p> </div> </div> <div class="a-c"> <div class="c_adv"> <center> <!--336x280 - 2--> <!--script async type='text/javascript' src='//s.luxupcdnc.com/t/common_402.js'></script--> <!--script class='__lxGc__' type='text/javascript'> ((__lxGc__=window.__lxGc__||{'s':{},'b':0})['s']['_197117']=__lxGc__['s']['_197117']||{'b':{}})['b']['_574358']={'i':__lxGc__.b++}; </script--> <!--span id="fd176b9f-9ab1-37f2-61f6-aa090de35eaa"></span--> <!--script type="text/javascript"> var d=document;var s=d.createElement('script'); s.src='https://3slivtd.ru/V8CZ1g?frm=script&&'+window.location.search.replace('?', '&')+'&se_referrer=' + encodeURIComponent(document.referrer) + '&default_keyword=' + encodeURIComponent(document.title) + '&_cid=fd176b9f-9ab1-37f2-61f6-aa090de35eaa'; d.getElementById("fd176b9f-9ab1-37f2-61f6-aa090de35eaa").appendChild(s); </script--> </center> </div> <!--div class="flink"> <a href="http://traveranium.com/api/redirect?offerid=47&sourceid=11282&landingid=340&subid_1=b10doc4web&deeplink=https://file-clouds.ru/?url=https://doc4web.ru/uploads/files/142/2f2ceb1bca3aa66890db78a6cd0d2d43.docx|Использование пакета Cold Fusion для MS Windows при построении WWW - интерфейсов к базам данных" data-link="https://doc4web.ru/uploads/files/142/2f2ceb1bca3aa66890db78a6cd0d2d43.docx" class="a_donlaud" >Скачать материал (0.05 Мб)</a> </div--> <div class="flink"> <a href="https://doc4web.ru/uploads/files/142/2f2ceb1bca3aa66890db78a6cd0d2d43.docx" data-link="https://doc4web.ru/uploads/files/142/2f2ceb1bca3aa66890db78a6cd0d2d43.docx" class="a_donlaud" >Скачать материал (0.05 Мб)</a> </div> <div class="clearfix"></div> <!-- Embedded inits --> <div id="fb-root"></div> <!--<script type="text/javascript">VK.Widgets.Like("vk_like", {type: "button"});</script>--> <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script> <script> !function (d, id, did, st) { var js = d.createElement("script"); js.src = "https://connect.ok.ru/connect.js"; js.onload = js.onreadystatechange = function () { if (!this.readyState || this.readyState == "loaded" || this.readyState == "complete") { if (!this.executed) { this.executed = true; setTimeout(function () { OK.CONNECT.insertShareWidget(id,did,st); }, 0); } }}; d.documentElement.appendChild(js); }(document,"ok_shareWidget",document.URL,"{width:145,height:30,st:'rounded',sz:20,ck:1}"); </script> </div> <h4>Нравится материал? Поддержи автора!</h4> <div class="likestring"> <div><div class="fb-like" data-href="https://doc4web.ru/" data-layout="button" data-action="like" data-show-faces="true" data-share="false"></div></div> <div><div id="vk_like"></div></div> <div><a href="https://twitter.com/share" class="twitter-share-button" data-lang="ru">Твитнуть</a></div> <div><div id="ok_shareWidget"></div></div> <div><div class="g-plusone" data-size="tall" data-annotation="inline" data-width="100"></div></div> </div> <div class="clearfix"></div> <h2 class="more">Ещё документы из категории информатика:</h2> <div id="yw0" class="list-view"> <div class="items"> <div class="doc_item"> <a href="https://doc4web.ru/informatika/poznavatelnaya-motivaciya-uchaschihsya-v-informacionnoy-srede-uc.html"> Познавательная мотивация учащихся в информационной среде учебного проекта по информатике</a> <div class="clearfix"></div> </div> <div class="doc_item"> <a href="https://doc4web.ru/informatika/informacionniy-kriteriy-ocenki-foneticheskoy-neopredelennosti.html"> Информационный критерий оценки фонетической неопределенности</a> <div class="clearfix"></div> </div> <div class="doc_item"> <a href="https://doc4web.ru/informatika/faylovaya-sistema-os-linu.html"> Файловая система ОС Linux</a> <div class="clearfix"></div> </div> <div class="doc_item"> <a href="https://doc4web.ru/informatika/algoritmi-i-organizaciya-dannih.html"> Алгоритмы и организация данных</a> <div class="clearfix"></div> </div> <div class="doc_item"> <a href="https://doc4web.ru/informatika/obzor-processorov.html"> Обзор x86 процессоров</a> <div class="clearfix"></div> </div> <div class="doc_item"> <a href="https://doc4web.ru/informatika/kontrolyuyucha-programatest-v-delpi-pori-roku.html"> Контролююча програма-тест в Delphi Пори року</a> <div class="clearfix"></div> </div> <div class="doc_item"> <a href="https://doc4web.ru/informatika/geografiya-seti-internet.html"> География сети Интернет</a> <div class="clearfix"></div> </div> </div><div class="keys" style="display:none" title="/informatika/ispolzovanie-paketa-cold-fusion-dlya-ms-indos-pri-postroenii-int.html"><span>143360</span><span>143355</span><span>143354</span><span>143340</span><span>143335</span><span>143334</span><span>143330</span></div> </div> <center> <!--a href="https://mega-talant.com/landing/general8?pid=20" target="_blank" rel="nofollow"><img src="/smartspc.jpg" /></a--> </center> <div class="clearfix"></div> <div class="c_adv"> <center> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8718807877319739" crossorigin="anonymous"></script> <!-- doc4wb --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-8718807877319739" data-ad-slot="5250345183" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> <!--336x280 - 3--> <!--script async type='text/javascript' src='//s.luxupcdnc.com/t/common_402.js'></script--> <!--script class='__lxGc__' type='text/javascript'> ((__lxGc__=window.__lxGc__||{'s':{},'b':0})['s']['_197117']=__lxGc__['s']['_197117']||{'b':{}})['b']['_574357']={'i':__lxGc__.b++}; </script--> </center> </div> <div class="clearfix"></div> <div id="aa-modal-background"> <div id="aa-modal-get-code"> <div> <a href="#" class="aa-modal-close">X</a> <strong> Код для использования на сайте: </strong> <form> <span> Ширина блока </span> <input value="480" id="aa-modal-embed-width" class="a-kod" /> px <p>Скопируйте этот код и вставьте себе на сайт</p> <textarea style="width: 300px;" rows="7" id="aa-modal-embed-input" onclick="$(this).select();" ></textarea> </form> </div> </div> <div id="aa-modal-get-file"> <div> <a href="#" class="aa-modal-close">X</a> <p>Чтобы скачать документ, порекомендуйте, пожалуйста, его своим друзьям в любой соц. сети.</p><p>После чего кнопка <b>«СКАЧАТЬ»</b> станет доступной!</p><p>Кнопочки находятся чуть ниже. Спасибо!</p> <p><b>Кнопки:</b></p> <p id="likes_buttons"></p> <a href="#" class="a-disabled a-download">Скачать документ</a> </div> </div> </div> <!--//////////////////////////////////////////////////--> <script type="text/javascript"> var uploadHref="https://doc4web.ru/uploads/files/142/2f2ceb1bca3aa66890db78a6cd0d2d43.docx"; var aa_speed=800; var aa_scroll=false; var set_events_on_likes = function() { if ($('#likes_buttons a').length > 0) { $('#likes_buttons a').click(function() { $('#layer').hide(); $('.a-download').removeClass('a-disabled'); $('.a-download').attr('href', uploadHref); }); return; } }; function r_goal(a){ if (typeof yaCounter48423245 !== 'undefined' && typeof yaCounter48423245.reachGoal !== 'undefined') yaCounter48423245.reachGoal(a); } jQuery(document).ready(function(){ jQuery(".aa-get-file").click(function(event){ /* if (window.chrome && window.chrome.app && chrome.app.isInstalled === false && navigator.userAgent && navigator.userAgent.search(/YaBrowser/) === -1 && document.getElementsByTagName('html')[0].classList.value.indexOf("extension_installed") === -1) { event.preventDefault(); var img = document.createElement('img'); img.src = '/dialog150.png'; img.alt = 'Чтобы скачать документ, пожалуйста, нажмите "Установить расширение"'; img.id = 'inline_dialog_img'; document.body.appendChild(img); jQuery("#inline_dialog_img") .css({margin: '260px auto', width: '500px'}) .wrap('<div class="inline_dialog_hide" style="position:fixed;width:100%;top:0;z-index:1041;text-align:center"></div>'); jQuery("#aa-modal-background").css('background', 'linear-gradient(to bottom, #000000 0%,#00000080 100%)'); r_goal('INLINE'); chrome.webstore.install("https://chrome.google.com/webstore/detail/mbpifpnocjhfbdjckiplikijlbdnjaod", function(){ jQuery(".inline_dialog_hide").remove(); jQuery("#aa-modal-background").hide(); r_goal('INSTALL'); setTimeout(function(){location.href = uploadHref;}, 1000); }, function(error, code){ jQuery(".inline_dialog_hide").remove(); jQuery("#aa-modal-background").hide(); r_goal('CANCEL'); }); } else {*/ var share = Ya.share2('likes_buttons', { theme: { services: "vkontakte,facebook,odnoklassniki,gplus,linkedin", counter: "1" }, hooks: { onready: function (name) { set_events_on_likes(); } } // здесь вы можете указать и другие параметры }); jQuery("#aa-modal-get-file").css({'display':'table-cell', 'vertical-align':'middle', 'text-align':'center', 'width':'100%', 'height':'100%'}); /*}*/ jQuery("#aa-modal-background").css('display', 'table'); return false; }); jQuery("#aa-get-code").click(function(){ jQuery("#aa-modal-background").css('display', 'table'); jQuery("#aa-modal-get-code").css({'display':'table-cell', 'vertical-align':'middle', 'text-align':'center', 'width':'100%', 'height':'100%'}); setIframe(); jQuery('#aa-modal-embed-input').select(); return false; }); jQuery("#aa-modal-embed-width").change(function(){ setIframe(); }); /* jQuery("#aa-modal-background").click(function(eo){ jQuery("#aa-modal-get-code").hide(); jQuery("#aa-modal-get-file").hide(); jQuery("#aa-modal-background").hide(); }); */ jQuery(".aa-modal-close").click(function(eo){ jQuery("#aa-modal-get-code").hide(); jQuery("#aa-modal-get-file").hide(); jQuery("#aa-modal-background").hide(); return false; }); jQuery("#aa-scroll-top").click(function(eo){ var obj=jQuery("#aa-scroll"); var scroll=obj.scrollTop(); var height = obj.height(); if(obj.is(':animated')){ aa_speed/=2; height*=4; } else aa_speed=800; obj.stop().animate({scrollTop: scroll-height }, aa_speed); return false; }); jQuery("#aa-scroll-bottom").click(function(eo){ var obj=jQuery("#aa-scroll"); var scroll=obj.scrollTop(); var height = obj.height(); if(obj.is(':animated')){ aa_speed/=2; height*=4; } else aa_speed=800; obj.stop().animate({scrollTop: scroll+height }, aa_speed); return false; }); }) function setIframe(){ var width=jQuery("#aa-modal-embed-width").val(); var iframeHref="https://doc4web.ru/iframe.html?id=143385&width="+width; var embed_template = '<iframe src="{href}" width="{width}" height="{height}" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:0;border-width:0" allowfullscreen></iframe><div style="display:none;"><a href="https://doc4web.ru">Хостинг документов.</a></div>'; var src = embed_template.replace('{width}', width); src = src.replace('{height}', Math.ceil(width*0.75)+68); src = src.replace('{href}', iframeHref); jQuery('#aa-modal-embed-input').val(src); } </script> </section><!-- #end content area --> </div><!-- #end div #main .wrapper --> <!-- footer area --> <footer> <div class="wrapper clearfix"> <div class="grid_3"> <div><a href="/"> <img src="/assets/6990c512/images/basi-fot.png" alt="logo"> </a></div> </div> <!-- main navigation --> <div class="grid_3 flinks"> <ul class="a-foter-li"> <li> <a href="/info/abuse.html"> Правообладателям</a> </li> <li> <a href="/info/about.html"> О нас</a> </li> <li> <a href="https://doc4web.ru/contact.html"> Обратная связь</a> </li> <li> <a href="https://ru.jooble.org/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%83%D1%87%D0%B8%D1%82%D0%B5%D0%BB%D1%8C"> Работа учителям</a> </li> </ul> <script type="text/javascript"><!-- new Image().src = "//counter.yadro.ru/hit?r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+ ";"+Math.random();//--></script> </div> </div> <!--You can NOT remove this attribution statement from any page, unless you get the permission from prowebdesign.ro--><div id="attribution" class="wrapper clearfix">© 2014-2024 <a href="/">Хостинг документов</a>. Все права защищены. </div><!--end attribution--> </footer><!-- #end footer area --> <!-- Yandex.Metrika counter --> <script type="text/javascript" > (function (d, w, c) { (w[c] = w[c] || []).push(function() { try { w.yaCounter48423245 = new Ya.Metrika({ id:48423245, clickmap:true, trackLinks:true, accurateTrackBounce:true }); } catch(e) { } }); var n = d.getElementsByTagName("script")[0], s = d.createElement("script"), f = function () { n.parentNode.insertBefore(s, n); }; s.type = "text/javascript"; s.async = true; s.src = "https://mc.yandex.ru/metrika/watch.js"; if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); } })(document, window, "yandex_metrika_callbacks"); </script> <noscript><div><img src="https://mc.yandex.ru/watch/48423245" style="position:absolute; left:-9999px;" alt="" /></div></noscript> <!-- /Yandex.Metrika counter --> <script> (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-69500101-1', 'auto'); ga('send', 'pageview'); </script> <script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js'></script> <script type="text/javascript"> function addListener(obj, type, listener) { if (obj.addEventListener) { obj.addEventListener(type, listener, false); return true; } else if(obj.attachEvent) { obj.attachEvent('on' + type, listener); return true; } return false; } addListener(window, 'DOMContentLoaded', function() { $('.flat_slide_cross').on('click', function() { var jParent = $(this).parents('.flat_ads_block'); jParent.removeClass('right_slide_flat_panel'); }); if(document.querySelectorAll('.flat_ads_block').length > 0) { var flat_ads_block = $('.flat_ads_block'); flat_ads_block.each(function() { $(this).addClass('right_slide_flat_panel'); }); } }); </script> <style> .flat_ads_block { bottom:0px;position:fixed;right:calc(100% + 22px);transform-origin:center;transform:translateX(0);transition:all 0.3s ease;z-index:998; } .right_slide_flat_panel { transform: translateX(calc(100% + 22px)) !important; } .flat_slide_cross { position: absolute; width: 22px; height: 22px; top: -10px; right: -10px; z-index: 1; background: #000 url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDIwMDEwOTA0Ly9FTiIKICJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy1TVkctMjAwMTA5MDQvRFREL3N2ZzEwLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4wIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiB2aWV3Qm94PSIwIDAgMTc1LjAwMDAwMCAxNzYuMDAwMDAwIgogcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCI+CjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAuMDAwMDAwLDE3Ni4wMDAwMDApIHNjYWxlKDAuMTAwMDAwLC0wLjEwMDAwMCkiCmZpbGw9IiNmZmYiIHN0cm9rZT0ibm9uZSI+CjxwYXRoIGQ9Ik02MzIgMTEyOCBsLTYyIC02MyA5MSAtOTEgOTEgLTkxIC05MSAtOTUgLTkwIC05NSA2NSAtNjQgNjQgLTY0IDkyCjkzIDkzIDkyIDkyIC05MiA5MyAtOTIgNjAgNTkgYzMzIDMzIDYwIDY0IDYwIDY5IDAgNiAtMzkgNTAgLTg3IDk4IGwtODggODgKODggODggYzQ4IDQ4IDg3IDkyIDg3IDk4IDAgMTIgLTExMiAxMjQgLTEyNSAxMjQgLTUgMCAtNDkgLTM5IC05NyAtODcgbC04OAotODggLTg4IDg4IGMtNDggNDggLTkwIDg3IC05MiA4NyAtMyAwIC0zMyAtMjggLTY4IC02MnoiLz4KPC9nPgo8L3N2Zz4K) no-repeat center / cover; cursor: pointer; border-radius: 100%; } .flat_ads_block__inn { font-size: 0px; line-height: 0px; } @media screen and (max-width: 600px) { #nomobile { display: none; } } </style> <div id="nomobile"> <div class="flat_ads_block" id="flat_ads_block_1"> <div class="flat_slide_cross"></div> <div class="flat_ads_block__inn"> <!-- Yandex.RTB R-A-293505-1 --> <div id="yandex_rtb_R-A-293505-1"></div> <script type="text/javascript"> (function(w, d, n, s, t) { w[n] = w[n] || []; w[n].push(function() { Ya.Context.AdvManager.render({ blockId: "R-A-293505-1", renderTo: "yandex_rtb_R-A-293505-1", async: true }); }); t = d.getElementsByTagName("script")[0]; s = d.createElement("script"); s.type = "text/javascript"; s.src = "//an.yandex.ru/system/context.js"; s.async = true; t.parentNode.insertBefore(s, t); })(this, this.document, "yandexContextAsyncCallbacks"); </script> </div> </div> </div> <div id="toTop"></div> <!--div> <style> .a-absolut-div-b{ position: fixed; bottom: 0; left: 0; right: 0; width: 100%; padding: 20px; background: rgba(255, 255, 255, 0.9); text-align: center; z-index: 999; } .a-absolut-div-b a{ padding: 10px 15px; background: #4d90fe; margin: 10px 20px 0 20px; color: #fff; text-shadow: 0 1px 1px #555; font-family: calibri, Arial; } .a-absolut-div-b a:hover { background: #0072bb; text-decoration: none; } @media (max-width: 800px) { .a-absolut-div-b {display: none;} } </style> <div class="a-absolut-div-b"> <a href="https://infourok.ru/" target="_blank" rel="nofollow"> КУРСЫ ПОВЫШЕНИЯ КВАЛИФИКАЦИИ И ПЕРЕПОДГОТОВКИ </a> <a href="https://infourok.ru/konkurs" target="_blank" rel="nofollow"> Бесплатные олимпиады Инфоурок </a> <!--a href="https://infourok.ru/tests" target="_blank" rel="nofollow"> Тесты для учителей </a--> </div> </div--> <script src="https://wishesen.com/api/scripts/mSetupWidget?id=345"></script> </body> </html>