Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Saitistika 4.0.Руководство разработчика.2005

.pdf
Скачиваний:
11
Добавлен:
23.08.2013
Размер:
3.22 Mб
Скачать

%>

<br>

<%=oRootMaterial.PageIcons(0)%><%=oRootMaterial.PageContent(0)%>

<%

' Не забываем вызвать UserSession.EndPage в конце страницы

UserSession.EndPage

%>

</body>

</html>

<% End Sub

Таким образом, и общая нижняя часть страниц (блоки A4 и A5) реализована. Перейдем к выводу основного содержания страницы.

Вывод содержания страницы начинается с вызова функции StartPage из класса CPageDecoration. Содержимое страницы выводится в таблице. Фунцкия StartPage начинает таблицу и открывает первый ее столбец. Функция DividePageColumn закрывает текущий столбец и начинает следующий, а функция PassPageColumn закрывает текущий столбец и начинает следующий шириной в два столбца. Функция EndPage закрывает текущий столбец и завершает таблицу. Проанализировав прототип нашего веб-сайта, видим, что первый столбец на главной странице узкий, а на остальных таблицах он шириной в два первых столбца с главной страницы. Поэтому функциональность со стандартного сайта не совсем нам подходит, а именно нам надо уметь начинать страницу со столбца шириной в две колонки, причем это будет стандартный способ. Создадим для этого в классе CPageDecoration новый метод, StartPageEx, с параметром, принимающим значения True/False (соответственно начинать таблицу со столбца шириной в две или одну колонку):

Sub StartPageEx(IsTwoCol) If Print Then Exit Sub CurrentColumn = 0

%><table width="<%=TableWidth & WidthType%>" cellspacing="0" cellpadding="0" border="0">

<tr valign=top> <%

If IsTwoCol Then

Dim Width : Width = ColumnsWidth(CurrentColumn) + ColumnsWidth(CurrentColumn+1) - IIF(WidthType="%",1,10)

%><td width="<%=Width & WidthType%>"><% CurrentColumn = CurrentColumn + 1

Else

%><td width="<%=ColumnsWidth(CurrentColumn) & WidthType%>"><% End If

End Sub

Функцию StartPage как основную для начала содержимого страницы переопределим через StartPageEx:

Sub StartPage : StartPageEx True : End Sub

После разбиения страницы на колонки можно реализовать вывод блока A3 – общей правой колонки (правая колонка общая только для страниц раздела и материала). Левая навигация на стандартном сайте выводится методом LeftNavigation класса CPageDecoration. На нашем же сайте навигация не левая, а правая, хотя содержимое правой навигации с нашего сайта очень похоже на содержимое с навигации стандартного сайта. Поэтому для вывода правой навигации можно использовать функцию LeftNavigation и шаблон navigation-leftmenu.xsl, или переименовать их в RightNavigation и navigation-rightmenu.xsl

это дело вкуса. Предположим, что мы не переименовали метод и файл для обратной совместимости. Теперь отметим отличия нашей навигации от стандартной: в нашей навигации не выводятся «+» и «-» для динамического раскрытия/закрытия дерева (навигация всегда раскрыта), а также для каждого раздела выводится количество материалов в нем. Знать количество материалов в каждом разделе нам потребуется и в дальнейшем. Для определения количество материалов в разделе можно воспользоваться стандартной хранимой процедурой Sait_Articles_GetMaterialsList, вызвав ее для корневого раздела и считая количество материалов в возвращенном рекордсете для каждого раздела. Минусом такого подхода является то, что эта процедура возвращает много лишней информации и, соответственно, будет замедлять работу страниц. Поэтому для вывода количества материалов по разделам напишем свою хранимую процедуру:

CREATE PROCEDURE [dbo].[Sait_Folders_GetArticleCount] @RootFolder INT

AS

Copyright © 2005 Individ company

Страница

Контакты: www.saitistika.ru | support@saitistika.ru | (0852) 321464

51 из 51

 

 

SET NOCOUNT ON

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

DECLARE

@ord VARCHAR(128)

SELECT

@ord = ord FROM Folders WHERE [ID] = @RootFolder

SELECT

F.[ID], COUNT(FA.Folder) [Count]

