-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Commit
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -11,6 +11,7 @@ | |
using Orchard.Services; | ||
using System.Web.Mvc; | ||
using System.Web.Routing; | ||
using Orchard.ContentManagement.Handlers; | ||
|
||
namespace Orchard.Core.Common.Drivers { | ||
public class BodyPartDriver : ContentPartDriver<BodyPart> { | ||
|
@@ -75,6 +76,10 @@ protected override void Exporting(BodyPart part, ContentManagement.Handlers.Expo | |
context.Element(part.PartDefinition.Name).SetAttributeValue("Text", part.Text); | ||
} | ||
|
||
protected override void Cloning(BodyPart originalPart, BodyPart clonePart, CloneContentContext context) { | ||
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
TFleury
Author
Contributor
|
||
clonePart.Text = originalPart.Text; | ||
} | ||
|
||
private static BodyEditorViewModel BuildEditorViewModel(BodyPart part,RequestContext requestContext) { | ||
return new BodyEditorViewModel { | ||
BodyPart = part, | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,9 @@ | ||
@using Orchard.ContentManagement | ||
@using Orchard.Core.Contents | ||
@using Orchard.Utility.Extensions | ||
@{ | ||
ContentPart contentPart = Model.ContentPart; | ||
} | ||
@if (Authorizer.Authorize(Permissions.EditContent, contentPart)) { | ||
<a href="@Url.Action("Clone", "Admin", new { Id = Model.ContentItem.Id, ReturnUrl = Request.ToUrlString(), Area = "Contents" })" itemprop="UnsafeUrl">@T("Clone")</a> | ||
<a href="@Url.Action("Clone", "Admin", new { Id = Model.ContentItem.Id, Area = "Contents" })" itemprop="UnsafeUrl">@T("Clone")</a> | ||
@T(" | ") | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,28 +1,29 @@ | ||
using System; | ||
using System.Web.Mvc; | ||
using Orchard.ContentManagement; | ||
using Orchard.ContentManagement.Aspects; | ||
using Orchard.Core.Contents.Settings; | ||
using Orchard.ContentManagement; | ||
using Orchard.Core.Contents; | ||
using Orchard.DisplayManagement; | ||
using Orchard.Localization.Models; | ||
using Orchard.Localization.Services; | ||
using Orchard.Localization.ViewModels; | ||
using Orchard.Mvc; | ||
using Orchard.UI.Notify; | ||
using System; | ||
using System.Web.Mvc; | ||
|
||
namespace Orchard.Localization.Controllers { | ||
namespace Orchard.Localization.Controllers | ||
{ | ||
[ValidateInput(false)] | ||
public class AdminController : Controller, IUpdateModel { | ||
public class AdminController : Controller { | ||
private readonly IContentManager _contentManager; | ||
private readonly ILocalizationService _localizationService; | ||
private readonly ICultureManager _cultureManager; | ||
|
||
public AdminController( | ||
IOrchardServices orchardServices, | ||
IContentManager contentManager, | ||
ILocalizationService localizationService, | ||
ICultureManager cultureManager, | ||
IShapeFactory shapeFactory) { | ||
_contentManager = contentManager; | ||
_localizationService = localizationService; | ||
_cultureManager = cultureManager; | ||
T = NullLocalizer.Instance; | ||
Services = orchardServices; | ||
Shape = shapeFactory; | ||
|
@@ -32,16 +33,20 @@ public AdminController( | |
public Localizer T { get; set; } | ||
public IOrchardServices Services { get; set; } | ||
|
||
[HttpPost] | ||
public ActionResult Translate(int id, string to) { | ||
var masterContentItem = _contentManager.Get(id, VersionOptions.Latest); | ||
if (masterContentItem == null) | ||
return HttpNotFound(); | ||
|
||
if (!Services.Authorizer.Authorize(Permissions.ViewContent, masterContentItem, T("Couldn't open original content"))) | ||
return new HttpUnauthorizedResult(); | ||
|
||
var masterLocalizationPart = masterContentItem.As<LocalizationPart>(); | ||
if (masterLocalizationPart == null) | ||
return HttpNotFound(); | ||
|
||
// Check is current item stll exists, and redirect. | ||
// Check if current item still exists, and redirect. | ||
var existingTranslation = _localizationService.GetLocalizedContentItem(masterContentItem, to); | ||
if (existingTranslation != null) { | ||
var existingTranslationMetadata = _contentManager.GetItemMetadata(existingTranslation); | ||
|
@@ -50,76 +55,24 @@ public ActionResult Translate(int id, string to) { | |
existingTranslationMetadata.EditorRouteValues); | ||
} | ||
|
||
var contentItemTranslation = _contentManager.New<LocalizationPart>(masterContentItem.ContentType); | ||
contentItemTranslation.MasterContentItem = masterContentItem; | ||
|
||
var content = _contentManager.BuildEditor(contentItemTranslation); | ||
|
||
return View(content); | ||
} | ||
|
||
[HttpPost, ActionName("Translate")] | ||
[FormValueRequired("submit.Save")] | ||
public ActionResult TranslatePOST(int id) { | ||
return TranslatePOST(id, contentItem => { | ||
if (!contentItem.Has<IPublishingControlAspect>() && !contentItem.TypeDefinition.Settings.GetModel<ContentTypeSettings>().Draftable) | ||
Services.ContentManager.Publish(contentItem); | ||
}); | ||
} | ||
|
||
[HttpPost, ActionName("Translate")] | ||
[FormValueRequired("submit.Publish")] | ||
public ActionResult TranslateAndPublishPOST(int id) { | ||
return TranslatePOST(id, contentItem => Services.ContentManager.Publish(contentItem)); | ||
} | ||
|
||
public ActionResult TranslatePOST(int id, Action<ContentItem> conditionallyPublish) { | ||
var masterContentItem = _contentManager.Get(id, VersionOptions.Latest); | ||
if (masterContentItem == null) | ||
return HttpNotFound(); | ||
|
||
var masterLocalizationPart = masterContentItem.As<LocalizationPart>(); | ||
if (masterLocalizationPart == null) | ||
return HttpNotFound(); | ||
|
||
var model = new EditLocalizationViewModel(); | ||
TryUpdateModel(model, "Localization"); | ||
|
||
var existingTranslation = _localizationService.GetLocalizedContentItem(masterContentItem, model.SelectedCulture); | ||
if (existingTranslation != null) { | ||
var existingTranslationMetadata = _contentManager.GetItemMetadata(existingTranslation); | ||
return RedirectToAction( | ||
Convert.ToString(existingTranslationMetadata.EditorRouteValues["action"]), | ||
existingTranslationMetadata.EditorRouteValues); | ||
} | ||
|
||
var contentItemTranslation = _contentManager | ||
.Create<LocalizationPart>(masterContentItem.ContentType, VersionOptions.Draft, part => { | ||
part.MasterContentItem = masterContentItem; | ||
}); | ||
// pass a dummy content to the authorization check to check for "own" variations | ||
var dummyContent = _contentManager.New(masterContentItem.ContentType); | ||
|
||
var content = _contentManager.UpdateEditor(contentItemTranslation, this); | ||
var contentItemTranslation = _contentManager.Clone(masterContentItem); | ||
This comment has been minimized.
Sorry, something went wrong.
MatteoPiovanelli
Contributor
|
||
|
||
if (!ModelState.IsValid) { | ||
Services.TransactionManager.Cancel(); | ||
if (!Services.Authorizer.Authorize(Permissions.EditContent, contentItemTranslation, T("Couldn't create translated content"))) | ||
return new HttpUnauthorizedResult(); | ||
|
||
This comment has been minimized.
Sorry, something went wrong.
MatteoPiovanelli
Contributor
|
||
return View(content); | ||
var localizationPart = contentItemTranslation.As<LocalizationPart>(); | ||
if(localizationPart != null) { | ||
localizationPart.MasterContentItem = masterContentItem; | ||
localizationPart.Culture = string.IsNullOrWhiteSpace(to) ? null : _cultureManager.GetCultureByName(to); | ||
} | ||
|
||
conditionallyPublish(contentItemTranslation.ContentItem); | ||
|
||
Services.Notifier.Success(T("Created content item translation.")); | ||
|
||
var metadata = _contentManager.GetItemMetadata(contentItemTranslation); | ||
return RedirectToAction(Convert.ToString(metadata.EditorRouteValues["action"]), metadata.EditorRouteValues); | ||
} | ||
|
||
bool IUpdateModel.TryUpdateModel<TModel>(TModel model, string prefix, string[] includeProperties, string[] excludeProperties) { | ||
return TryUpdateModel(model, prefix, includeProperties, excludeProperties); | ||
} | ||
Services.Notifier.Success(T("Successfully cloned. The translated content was saved as a draft.")); | ||
|
||
void IUpdateModel.AddModelError(string key, LocalizedString errorMessage) { | ||
ModelState.AddModelError(key, errorMessage.ToString()); | ||
var adminRouteValues = _contentManager.GetItemMetadata(contentItemTranslation).AdminRouteValues; | ||
return RedirectToRoute(adminRouteValues); | ||
} | ||
} | ||
} |
Why has the cloning behaviour been implemented in the driver rather than the handler? The handler seems to me to be more extensible.