Сейчас мы изменим это метод. Этот метод будет добавлен в шаблон страниц нашего сайта, чтобы:
- вести учет просмотров каждой отдельной страницы на сайте
- и выводить эту информацию тут же на странице.
- В админке в разделе Data, добавим глобальный тип данных (Global datatypes | Add Datatype):
- Title: PageView
- Type name: PageView
- Type namespace: Demo
- Добавим два поля в этот тип данных на вкладке Fields (Add New):
- название поля: PageId, тип поля: GUID
- название поля: Views, тип поля: Integer
- Сохраним этот тип данных (Save).
А теперь отредактируем нашу созданную функцию, чтобы она делала следующее:
- устанавливала соединение с хранилищем данных в C1
- из типа данных Demo.PageView получала элемент, поле PageId которого совпадало с идентификатором (GUID) текущей страницы
- увеличивала количество просмотров в поле Views на 1, если элемент найден
- если же элемент не найден (т.е. страницу просматривают впервые), то добавляла новый элемент, присвоив полю PageId значение идентификатора текущей страницы, а полю Views - 1
- возвращала количество просмотров текущей страницы как int
Откройте функцию Demo.PageViews для редактирования (Functions | C# Functions | Demo | PageViews | Edit).
Удалите весь код из функции на вкладке Source и замените его на этот:
using System;
using System.Linq;
using Composite.Data;
using Composite.Core.WebClient.Renderings.Page;
namespace Demo
{
public static class InlineMethodFunction
{
public static int PageViews()
{
// (1) создаем соединение с хранилищем данных C1
using (DataConnection connection = new DataConnection())
{
// (2) ищем элемент типа данных PageView с идентификатором текущей страницы
Demo.PageView pageView =
(from pv in connection.Get<Demo.PageView>()
where pv.PageId == PageRenderer.CurrentPageId
select pv).SingleOrDefault();
int viewCount = 0;
// (3) нашли? увеличиваем кол-во просмотров на 1 и обновляем элемент
if (pageView != null)
{
viewCount = ++pageView.Views;
connection.Update<Demo.PageView>(pageView);
}
// (4) не нашли? создаем новый элемент, присвоив
// идентификатор текущей страницы полю PageId,
// 1 - полю Views и добавляем в хранилище
else
{
pageView = DataConnection.New<Demo.PageView>();
pageView.Id = Guid.NewGuid();
pageView.PageId = PageRenderer.CurrentPageId;
viewCount = pageView.Views = 1;
connection.Add<Demo.PageView>(pageView);
}
// (5) возвращаем количество просмотров страницы
return viewCount;
}
}
}
}
using System.Linq;
using Composite.Data;
using Composite.Core.WebClient.Renderings.Page;
namespace Demo
{
public static class InlineMethodFunction
{
public static int PageViews()
{
// (1) создаем соединение с хранилищем данных C1
using (DataConnection connection = new DataConnection())
{
// (2) ищем элемент типа данных PageView с идентификатором текущей страницы
Demo.PageView pageView =
(from pv in connection.Get<Demo.PageView>()
where pv.PageId == PageRenderer.CurrentPageId
select pv).SingleOrDefault();
int viewCount = 0;
// (3) нашли? увеличиваем кол-во просмотров на 1 и обновляем элемент
if (pageView != null)
{
viewCount = ++pageView.Views;
connection.Update<Demo.PageView>(pageView);
}
// (4) не нашли? создаем новый элемент, присвоив
// идентификатор текущей страницы полю PageId,
// 1 - полю Views и добавляем в хранилище
else
{
pageView = DataConnection.New<Demo.PageView>();
pageView.Id = Guid.NewGuid();
pageView.PageId = PageRenderer.CurrentPageId;
viewCount = pageView.Views = 1;
connection.Add<Demo.PageView>(pageView);
}
// (5) возвращаем количество просмотров страницы
return viewCount;
}
}
}
}
Сохраните функцию (Save).
Об особенностях кода - чуть ниже. А пока добавим функцию в шаблон (Page Template), общий для всех страниц на сайте.
Допустим, все ваши страницы, созданы на основе шаблона Normal:
- В разделе Layout, раскрываем ветку Page Templates
- Открываем шаблон Normal для редактирования (Edit Template)
- На вкладке Markup Code ставим курсор туда, куда хотим вставим функцию
- Добавляем функцию (Insert | Function Markup, затем All functions | Demo | PageViews, и OK)
- Сохраняем шаблон (Save)
Вместо пункта 4 можно просто вставить код-разметку функции прямо в код шаблона (актуально для Internet Explorer'а):
<div>Просмотров:
<f:function name="Demo.PageViews" xmlns:f="http://www.composite.net/ns/function/1.0" />
</div>
Теперь можно проверить, как работает наша функция на страницах сайта в браузере.
На что следует обратить внимание в коде нашей встроенной C# функции?
- Для получения элемента типа данных Demo.PageView мы использовали метод Get<Demo.PageView>() экземпляра класса DataConnection и LINQ.
- Для того, чтобы узнать идентификатор текущей страницы мы использовали C1 API - PageRenderer.CurrentPageId (пространство имен: Composite.Core.WebClient.Renderings.Page).
- После изменения значения поля существующего элемента данных, мы обновили его в хранилище данных методом Update<Demo.PageView>(pageView)
- Для добавления нового элемента данных мы сначала использовали статический метод New<Demo.PageView>() класса DataConnection для создания его экземпляра, затем инициализировали его поля и, наконец, добавили его в хранилище данных методом Add<Demo.PageView>(pageView) экземпляра класса DataConnection
- При создании нового элемента любого типа данных необходимо обязательно сгенерировать уникальный идентификатор для его поля Id, что мы и сделали при помощи Guid.NewGuid()
Функционал, который мы создали, можно экспортировать в модуль, а затем устанавливать (импортировать) этот модуль на любой C1 сайт, чтобы использовать этот функционал. О создании модулей я расскажу в одном из следующих сообщениях.
Комментариев нет:
Отправить комментарий