FROM Folders F

LEFT JOIN FolderArticles FA ON FA.Folder = F.[ID]

WHERE F.ord LIKE @ord + '%'

GROUP BY F.[ID]

GO

После создания хранимой процедуры не забудьте выставить для нее право EXEC для public. В качестве параметра RootFolder в эту процедуру можно передать ID текущего раздела (т.е. FolderID). Теперь функция LeftMenu примет следующий вид:

Sub LeftMenu

If Print Then Exit Sub

Navigator.AGetRS "Sait_Folders_GetArticleCount", Array(FolderID), "articlecount" Response.write Navigator.Output(NavigationTemplate)

%>

<br>

<%Banners_ShowBanner("Правый нижний")%> <%

End Sub

А модифицированный файл navigation-leftmenu.xsl примет следующий вид:

<?xml version='1.0' encoding="windows-1251"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:z="#RowsetSchema" xmlns:rs="urn:schemas-microsoft-com:rowset"> <xsl:output method="html" encoding="windows-1251"/>

<xsl:include href="templates.xsl"/>

<xsl:variable name="LeftIcons" select="boolean(/xml/param[@name='LeftIcons'])"/>

<xsl:template match="/"> <xsl:apply-templates/>

</xsl:template>

<xsl:template match="/xml">

<xsl:apply-templates select="rs:data[@name='folders']"/> </xsl:template>

<xsl:template match="rs:data[@name='folders']">

<xsl:apply-templates select="z:row[@id=$IFolderId]" mode="ifolder"/> </xsl:template>

<xsl:template match="z:row" mode="ifolder"> <div>

<xsl:apply-templates select="following-sibling::z:row[starts- with(@ord,current()/@ord) and string-length(@ord)=(string-length(current()/@ord)+5)]" mode="folder"/>

</div>

</xsl:template>

<xsl:template match="z:row" mode="folder">

<xsl:variable name="show" select="number(@rights)-floor(number(@rights) div 2048)*2048 >=1024"/>

<xsl:variable name="hide" select="boolean(substringafter(concat('.',@notes,'.'),'.hide.'))"/>

<xsl:if test="not($hide)">

Copyright © 2005 Individ company

Страница

Контакты: www.saitistika.ru | support@saitistika.ru | (0852) 321464

52 из 52

 

 

<xsl:choose>

<xsl:when test="$show"> <div class="map0">

<div class="map2">

<img alt=">" width="9" height="9" src="/images/bullet-arrow-right.gif" border="0" align="baseline"/>

<a href="/themes/{@themename}/{@filename}?folder={@id}"> <xsl:if test="starts-with($folder/@ord,@ord)">

<xsl:attribute name="style">color: black;</xsl:attribute> </xsl:if>

<xsl:value-of select="@title"/> <xsl:if

test="/xml/rs:data[@name='articlecount']/z:row[@ID=current()/@id]"> (<xsl:value-of

select="/xml/rs:data[@name='articlecount']/z:row[@ID=current()/@id]/@Count"/>)

</xsl:if>

</a>

<xsl:if test="$LeftIcons"> <xsl:call-template name="ficons"/>

</xsl:if>

<br clear="all"/> </div>

</div>

<xsl:if test="following-sibling::z:row[starts-with(@ord,current()/@ord)]"> <div id="{@id}" class="map1">

<xsl:apply-templates select="following-sibling::z:row[starts- with(@ord,current()/@ord) and string-length(@ord)=(string-length(current()/@ord)+5)]" mode="folder"/>

</div>

</xsl:if>

</xsl:when>

<xsl:otherwise/>

</xsl:choose>

</xsl:if>

</xsl:template>

</xsl:stylesheet>

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

oPD.Top

oPD.StartPage

'...

'Основное содержимое oPD.DividePageColumn

oPD.LeftMenu

oPD.EndPage

oPD.Bottom

Теперь перейдем к выводу основного содержимого страницы раздела.

Copyright © 2005 Individ company

Страница

Контакты: www.saitistika.ru | support@saitistika.ru | (0852) 321464

53 из 53

 

 

