Saitistika 4.0.Руководство разработчика.2005
.pdf%>
<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 |
|
|