Передача данных через URL "Пассивная" работа с сайтом (без редактирования содержимого)
Правила : 1 Структуризуйте код, облегчая себе его дальнейшую отладку. 2 Старайтесь делать различимыми в странице области: - форматирования текста, - работы с базами данных, - выполнение процедур на стороне сервера - и клиента. 3 Страница отдаваемая сервером должна легко читаться в HTML коде (для Вас же!). Не забывайте применять знак переноса строки и комментарии вида <!-- блок такой-то/секция такая-то -->. Навигация по html-коду по странице станет более простой. Пишите комментарии! Жить станет легче :)) Итак, база данных. Создаем таблицу, в которой будет содержание страниц. Имя таблицы - tArticles. Имя поля | Тип данных | Примечания | IDArticle | Счетчик | Длинное целое, идентификатор статьи, генерируется базой данных | IDChapter | Числовой | Длинное целое. Идентификатор раздела, к которому относится статья. Индексированное поле. | ArticleDate | Дата/время | Время размещения статьи. Значение по умолчанию - Now() | ArticleName | Текст | Текст, 255 символов - название статьи | Annotation | МЕМО | Поле МЕМО - аннотация к статье (краткий обзор) | Article | МЕМО | Содержание статьи | Author | текст | Автор статьи | ArticleLinks | текст | Ссылка по статье | В конструкторе таблицы по свойствам поля IDChapter установите "Индексированное поле - да". После создания таблицы необходимо установить связи между таблицами tChapter и tArticles. Откройте меню базы данных: СЕРВИС->Схема данных. Правой кнопкой мыши над панелью "Схемы..." вызовите контекстное меню и в нем пункт "добавить таблицу". Установите связь полей IDChapter(tChapter)-IDChapter(tArticles) с типом отношения один-к-многим. Поставьте галки по всем трем пунктам: - обеспечение целостности данных - каскадное обновление связанных полей - каскадное удаление связанных полей. Теперь база должна работать резвее. Заполните пока вручную поля таблицы tArticles. Сделать это можно так: Напишите названия статей. Пока можно и от балды. Например: "О вреде курения","Чашки начинающего гончара", "Жужжание, как вибрация"... А в поле IDChapter поставьте то число, которое будет соответствовать выбранной теме. При желании в поле Article напишите тоже по паре предложений. Закройте базу и вернемся к ASP. Нам необходимо так написать страницу, что бы при выборе темы мы получали ту же самую страницу, но со списком заголовков статей, подчиненных данной теме. 1 Если помните, то в странице default.htm у нас шла ссылка на страницу содержания <a href=pages/cont.asp>, теперь мы изменим ее еще раз: <a href=pages/cont.asp?id=0> А здесь остановимся подробнее. Наверное, если вы пришли к ASP, то знаете про заполнение форм. Вы указываете тип поля, имя поля и метод передачи. Необходимо указать страницу назначения, где и прочитается значение поля. <FORM METHOD="POST"><ACTION="SAMPLE.ASP"><INPUT TYPE="TEXT" NAME="FIELD1"><INPUT TYPE="SUBMIT" VALUE="Поехали!"> , что выглядит так: Для того, чтобы прочитать поле с именем Field1 вы используете объект Request. Делается это очень просто, в странице-получателе sample.asp должна быть строка <%=Request.Form("Field1")%> Серверу эти данные передаются в виде Field1=123, где 123 - это введенный текст. Если в форме два и больше полей, то выглядеть это будет: Field1=123&Field2=456&... Вышесказанное надо запомнить и отложить на недолгую полочку памяти, чтобы воспользоваться, когда мы вернемся к редактированию и администрированию нашего сайта. А в контексте продолжаем. Данные странице-адресату можно передавать и явно, например через URL: <a href=sample.asp?id=6> id - идентификатор, а 6 - его значение. Знак вопроса отделяет собственно адрес страницы от данных, которые мы в нее передаем. Чтение параметра: <%=Request.QueryString("id")%> Теперь Вы легко догадаетесь, как сделать содержание со ссылками. Если мы ранее просто формировали заголовок темы прочитанной из таблицы, то теперь мы можем сделать из нее ссылку. Помните про уникальные идентификаторы для тем из таблицы базы данных? Вот они теперь и станут нашими главными помощниками. Отмашка. Изменение страницы содержания. Сценарий простой. Все темы являются ссылками. При нажатии на ссылку вызывается ТА ЖЕ САМАЯ страница, но со списком статей по выбранной теме. Страничка разбита по вертикали на две части (таблица). Слева - список тем, справа - их содержимое. Если тема не выбрана - тогда надпись "Добро пожаловать". Если статей в теме нет - надпись "Содержание раздела такого-то: статей нет" Код странички, как вы увидите ниже, сильно раздулся, может даже стать страшновато. Но приглядевшись вы увидите, что сие "раздутие" касается только блоков форматирования текста, выбор которых будет определяться в зависимости от протекания сценария. Если сбой произойдет на сценарии - вы перейдете на указанную строку и подправите текст сценария. Если оформление творит выкрутасы - вы разберете функции форматирующие текст. pages/cont.asp <%Response.Expires=0%> <!--#include file=../page_inc/conn.inc--> <!--#include file=../page_inc/up.inc--> <!-- таблица, которая будет разделена на две части. В левой - список тем. В правой перечень подчиненных статей, согласно выбранной теме. --> <table border=0 width="100%" height="450"><td width="25%" valign="top"> <% Dim id, ChapterName'Опрашиваем идентификатор id id = Clng(Request.QueryString("id")) 'CLng - встроенная функция, вернет 0, если строка "" 'отладка 'Response.Write "Переменная id = " & id & "<br>" '============================================================== 'Форматирование разделов Function MakeContChapter(strCont,lngChapt) 'Отладка 'Response.Write "id = " & id & " глава:" & lngChapt ' ' Следущий IF, если тема выбрана, убирает ссылку на нее, название темы выделяется другим цветом, ' А в правой ячейке таблицы (содержание ведь в левой) ' будет выведен список подчиненных теме статей If Clng(id) = Clng(lngChapt) Then ChapterName = strCont strCont = _ "<table width='80%' border=0 bordercolor=#e2e2e2 " & _ "style='font-size: 9pt; font-family: Arial;'>" & _ vbCrLf & "<td width=15><img src='../img/ofolder.gif'></td>" & _ vbCrLf & "<td bgcolor=gray><font color='#FFFFFF'><b> " & _ strCont & "</b></font></td></table>" Else strCont = _"<table width='80%' border=0 bordercolor=#e2e2e2 " & _ "style='font-size: 9pt; font-family: Arial;'>" & _ vbCrLf & "<td width=15><img src='../img/folder.gif'></td>" & _ vbCrLf & "<td bgcolor='#EAEAEA'><b> " & _ "<a href='cont.asp?id=" & Clng(lngChapt) & "'>" & _ strCont & "</a></b></td></table>" End If MakeContChapter=strCont & vbCrLf & vbCrLf End Function '============================================================== 'Форматирование заголовка статьи Function MakeContArticle(strCont,lngArticle) strCont = _ "<table width='100%' border=0 bordercolor=#e2e2e2 " & _ "style='font-size: 9pt; font-family: Arial;'>" & _ vbCrLf & "<td width=15><img src='../img/page.gif'></td>" & _ vbCrLf & "<td bgcolor='#EAEAEA'> " & _ "<a href='article.asp?id2=" & Clng(lngArticle) & "'>" & _ strCont & "</a></td></table>"MakeContArticle=strCont & vbCrLf & vbCrLf End Function '============================================================== '---------------------------------------------- ' Сценарий: записываем заголовки разделов Dim rs1, sSQL1 sSQL1 = "SELECT * FROM tChapter" Set rs1=cn.Execute(sSQL1) While (Not rs1.EOF) Response.Write MakeContChapter(rs1("ChapterName"), rs1("IDChapter")) rs1.MoveNext Wend rs1.Close ' Сценарий: закончили запись заголовков разделов в страницу %> <!-- отдел заголовков статей --> </td><td valign="top" border=0 bgcolor=silver> <% '----------------------------------------------------------- ' Сценарий: Проверяем, выбран ли раздел If id=0 then Response.Write "Добро пожаловать на мой сайт." Else ' Сценарий: записываем заголовки статей sSQL1 = "SELECT * FROM tArticles Where IDChapter =" & id Set rs1=cn.Execute(sSQL1) Response.Write "<big>Содержание раздела <b>" & ChapterName & "</b>:</big>" If rs1.EOF Then Response.Write " статей по разделу нет..." End If While (Not rs1.EOF) Response.Write MakeContarticle(rs1("ArticleName"),rs1("IDArticle")) rs1.MoveNext Wend rs1.close end if '----------------------------------------------------------- ' Не забудьте удалить ссылку! Set cn = Nothing %> </td></table> <!--#include file=../page_inc/low.inc--> | Полагаю, что написание странички со статьей, после разбирательства с этим первым "монстром" будет вам по силам. Ну, а для самых нетерпеливых приведу пример ее текста ниже: pages/article.asp <%Response.Expires=0%> <!--#include file=../page_inc/conn.inc--> <!--#include file=../page_inc/up.inc--> <%Dim id2, sSQL1,UpLowTitle id2 = CLng(Request.QueryString("id2")) ' Вот случай, когда источником записей является не таблица, а запрос sSQL1= "SELECT tArticles.*, tChapter.ChapterName FROM tChapter " & _ "INNER JOIN tArticles ON tChapter.IDChapter = tArticles.IDChapter " & _ "WHERE IDArticle=" & id2 Set rs1=cn.Execute(sSQL1) 'Верхнее, оно же и нижнее обрамление страницы UpLowTitle="<Table class='title'><td width=630>" & _ vbCrLf & "<img src='../img/folder.gif' border=0>" & _ "<a href='cont.asp?id=" & rs1("IDChapter") & "'>" & _ rs1("ChapterName") & " >></a> <br>" & _ "<img src='../img/page.gif' border=0> Статья " & _ vbCrLf & rs1("ArticleName") & _ "</td><td><center><a href='javascript:history.back();'>Назад</a></center></td></table>" Response.Write UpLowTitle & rs1("Article") & UpLowTitle rs1.close Set cn= Nothing %> <!--#include file=../page_inc/low.inc--> | Даунлоад по первым двум урокам скоро будет. Смотрите анонсы. Теперь время думать, как можно вносить новые материалы. |