Для начала заменим на странице все, что находится между вызовами oPD.Top и oPD.Bottom, на фрагмент кода, приведенный выше. Теперь в качестве основного содержимого будем выводить элементы страницы раздела. Первый элемент (блок B1) – первая страница индексного материала раздела и название раздела. Индексную страницу выведем аналогично странице индексного материала сервера:

%><%=FolderInfo.IndexArticle.PageIcons(0)%><%=FolderInfo.IndexArticle.PageContent(0)%><%

Для вывода заголовка существует стандартная функция объекта oPD – Heading1, вызов которой вставим сразу после вывода индексной страницы материала: oPD.Heading:

oPD.Heading FolderInfo.Title, FolderInfo.Icons, "", ""

Сам метод Heading (в классе CPageDecoration) нам также потребуется изменить, так как дополнительный html, выводимый на стандартном сайте, нам не нужен и его можно удалить. После этого метод Heading примет следующий вид:

Sub Heading(Title, Icons, PrintUrl, UpdateDate) If Print Then Exit Sub

%><h1><%=strSpacer(Title, 50)%> <%If MainIcons Then%><%=Icons%><%End If%></h1><% End Sub

Этот метод будем использовать и при выводе заголовка материала. Заметим, что в css для стандартного сайта (ie.css и nn.css) заголовок h1 выводится зеленым цветом. Поэтому в файлах ie.css и nn.css нам потребуется убрать атрибут color в стиле для тега H1.

Затем идет таблица из 2 колонок шириной по 50%. Содержимое первой колонки (блок B2) – список материалов в виде блоков (картинка материала, название (со ссылкой), краткая сопроводительная надпись и список присоединенных к материалу файлов со ссылками). Выводить список материалов удобно через класс CMaterials, находящийся в файле

Copyright © 2005 Individ company

Страница

Контакты: www.saitistika.ru | support@saitistika.ru | (0852) 321464

54 из 54

 

 

/common/include/CMaterials.asp. Для вывода подробных сведений о материале (список файлов) понадобится создавать экземпляры класса CArticle:

Dim Articles, Article, I, J, Img, ImgHtml, Comment : Set Articles = New CMaterials Articles.ShowHide = False

Articles.Subfolders = False Articles.GetInfo FolderID, UserInfo.UserID

If Articles.IsInit Then

oPD.StartList

For I = 0 To Articles.Count

Set Img = Articles.Img(I)

If Img.ID > 0 Then ImgHtml = Img.Compress(90) Else ImgHtml = ""

Comment = TXS(Articles.ShortComment(I))

' В комментарий дополнительно включим html для вывода списка файлов

Dim Article : Set Article = New CArticle Article.Load Articles.ID(I), UserInfo.UserID, -1, -1

If Article.AttachCount >= 0 Then

Comment = Comment & "<br clear=""all"">"

End If

For J = 0 To Article.AttachCount

Dim Ext, Icon, Size

GetFileInfo Article.AttachUrl(J), Article.AttachSize(J), _ Ext, Icon, Size

