четверг, 13 января 2011 г.

Создание и использование встроенных C# методов (4)

В предыдущем сообщении мы создали встроенную C# функцию Demo.PageViews на основе шаблона метода, использующего подключение к хранилищу данных в C1.

Сейчас мы изменим это метод. Этот метод будет добавлен в шаблон страниц нашего сайта, чтобы:
  • вести учет просмотров каждой отдельной страницы на сайте
  • и выводить эту информацию тут же на странице.
Так как наш шаблон использует подключение к хранилищу данных, нам понадобиться свой тип данных, который будет хранить информацию о просмотренных страницах и количестве просмотров:
  1. В админке в разделе Data, добавим глобальный тип данных (Global datatypes | Add Datatype):
    • Title: PageView
    • Type name: PageView
    • Type namespace: Demo
  2. Добавим два поля в этот тип данных на вкладке Fields (Add New):
    • название поля: PageId, тип поля: GUID
    • название поля: Views, тип поля: Integer
  3. Сохраним этот тип данных (Save).
(О создании типа данных - подробнее здесь, о добавлении полей - здесь.)

А теперь отредактируем нашу созданную функцию, чтобы она делала следующее:
  1. устанавливала соединение с хранилищем данных в C1
  2. из типа данных Demo.PageView получала элемент, поле PageId которого совпадало с идентификатором (GUID) текущей страницы
  3. увеличивала количество просмотров в поле Views на 1, если элемент найден
  4. если же элемент не найден (т.е. страницу просматривают впервые), то добавляла новый элемент, присвоив полю PageId значение идентификатора текущей страницы, а полю Views - 1
  5. возвращала количество просмотров текущей страницы как 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;
      }
    }
  }
}

Сохраните функцию (Save).

Об особенностях кода - чуть ниже. А пока добавим функцию в шаблон (Page Template), общий для всех страниц на сайте.

Допустим, все ваши страницы, созданы на основе шаблона Normal:
  1. В разделе Layout, раскрываем ветку Page Templates
  2. Открываем шаблон Normal для редактирования (Edit Template)
  3. На вкладке Markup Code ставим курсор туда, куда хотим вставим функцию
  4. Добавляем функцию (Insert | Function Markup, затем All functions | Demo | PageViews, и OK)
  5. Сохраняем шаблон (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 APIPageRenderer.CurrentPageId (пространство имен: Composite.Core.WebClient.Renderings.Page).
  • После изменения значения поля существующего элемента данных, мы обновили его в хранилище данных методом Update<Demo.PageView>(pageView)
  • Для добавления нового элемента данных мы сначала использовали статический метод New<Demo.PageView>() класса  DataConnection для создания его экземпляра, затем инициализировали его поля и, наконец, добавили его в хранилище данных методом Add<Demo.PageView>(pageView) экземпляра класса DataConnection
  • При создании нового элемента любого типа данных необходимо обязательно сгенерировать уникальный идентификатор для его поля Id, что мы и сделали при помощи Guid.NewGuid()
Функционал, который мы создали, можно экспортировать в модуль, а затем устанавливать (импортировать) этот модуль на любой C1 сайт, чтобы использовать этот функционал. О создании модулей я расскажу в одном из следующих сообщениях.

Комментариев нет:

Отправить комментарий