Orchard CMS: программное наполнение сайта контентом

от автора

Представим ситуацию: необходимо перенести на сайт, сделанный на Orchard, большой объем каких-то данных. Например, это может быть интернет-магазин, сайт-каталог и т.д.

Допустим, нам надо создать сайт — каталог автомобилей. Для примера условимся, что для каждого автомобиля нужно хранить название модели, цену, год выпуска и количество имеющихся в наличии автомобилей. Используя исходники Orchard и немалое количество статей на тему написания модулей, создадим свой ContentType.

Model — класс Car со свойствами Model, Price, Year, Quantity:

    public class CarPartRecord : ContentPartRecord     {         public virtual string Model { get; set; }         public virtual decimal Price { get; set; }         public virtual int Year { get; set; }         public virtual int Quantity { get; set; }     }      public class CarPart : ContentPart<CarPartRecord>     {         public string Model         {             get { return Record.Model; }             set { Record.Model = value; }         }         public decimal Price         {             get { return Record.Price; }             set { Record.Price = value; }         }         public int Year         {             get { return Record.Year; }             set { Record.Year = value; }         }         public int Quantity         {             get { return Record.Quantity; }             set { Record.Quantity= value; }     } 

View:

    @T("Model: ") @Model.Model<br />     @T("Price: ") @Model.Price<br />     @T("Year: ") @Model.Year<br />     @T("Quantity: ") @Model.Quantity<br /> 

Хорошо, допустим, тип контента создан. Главная проблема заключается в том, что нужный нам каталог автомобилей необходимо импортировать в Orchard. Как это сделать?

Очевидно, что при объеме данных свыше 50 записей уже хотелось бы программно добавлять их в CMS. В Orchard для того, чтобы записать данные через БД, необходимо для каждого элемента добавить записи в 5 связанных таблиц:

  • ИмяМодуля_CarPartRecord
  • Common_CommonPartRecord
  • Common_CommonPartVersionRecord
  • Orchard_Framework_ContentItemRecord
  • Orchard_Framework_ContentItemVersionRecord

Дальше возможно два варианта: использовать или SQL-скрипты, или LINQtoSQL. Лично у меня, когда я проверял первый вариант, не получилось обойтись без конструкции вида

insert ... select ...

что при большом количестве записей (проверял на 3000+) приводит к совершенно неприемлемому времени работы (порядка нескольких часов).

Поэтому остановимся на втором варианте: напишем простое WinForms приложение, которое и будем производить импорт данных.

При запуске импорта должно последовательно вызываться 5 функций, добавляющих записи в каждую из вышеперечисленных таблиц, например:

private CarPartRecord create(/* строка из CSV-файла, XMLNode или любой другой формат исходных данных */)         {             CarPartRecord record = new CarPartRecord();             record.Model =    //             record.Price =      //заполнение полей созданного ContentPart             record.Year =       //соответствующими данными             record.Quantity = //              return record;         }  private Orchard_Framework_ContentItemRecord related1_create()          {             Orchard_Framework_ContentItemRecord record = new Orchard_Framework_ContentItemRecord();             record.ContentType_id = 9;         // по умолчанию в "чистой" CMS есть 8 разных ContentType, поэтому наш идет девятым             return record;         }          private Orchard_Framework_ContentItemVersionRecord related2_create(CarPartRecord item)         {             Orchard_Framework_ContentItemVersionRecord record = new Orchard_Framework_ContentItemVersionRecord();             record.Number = 1;             record.Latest = true;             record.Published = true;             record.ContentItemRecord_id = item.Id;             return record;         }          private Common_CommonPartRecord related3_create(int id)         // передаем ID созданного CarPartRecord         {             Common_CommonPartRecord record = new Common_CommonPartRecord();             record.CreatedUtc = DateTime.Now;             record.ModifiedUtc = DateTime.Now;             record.PublishedUtc = DateTime.Now;             record.OwnerId = 2;             record.Id = id;             return record;         }          private Common_CommonPartVersionRecord related4_create(int id)   //   передаем ID созданного CarPartRecord         {             Common_CommonPartVersionRecord record = new Common_CommonPartVersionRecord();             record.CreatedUtc = DateTime.Now;             record.ModifiedUtc = DateTime.Now;             record.PublishedUtc = DateTime.Now;             record.ContentItemRecord_id = id;             record.Id = id;             return record;         } 

И, соответственно, в main:

CarPartRecord record = create(/* наши параметры */); context.CarPartRecords.InsertOnSubmit(record);                                                          //создадим запись в основной таблице context.SubmitChanges();  Orchard_Framework_ContentItemRecord tmp1 = related1_create();                //и в остальных, используя для связи ID созданной CarPartRecord. context.Orchard_Framework_ContentItemRecords.InsertOnSubmit(tmp1);  Orchard_Framework_ContentItemVersionRecord tmp2 = related2_create(record); context.Orchard_Framework_ContentItemVersionRecords.InsertOnSubmit(tmp2);  Common_CommonPartRecord tmp3 = related3_create(record.Id); context.Common_CommonPartRecords.InsertOnSubmit(tmp3);  Common_CommonPartVersionRecord tmp4 = related4_create(record.Id); context.Common_CommonPartVersionRecords.InsertOnSubmit(tmp4); context.SubmitChanges(); 

В результате импорт 3000+ записей будет длиться около 100 секунд на машине средней конфигурации. Профит.

ссылка на оригинал статьи http://habrahabr.ru/post/170759/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *