mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-21 03:14:10 +08:00
Adding detailed module installation page.
--HG-- branch : dev
This commit is contained in:
@@ -1,15 +1,17 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web.Hosting;
|
||||
using System.Web.Mvc;
|
||||
using System.Web.Routing;
|
||||
using System.Xml.Linq;
|
||||
using NuGet;
|
||||
using Orchard.Environment.Configuration;
|
||||
using Orchard.Environment.Extensions;
|
||||
using Orchard.Environment.Extensions.Models;
|
||||
using Orchard.Environment.Features;
|
||||
using Orchard.Localization;
|
||||
using Orchard.Logging;
|
||||
using Orchard.Packaging.Models;
|
||||
using Orchard.Packaging.Services;
|
||||
using Orchard.Packaging.ViewModels;
|
||||
@@ -19,7 +21,9 @@ using Orchard.UI.Admin;
|
||||
using Orchard.UI.Navigation;
|
||||
using Orchard.UI.Notify;
|
||||
using Orchard.Utility.Extensions;
|
||||
using ILogger = Orchard.Logging.ILogger;
|
||||
using IPackageManager = Orchard.Packaging.Services.IPackageManager;
|
||||
using NullLogger = Orchard.Logging.NullLogger;
|
||||
|
||||
namespace Orchard.Packaging.Controllers {
|
||||
[OrchardFeature("Gallery")]
|
||||
@@ -28,15 +32,18 @@ namespace Orchard.Packaging.Controllers {
|
||||
private readonly ShellSettings _shellSettings;
|
||||
private readonly IPackageManager _packageManager;
|
||||
private readonly IPackagingSourceManager _packagingSourceManager;
|
||||
private readonly IFeatureManager _featureManager;
|
||||
|
||||
public GalleryController(
|
||||
ShellSettings shellSettings,
|
||||
IPackageManager packageManager,
|
||||
IPackagingSourceManager packagingSourceManager,
|
||||
IFeatureManager featureManager,
|
||||
IOrchardServices services) {
|
||||
_shellSettings = shellSettings;
|
||||
_packageManager = packageManager;
|
||||
_packagingSourceManager = packagingSourceManager;
|
||||
_featureManager = featureManager;
|
||||
Services = services;
|
||||
|
||||
T = NullLocalizer.Instance;
|
||||
@@ -211,6 +218,7 @@ namespace Orchard.Packaging.Controllers {
|
||||
// maintain previous route data when generating page links
|
||||
var routeData = new RouteData();
|
||||
routeData.Values.Add("Options.Order", options.Order);
|
||||
routeData.Values.Add("Options.SearchText", options.SearchText);
|
||||
pagerShape.RouteData(routeData);
|
||||
|
||||
return View(packageType == DefaultExtensionTypes.Theme ? "Themes" : "Modules", new PackagingExtensionsViewModel {
|
||||
@@ -226,26 +234,90 @@ namespace Orchard.Packaging.Controllers {
|
||||
if (_shellSettings.Name != ShellSettings.DefaultName || !Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not authorized to add sources")))
|
||||
return new HttpUnauthorizedResult();
|
||||
|
||||
var source = _packagingSourceManager.GetSources().Where(s => s.Id == sourceId).FirstOrDefault();
|
||||
if (source == null) {
|
||||
return HttpNotFound();
|
||||
}
|
||||
|
||||
if (packageId.StartsWith(PackagingSourceManager.GetExtensionPrefix(DefaultExtensionTypes.Theme))) {
|
||||
return InstallPOST(packageId, version, sourceId, redirectTo);
|
||||
}
|
||||
|
||||
IPackageRepository packageRepository = PackageRepositoryFactory.Default.CreateRepository(new PackageSource(source.FeedUrl, "Default"));
|
||||
|
||||
IPackage package = packageRepository.FindPackage(packageId);
|
||||
ExtensionDescriptor extensionDescriptor = _packageManager.GetExtensionDescriptor(package);
|
||||
|
||||
List<PackagingInstallFeatureViewModel> features = extensionDescriptor.Features
|
||||
.Select(featureDescriptor => new PackagingInstallFeatureViewModel {
|
||||
Enable = true, // by default all features are enabled
|
||||
FeatureDescriptor = featureDescriptor
|
||||
}).ToList();
|
||||
|
||||
return View("InstallModule", new PackagingInstallViewModel {
|
||||
Features = features,
|
||||
ExtensionDescriptor = extensionDescriptor
|
||||
});
|
||||
}
|
||||
|
||||
[HttpPost, ActionName("InstallModule")]
|
||||
public ActionResult InstallModulePOST(PackagingInstallViewModel packagingInstallViewModel, string packageId, string version, int sourceId, string redirectTo) {
|
||||
if (_shellSettings.Name != ShellSettings.DefaultName || !Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not authorized to add sources")))
|
||||
return new HttpUnauthorizedResult();
|
||||
|
||||
var source = _packagingSourceManager.GetSources().Where(s => s.Id == sourceId).FirstOrDefault();
|
||||
|
||||
if (source == null) {
|
||||
return HttpNotFound();
|
||||
}
|
||||
|
||||
try {
|
||||
_packageManager.Install(packageId, version, source.FeedUrl, HostingEnvironment.MapPath("~/"));
|
||||
PackageInfo packageInfo = InstallPackage(packageId, version, source);
|
||||
if (packagingInstallViewModel.PackagingInstallMode == PackagingInstallMode.Custom) {
|
||||
// Enable selected features
|
||||
_featureManager.EnableFeatures(packagingInstallViewModel.Features
|
||||
.Select(feature => feature.FeatureDescriptor.Id));
|
||||
} else {
|
||||
IEnumerable<FeatureDescriptor> features = _featureManager.GetAvailableFeatures()
|
||||
.Where(feature => feature.Extension.Id.Equals(packageInfo.ExtensionName) &&
|
||||
feature.Extension.Version.Equals(packageInfo.ExtensionVersion));
|
||||
|
||||
if (packageId.StartsWith(PackagingSourceManager.GetExtensionPrefix(DefaultExtensionTypes.Theme))) {
|
||||
_featureManager.EnableFeatures(features
|
||||
.Select(feature => feature.Id));
|
||||
}
|
||||
|
||||
return RedirectToAction(redirectTo == "Themes" ? "Themes" : "Modules");
|
||||
}
|
||||
|
||||
[HttpPost, ActionName("Install")]
|
||||
public ActionResult InstallPOST(string packageId, string version, int sourceId, string redirectTo) {
|
||||
if (_shellSettings.Name != ShellSettings.DefaultName || !Services.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not authorized to add sources")))
|
||||
return new HttpUnauthorizedResult();
|
||||
|
||||
var source = _packagingSourceManager.GetSources().Where(s => s.Id == sourceId).FirstOrDefault();
|
||||
if (source == null) {
|
||||
return HttpNotFound();
|
||||
}
|
||||
|
||||
InstallPackage(packageId, version, source);
|
||||
|
||||
return RedirectToAction(redirectTo == "Themes" ? "Themes" : "Modules");
|
||||
}
|
||||
|
||||
private PackageInfo InstallPackage(string packageId, string version, PackagingSource source) {
|
||||
PackageInfo packageInfo = null;
|
||||
try {
|
||||
packageInfo = _packageManager.Install(packageId, version, source.FeedUrl, HostingEnvironment.MapPath("~/"));
|
||||
|
||||
if (DefaultExtensionTypes.IsTheme(packageInfo.ExtensionType)) {
|
||||
Services.Notifier.Information(T("The theme has been successfully installed. It can be enabled in the \"Themes\" page accessible from the menu."));
|
||||
}
|
||||
else if (packageId.StartsWith(PackagingSourceManager.GetExtensionPrefix(DefaultExtensionTypes.Module))) {
|
||||
Services.Notifier.Information(T("The module has been successfully installed. Its features can be enabled in the \"Configuration | Features\" page accessible from the menu."));
|
||||
} else if (DefaultExtensionTypes.IsModule(packageInfo.ExtensionType)) {
|
||||
Services.Notifier.Information(T("The module has been successfully installed."));
|
||||
}
|
||||
} catch (Exception exception) {
|
||||
this.Error(exception, T("Package installation failed."), Logger, Services.Notifier);
|
||||
}
|
||||
|
||||
return RedirectToAction(redirectTo == "Themes" ? "Themes" : "Modules");
|
||||
return packageInfo;
|
||||
}
|
||||
}
|
||||
}
|
@@ -3,7 +3,6 @@ using System.Linq;
|
||||
using Orchard.Environment.Extensions;
|
||||
using Orchard.Environment.Extensions.Models;
|
||||
using Orchard.Localization;
|
||||
using Orchard.PackageManager.Events;
|
||||
using Orchard.Packaging.Models;
|
||||
using Orchard.Packaging.Services;
|
||||
|
||||
|
@@ -2,7 +2,7 @@
|
||||
using Orchard.Environment.Extensions.Models;
|
||||
using Orchard.Events;
|
||||
|
||||
namespace Orchard.PackageManager.Events {
|
||||
namespace Orchard.Packaging.Events {
|
||||
public interface IExtensionDisplayEventHandler : IEventHandler {
|
||||
/// <summary>
|
||||
/// Called before an extension is displayed
|
||||
|
@@ -97,6 +97,7 @@
|
||||
<Compile Include="ViewModels\PackagingHarvestViewModel.cs" />
|
||||
<Compile Include="ViewModels\PackagingExtensionsViewModel.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="ViewModels\PackagingInstallViewModel.cs" />
|
||||
<Compile Include="ViewModels\PackagingListViewModel.cs" />
|
||||
<Compile Include="ViewModels\PackagingSourcesViewModel.cs" />
|
||||
</ItemGroup>
|
||||
@@ -160,6 +161,9 @@
|
||||
<ItemGroup>
|
||||
<Content Include="Views\GalleryUpdates\ModulesUpdates.cshtml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Views\Gallery\InstallModule.cshtml" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
|
@@ -1,4 +1,6 @@
|
||||
using System.Collections.Generic;
|
||||
using NuGet;
|
||||
using Orchard.Environment.Extensions.Models;
|
||||
using Orchard.Packaging.Models;
|
||||
|
||||
namespace Orchard.Packaging.Services {
|
||||
@@ -7,5 +9,7 @@ namespace Orchard.Packaging.Services {
|
||||
PackageInfo Install(IPackage package, string location, string applicationPath);
|
||||
PackageInfo Install(string packageId, string version, string location, string applicationPath);
|
||||
void Uninstall(string packageId, string applicationPath);
|
||||
|
||||
ExtensionDescriptor GetExtensionDescriptor(IPackage package);
|
||||
}
|
||||
}
|
@@ -1,8 +1,14 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using NuGet;
|
||||
using Orchard.Environment.Descriptor;
|
||||
using Orchard.Environment.Descriptor.Models;
|
||||
using Orchard.Environment.Extensions;
|
||||
using Orchard.Environment.Extensions.Folders;
|
||||
using Orchard.Environment.Extensions.Models;
|
||||
using Orchard.Environment.Features;
|
||||
using Orchard.Localization;
|
||||
using Orchard.Packaging.Models;
|
||||
|
||||
@@ -67,6 +73,17 @@ namespace Orchard.Packaging.Services {
|
||||
_packageExpander.Uninstall(packageId, applicationPath);
|
||||
}
|
||||
|
||||
public ExtensionDescriptor GetExtensionDescriptor(IPackage package) {
|
||||
IPackageFile packageFile = package.GetFiles().FirstOrDefault(file => Path.GetFileName(file.Path).Equals("module.txt", StringComparison.OrdinalIgnoreCase));
|
||||
if (packageFile != null) {
|
||||
using (StreamReader streamReader = new StreamReader(packageFile.GetStream())) {
|
||||
return ExtensionFolders.GetDescriptorForExtension("", package.Id, DefaultExtensionTypes.Module, streamReader.ReadToEnd());
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
@@ -1,4 +1,10 @@
|
||||
.orchard-packaging #main .contentItems p {
|
||||
.custom_details legend {
|
||||
font-size: small;
|
||||
}
|
||||
.custom_details {
|
||||
padding-left: 30px;
|
||||
}
|
||||
.orchard-packaging #main .contentItems p {
|
||||
margin:0;
|
||||
}
|
||||
.extensionName {
|
||||
|
@@ -0,0 +1,20 @@
|
||||
using System.Collections.Generic;
|
||||
using Orchard.Environment.Extensions.Models;
|
||||
|
||||
namespace Orchard.Packaging.ViewModels {
|
||||
public enum PackagingInstallMode {
|
||||
All,
|
||||
Custom
|
||||
}
|
||||
|
||||
public class PackagingInstallViewModel {
|
||||
public List<PackagingInstallFeatureViewModel> Features { get; set; }
|
||||
public ExtensionDescriptor ExtensionDescriptor { get; set; }
|
||||
public PackagingInstallMode PackagingInstallMode { get; set; }
|
||||
}
|
||||
|
||||
public class PackagingInstallFeatureViewModel {
|
||||
public FeatureDescriptor FeatureDescriptor { get; set; }
|
||||
public bool Enable { get; set; }
|
||||
}
|
||||
}
|
@@ -0,0 +1,44 @@
|
||||
@model Orchard.Packaging.ViewModels.PackagingInstallViewModel
|
||||
@using Orchard.Environment.Extensions.Models;
|
||||
@using Orchard.Packaging.ViewModels;
|
||||
@using System.Linq;
|
||||
|
||||
@{
|
||||
Style.Require("PackagingAdmin");
|
||||
|
||||
Layout.Title = T("{0} - {1} Details", Model.ExtensionDescriptor.Name, Model.ExtensionDescriptor.Version).ToString();
|
||||
}
|
||||
|
||||
@using (Html.BeginFormAntiForgeryPost(Url.Action("InstallModule", "Gallery", new { packageId = Request.QueryString["packageId"], version = Request.QueryString["version"], sourceId = Request.QueryString["sourceId"], redirectTo = Request.QueryString["redirectTo"] }))) {
|
||||
<h3>@T("Which type of installation do you want?").ToString()</h3>
|
||||
|
||||
<fieldset>
|
||||
@Html.RadioButton("PackagingInstallMode", "All", (Model.PackagingInstallMode == PackagingInstallMode.All), new { id = "PackagingInstallMode_All" })
|
||||
<label for="Features_All" class="forcheckbox">@T("Install and enable all features")</label>
|
||||
</fieldset>
|
||||
|
||||
if (Model.Features.Count > 0) {
|
||||
<fieldset>
|
||||
@Html.RadioButton("PackagingInstallMode", "Custom", (Model.PackagingInstallMode == PackagingInstallMode.Custom), new { id = "PackagingInstallMode_Custom" })
|
||||
<label for="Features_Custom" class="forcheckbox">@T("Custom")</label>
|
||||
|
||||
<div class="custom_details">
|
||||
<legend>@T("Pick the features you want enabled during install").ToString()</legend>
|
||||
|
||||
@{ var index = 0; }
|
||||
@foreach (PackagingInstallFeatureViewModel feature in Model.Features) {
|
||||
<div>
|
||||
@Html.HiddenFor(m => m.Features[index].FeatureDescriptor.Id)
|
||||
@Html.HiddenFor(m => m.Features[index].FeatureDescriptor.Name)
|
||||
|
||||
@Html.EditorFor(m => m.Features[index].Enable)
|
||||
<label class="forcheckbox" for="@Html.FieldIdFor(m => m.Features[index].Enable)">@feature.FeatureDescriptor.Name</label>
|
||||
@{ index++; }
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</fieldset>
|
||||
}
|
||||
|
||||
<button class="primaryAction" type="submit">@T("Install")</button>
|
||||
}
|
Reference in New Issue
Block a user