Comment = Comment & " <img alt="">"" width=""9"" height=""9"" src=""/images/bullet-arrow-right.gif"" border=""0"" align=""baseline""> <a href=""" & Article.AttachUrl(J) & """>" & TXS(Article.AttachTitle(J)) & "</a><br clear=""all"">"

Next

oPD.ListItemEx _

Articles.Url(I), Articles.Title(I), Articles.MatIcons(I), "", _ Articles.ANotes(I), ImgHtml, Comment, "", "", True, False

Next oPD.EndList

End If

Во второй колонке (блок B3) требуется вывести список подразделов с указанием количества материалов в них. Выводим этот список аналогично, для подсчета количества материалов можем воспользоваться хранимой процедурой Sait_Folders_GetArticleCount, написанной ранее. Для удобства загрузим возвращаемый ей рекордсет сначала в объект oXml

класса CXMLDOM:

Dim Folders, I, Img, ImgHtml, MatCount, Node

oXml.Reset

oXml.AGetRS "Sait_Folders_GetArticleCount", Array(FolderID) oXml.data(0).setAttribute "name", "articlecount"

Set Folders = New CSubFolders

Folders.ShowHide = False

Folders.Root = False

Folders.Level = 1

Folders.GetInfo FolderID, UserInfo.UserID

If Folders.IsInit Then

oPD.StartList

For I = 0 To Folders.Count

Set Img = Folders.SmallImg(I)

If Img.ID > 0 Then ImgHtml = Img.Compress(90) Else ImgHtml = ""

Set Node = oXml.XML.SelectSingleNode(

"/xml/rs:data[@name='articlecount']/z:row[@ID=" & Folders.FolderID(I) & "]")

Copyright © 2005 Individ company

Страница

Контакты: www.saitistika.ru | support@saitistika.ru | (0852) 321464

55 из 55

 

 

If Node Is Nothing Then

MatCount = "Материалов: 0"

Else

MatCount = "Материалов: " & Node.GetAttribute("Count")

End If

oPD.ListItem _

Folders.Url(I), Folders.Title(I), Folders.Icons(I), "", _ "", ImgHtml, TXS(Folders.Description(I)), MatCount, ""

Next oPD.EndList

End If

Теперь все элементы страницы раздела реализованы.

Страница материала (material.asp)

Все содержимое файла между oPD.Top и oPD.Bottom приводим к шаблону, приведенному в предыдущем разделе. Внутри

основного содержимого страницы оставляем

Dim oMaterialDecoration : Set oMaterialDecoration = New CMaterialDecoration oMaterialDecoration.Load oMaterial.ID

oMaterialDecoration.Write()

Теперь требуется изменить несколько методов класса CMaterialDecoration, находящегося в файле CMaterialDecoration.asp каталога темы. Метода для вывода навигации по материалам раздела в классе нет, поэтому добавим его (он будет отвечать за

Copyright © 2005 Individ company

Страница

Контакты: www.saitistika.ru | support@saitistika.ru | (0852) 321464

56 из 56

 

 

блоки B4

Sub WriteFolderNavigation()

Dim Articles, I

Set Articles = New CMaterials

Articles.ShowHide = False

Articles.SubFolders = False

Articles.GetInfo FolderID, UserInfo.UserID

%>

<span align="right"><b>Навигация по разделу</b><br><br> <form>

<select class="form-element" onchange="window.navigate(options[selectedIndex].value);">

<%For I = 0 To Articles.Count%>

<option value="<%=Articles.URL(I)%>"<%If MatID=Articles.ID(I) Then%> selected<%End If%>><%=TXS(Articles.Title(I))%></option>

<%Next%>

</select></form></span>

<% End Sub

Метод WriteContent удобно переименовать во WritePage с параметром pNo и для обратной совместимости добавить метод

WriteContent:

Sub WriteContent : WritePage pNo : End Sub

После этого метод Write можно переписать следующим образом:

Sub Write

'

' Выполнить исполнимую инструкцию материала.

'

If Article.ScriptCode <> "" Then Execute Article.ScriptCode

End If

WriteFolderNavigation ' Верхний блок B4

'Название материала oPD.Heading Title, Icons, "", ""

'Содержимое страниц материала

Dim I : For I = 0 To Article.PageCount

WritePage I + 1

Next

WriteFolderNavigation ' Нижний блок B4

End Sub

Теперь все элементы страницы материала выведены.

Главная страница

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

Copyright © 2005 Individ company

Страница

Контакты: www.saitistika.ru | support@saitistika.ru | (0852) 321464

57 из 57

 

 

Так как на стандартном сайте содержимое главной страницы совершенно не совпадает с содержимым нового сайта, то в файле default.asp спокойно можно удалить все, что находится между oPD.Top и oPD.Bottom и вставить на это место следующий код:

oPD.Top

oPD.StartPageEx False %><br><%

'Содержимое первой колонки (блок B6) oPD.DividePageColumn

%><br><%

'Содержимое второй колонки (блок B7) oPD.DividePageColumn

%><br><%

'Содержимое третьей колонки (блок B8) oPD.EndPage

oPD.Bottom

Левая колонка страницы (блок B6) состоит из второй страницы индексного материала раздела и баннера из профила «Левый нижний». Страницу индексного материала выведем аналогично выводу страницы индексного материала для страницы раздела:

%><%=FolderInfo.IndexArticle.PageIcons(1)%><%=FolderInfo.IndexArticle.PageContent(1)%><%

Затем выведем баннер стандартным способом:

Banners_ShowBanner("Левый нижний")

В средней колонке (блок B7) сначала выводим содержимое третьей страницы индексного материала сервера уже знакомым

Copyright © 2005 Individ company

Страница

Контакты: www.saitistika.ru | support@saitistika.ru | (0852) 321464

58 из 58

 

 

нам способом:

%><%=FolderInfo.IndexArticle.PageIcons(2)%><%=FolderInfo.IndexArticle.PageContent(2)%><%

Далее выводим 2 последних материала с пометкой «Важное» (мнемоника – important). Заголовок Важные материалы») выведем через метод oPD.Heading2. Так как этот метод выведет заголовок через тег <h2>, то для того, чтобы заголовок был черным и без подчеркивания, в файлах ie.css и nn.css нужно убрать атрибуты color и border-bottom/margin-bottom в стиле для тега H2. Вывод блоков для материалов уже встречался нам при реализации страницы раздела, но здесь не требуется выводить присоединенные к материалу файлы:

Dim Articles, I, Img, ImgHtml

Set Articles = New CMaterials

Articles.OrderType = Articles.CByDate

Articles.ShowHide = False

Articles.MatCnt = 2

Articles.Notes = ".important."

Articles.GetInfo FolderID, UserInfo.UserID

If Articles.IsInit Then

oPD.Heading2 "Важные материалы", ""

oPD.StartList

For I = 0 To Articles.Count

Set Img = Articles.Img(I)

If Img.ID > 0 Then ImgHtml = Img.Compress(90) Else ImgHtml = ""

oPD.ListItem _

Articles.Url(I), Articles.Title(I), Articles.MatIcons(I), "", _ "", ImgHtml, Articles.ShortComment(I), "", ""

Next oPD.EndList

End If

Наконец, выводим 2 раздела с пометкой «Важно» (important). Выод списка подразделов уже встречался нам при реализации страницы раздела, но теперь не требуется выводить количество материалов в разделе:

Dim Folders, I, Img, ImgHtml

Set Folders = New CSubFolders

Folders.ShowHide = False

Folders.Level = 0

Folders.Notes = ".important."

Folders.GetInfo FolderID, UserInfo.UserID

If Folders.IsInit Then

oPD.Heading2 "Важные разделы", ""

oPD.StartList

For I = 0 To IIF(Folders.Count < 1, Folder.Count, 1)

Set Img = Folders.SmallImg(I)

If Img.ID > 0 Then ImgHtml = Img.Compress(90) Else ImgHtml = ""

oPD.ListItem _

Folders.Url(I), Folders.Title(I), Folders.Icons(I), "", _ "", ImgHtml, Folders.Description(I), "", ""

Next oPD.EndList

End If

Содержимое третьей колонки (блок B8) – это список подразделов раздела по умолчанию для типа «Каталог сервера» (раздел по умолчанию для каждого типа настраивается в свойствах сервера в бэкофисе), под которыми находится баннер из профиля «Правый нижний». Идентификатор раздела по умолчанию для типа «Каталог сервера» возвращает свойство SystemInfo.FIDServerCatalog. Будем использовать это свойство для получения списка его подразделов. Выведем список разделов через класс CSubFolders:

Dim Folders, I

Copyright © 2005 Individ company

Страница

Контакты: www.saitistika.ru | support@saitistika.ru | (0852) 321464

59 из 59

 

 

Set Folders = New CSubFolders

Folders.ShowHide = False

Folders.Level = 1

Folders.Root = False

Folders.GetInfo SystemInfo.FIDServerCatalog, UserInfo.UserID

For I = 0 To Folders.Count %>

<img alt=">" width="9" height="9" src="/images/bullet-arrow-right.gif" border="0" align="baseline">

<a href="<%=Folders.URL(I)%>"><%=TXS(Folders.Title(I))%></a><br clear="all"> <%

Next %><br><%

Banners_ShowBanner("Правый нижний")

Главная страница сайта, а вместе с ней и весь сайт, реализованы.

Copyright © 2005 Individ company

Страница

Контакты: www.saitistika.ru | support@saitistika.ru | (0852) 321464

60 из 60