Advertisement
Guest User

Untitled

a guest
Sep 12th, 2015
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.33 KB | None | 0 0
  1. using System.Collections.Generic;
  2. using System.ComponentModel.DataAnnotations;
  3. using System.Linq;
  4. using Orchard.ContentManagement.Records;
  5. using Orchard.ContentManagement;
  6.  
  7. namespace SuccessCenter.Models
  8. {
  9. public class ProductPartRecord : ContentPartRecord
  10. {
  11. public ProductPartRecord()
  12. {
  13. Leaves = new List<ProductToLeavesRecord>();
  14. }
  15. public virtual IList<ProductToLeavesRecord> Leaves { get; set; }
  16. public virtual string ProductsContent { get; set; }
  17. }
  18. public class ProductPart : ContentPart<ProductPartRecord>
  19. {
  20. public string ProductsContent
  21. {
  22. get { return Retrieve(r => r.ProductsContent); }
  23. set { Store(r => r.ProductsContent, value); }
  24. }
  25.  
  26. public IEnumerable<ProductLeavesRecord> Leaves
  27. {
  28. get
  29. {
  30. return Record.Leaves.Select(r => r.ProductLeavesRecord);
  31. }
  32. }
  33.  
  34.  
  35. }
  36.  
  37. }
  38.  
  39. using System.Linq;
  40. using JetBrains.Annotations;
  41. using Orchard.ContentManagement;
  42. using Orchard.ContentManagement.Drivers;
  43. using SuccessCenter.Models;
  44. using SuccessCenter.Services;
  45. using SuccessCenter.ViewModels;
  46.  
  47. namespace SuccessCenter.Drivers
  48. {
  49. [UsedImplicitly]
  50. public class ProductDriver : ContentPartDriver<ProductPart>
  51. {
  52. private readonly IProductService _productService;
  53.  
  54. private const string TemplateName = "Parts/LeavesProduct";
  55.  
  56. public ProductDriver(IProductService productService)
  57. {
  58. _productService = productService;
  59. }
  60.  
  61. protected override string Prefix
  62. {
  63. get { return "LeavesProduct"; }
  64. }
  65.  
  66. protected override DriverResult Display(
  67. ProductPart part,
  68. string displayType,
  69. dynamic shapeHelper)
  70. {
  71.  
  72. return ContentShape("Parts_LeavesProduct",
  73. () => shapeHelper.Parts_LeavesProduct(
  74. ContentPart: part,
  75. Leaves: part.Leaves,
  76. ProductsContent: part.ProductsContent));
  77. }
  78.  
  79. protected override DriverResult Editor(
  80. ProductPart part,
  81. dynamic shapeHelper)
  82. {
  83.  
  84. return ContentShape("Parts_LeavesProduct_Edit",
  85. () => shapeHelper.EditorTemplate(
  86. TemplateName: TemplateName,
  87. Model: BuildEditorViewModel(part),
  88. Prefix: Prefix));
  89. }
  90.  
  91. protected override DriverResult Editor(
  92. ProductPart part,
  93. IUpdateModel updater,
  94. dynamic shapeHelper)
  95. {
  96.  
  97. var model = new EditLeavesViewModel<ProductLeafEntry>();
  98. updater.TryUpdateModel(model, Prefix, null, null);
  99.  
  100. if (part.ContentItem.Id != 0)
  101. {
  102. _productService.UpdateLeavesForContentItem(
  103. part.ContentItem, model.Leaves);
  104. }
  105.  
  106. return Editor(part, shapeHelper);
  107. }
  108.  
  109. private EditLeavesViewModel<ProductLeafEntry> BuildEditorViewModel(ProductPart part)
  110. {
  111. var itemLeaves = part.Leaves.ToLookup(r => r.Id);
  112. return new EditLeavesViewModel<ProductLeafEntry>
  113. {
  114. Leaves = _productService.GetLeaves().Select(
  115. r => new ProductLeafEntry
  116. {
  117. ProductLeaf = r,
  118. IsChecked = itemLeaves.Contains(r.Id)
  119. }).ToList(),
  120. ProductsContent = part.ProductsContent
  121. };
  122. }
  123. }
  124. }
  125.  
  126. using System.Collections.Generic;
  127. using System.Linq;
  128. using Orchard;
  129. using Orchard.ContentManagement;
  130. using Orchard.Data;
  131. using SuccessCenter.Models;
  132. using SuccessCenter.ViewModels;
  133.  
  134. namespace SuccessCenter.Services
  135. {
  136. public interface IProductService : IDependency
  137. {
  138. void UpdateLeavesForContentItem(
  139. ContentItem item,
  140. IEnumerable<ProductLeafEntry> Leaves);
  141. IEnumerable<ProductLeavesRecord> GetLeaves();
  142. }
  143.  
  144. public class ProductService : IProductService
  145. {
  146. private readonly IRepository<ProductLeavesRecord>
  147. _productLeavesRepository;
  148. private readonly IRepository<ProductToLeavesRecord>
  149. _productToLeavesRepository;
  150.  
  151. public ProductService(
  152. IRepository<ProductLeavesRecord> productLeavesRepository,
  153. IRepository<ProductToLeavesRecord> productToLeavesRepository)
  154. {
  155.  
  156. _productLeavesRepository = productLeavesRepository;
  157. _productToLeavesRepository = productToLeavesRepository;
  158. }
  159.  
  160. public void UpdateLeavesForContentItem(
  161. ContentItem item,
  162. IEnumerable<ProductLeafEntry> Leaves)
  163. {
  164.  
  165. var record = item.As<ProductPart>().Record;
  166. var oldRewards = _productToLeavesRepository.Fetch(
  167. r => r.ProductPartRecord == record);
  168. var lookupNew = Leaves
  169. .Where(e => e.IsChecked)
  170. .Select(e => e.ProductLeaf)
  171. .ToDictionary(r => r, r => false);
  172. // Delete the rewards that are no longer there
  173. // and mark the ones that should stay
  174. foreach (var productToLeavesRecord in oldRewards)
  175. {
  176. if (lookupNew.ContainsKey(
  177. productToLeavesRecord.ProductLeavesRecord))
  178. {
  179.  
  180. lookupNew[productToLeavesRecord.ProductLeavesRecord]
  181. = true;
  182. }
  183. else
  184. {
  185. _productToLeavesRepository.Delete(productToLeavesRecord);
  186. }
  187. }
  188. // Add the new rewards
  189. foreach (var leaf in lookupNew.Where(kvp => !kvp.Value)
  190. .Select(kvp => kvp.Key))
  191. {
  192. _productToLeavesRepository.Create(new ProductToLeavesRecord
  193. {
  194. ProductPartRecord = record,
  195. ProductLeavesRecord = leaf
  196. });
  197. }
  198. }
  199.  
  200. public IEnumerable<ProductLeavesRecord> GetLeaves()
  201. {
  202. return _productLeavesRepository.Table.ToList();
  203. }
  204. }
  205. }
  206.  
  207. using System;
  208. using System.Collections.Generic;
  209. using System.Linq;
  210. using System.Web;
  211. using Orchard.Data;
  212. using Orchard.ContentManagement.Handlers;
  213. using SuccessCenter.Models;
  214.  
  215. namespace SuccessCenter.Handlers
  216. {
  217. public class ProductHandler : ContentHandler
  218. {
  219. public ProductHandler(IRepository<ProductPartRecord> repository) {
  220. Filters.Add(StorageFilter.For(repository));
  221. }
  222. }
  223. }
  224.  
  225. using System.Collections.Generic;
  226.  
  227. namespace SuccessCenter.ViewModels
  228. {
  229. public class EditLeavesViewModel<T>
  230. {
  231. public IList<T> Leaves { get; set; }
  232. public string ProductsContent { get; set; }
  233. public string Title { get; set; }
  234.  
  235. }
  236. }
  237.  
  238.  
  239.  
  240.  
  241. using System;
  242. using System.Collections.Generic;
  243. using System.Linq;
  244. using System.Web;
  245. using SuccessCenter.Models;
  246.  
  247. namespace SuccessCenter.ViewModels
  248. {
  249. public class ProductLeafEntry
  250. {
  251. public ProductLeavesRecord ProductLeaf {get;set;}
  252. public bool IsChecked { get; set; }
  253. }
  254. }
  255.  
  256. @model SuccessCenter.ViewModels.EditLeavesViewModel<SuccessCenter.ViewModels.ProductLeafEntry>
  257. <fieldset>
  258. <div class="editor-label">
  259. Products Widget Content
  260. </div>
  261. <div class="editor-field">
  262. @*@Display.Body_Editor(Text: Model.ProductsContent, EditorFlavor: "html", PropertyName: "ProductsContent")*@
  263. @Html.TextBoxFor(model => model.ProductsContent)
  264. @Html.ValidationMessageFor(model => model.ProductsContent)
  265. </div>
  266.  
  267. <br/>
  268. <div class="editor-label">
  269. Leaves
  270. </div>
  271.  
  272. <ul>
  273. @{
  274. var leafIndex = 0;
  275. }
  276. @foreach (var leaf in Model.Leaves)
  277. {
  278. <li>
  279. <input type="hidden" value="@leaf.ProductLeaf.Id"
  280. name="@Html.FieldNameFor(m => m.Leaves[leafIndex].ProductLeaf.Id)" />
  281. <label for="@Html.FieldNameFor(m => m.Leaves[leafIndex].IsChecked)">
  282. <input type="checkbox" value="true"
  283. name="@Html.FieldNameFor(m => m.Leaves[leafIndex].IsChecked)"
  284. id="@Html.FieldNameFor(m => m.Leaves[leafIndex].IsChecked)"
  285. @if (leaf.IsChecked) { <text> checked="checked" </text> } />
  286. @leaf.ProductLeaf.Name
  287. </label>
  288. @{leafIndex++;}
  289. </li>
  290. }
  291. </ul>
  292. </fieldset>
  293.  
  294. public int UpdateFrom8()
  295. {
  296. // Add a page title field to calloutrecord table
  297. SchemaBuilder.AlterTable("CalloutRecord", table => table
  298. .AddColumn<string>("PageTitle", c => c.WithLength(200)));
  299.  
  300. SchemaBuilder.CreateTable("ProductPartRecord",
  301. table => table
  302. .ContentPartRecord()
  303. );
  304.  
  305. SchemaBuilder.AlterTable("ProductPartRecord",
  306. table => table
  307. .AddColumn("ProductsContent", DbType.String, c => c.Nullable().Unlimited()));
  308.  
  309. SchemaBuilder.CreateTable("ProductLeavesRecord", table => table
  310. .ContentPartRecord()
  311. .Column<string>("Name")
  312. .Column<string>("Url")
  313. .Column<string>("AltImage")
  314. .Column<string>("Icon")
  315. .Column<string>("ImageUrl"));
  316.  
  317.  
  318. ContentDefinitionManager.AlterPartDefinition(
  319. typeof(ProductLeavesPart).Name, cfg => cfg.Attachable()
  320. .WithDescription("Product Leaf Content"));
  321.  
  322. ContentDefinitionManager.AlterTypeDefinition("Product Leaf", cfg => cfg
  323. .Creatable()
  324. .Listable()
  325. .Draftable()
  326. .Securable()
  327. .WithPart(typeof(ProductLeavesPart).Name)
  328. .WithPart("CommonPart")
  329. .WithPart("TitlePart"));
  330.  
  331. ContentDefinitionManager.AlterTypeDefinition("Product Leaf Widget", cfg => cfg
  332. .WithPart(typeof(ProductLeavesPart).Name)
  333. .WithPart("WidgetPart")
  334. .WithPart("CommonPart")
  335. .WithSetting("Stereotype", "Widget"));
  336.  
  337.  
  338. SchemaBuilder.CreateTable("ProductToLeavesRecord",
  339. table => table
  340. .Column<int>("Id", column => column.PrimaryKey().Identity())
  341. .Column<int>("ProductPartRecord_Id")
  342. .Column<int>("ProductLeavesRecord_Id")
  343. );
  344.  
  345. ContentDefinitionManager.AlterPartDefinition(typeof(ProductPart).Name,
  346. builder => builder.Attachable()
  347. .WithDescription("Product - Collection of Product Leaves"));
  348.  
  349. ContentDefinitionManager.AlterTypeDefinition("Product", cfg => cfg
  350. .Creatable()
  351. .Listable()
  352. .Draftable()
  353. .Securable()
  354. .WithPart(typeof(ProductPart).Name)
  355. .WithPart("CommonPart")
  356. .WithPart("TitlePart"));
  357.  
  358. ContentDefinitionManager.AlterTypeDefinition("Product Widget", cfg => cfg
  359. .WithPart(typeof(ProductPart).Name)
  360. .WithPart("WidgetPart")
  361. .WithPart("CommonPart")
  362. .WithSetting("Stereotype", "Widget"));
  363.  
  364. return 9;
  365. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement