0

如果您自定义自动路由部分,您可以选择在每次保存时重新创建 url。

此选项下的帮助文本说:

“编辑内容时自动重新生成此选项将导致在您编辑现有内容并再次发布时自动重新生成Url,否则将始终保留旧路由,或者您必须在Autoroute admin中执行批量更新。”

我已经四处挖掘,但在任何地方都找不到“自动路由管理员”。

它真的存在吗?

这是一个从未实现过的提议功能?

即使没有管理页面也可以进行批量更新吗?

谢谢

在@joshb 建议后编辑...

我试图在我的控制器中实现批量操作。

  var MyContents = _contentManager.Query<MyContentPart, MyContentPartRecord>().List().ToList();

  foreach (var MyContent in MyContents) {
        var autoroutePart = recipe.ContentItem.As<AutoroutePart>();
        autoroutePart.UseCustomPattern = false;
        autoroutePart.DisplayAlias = _autorouteService.GenerateAlias(autoroutePart);
        _contentManager.Publish(autoroutePart.ContentItem);
  }

通过这种方式,它为包含给定部分 MyContentPart 的类型重新创建所有别名。通过更多工作,此代码可以封装在命令中或 Alias UI 中的新选项卡中。完成我正在做的当前项目后,我会尝试...

4

3 回答 3

0

在模块部分启用别名 UI 将为您提供用于管理路由的管理部分,但我不确定它提供什么样的批量更新

于 2014-07-29T13:32:31.973 回答
0

您可以创建一个模块并实现一个执行批量更新的命令。如果您愿意创建模块,则不应该做太多工作。您需要实现 DefaultOrchardCommandHandler 并注入 IContentManager 以获取您感兴趣的所有部分。

于 2014-07-30T18:00:37.163 回答
0

如果 ContentItem 已经发布(就像我的情况一样),发布 ContentItem 将无济于事。

相反,可以调用 AutorouteService 上的 PublishAlias 方法。我最终得到了一个控制器,如下所示:

using Orchard;
using Orchard.Autoroute.Models;
using Orchard.Autoroute.Services;
using Orchard.ContentManagement;
using Orchard.Localization;
using Orchard.Security;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;

namespace MyNamespace.MyModule.Controllers {

    public class AutorouteBulkUpdateController : Controller {

        private readonly IOrchardServices _orchardServices;
        private readonly IAutorouteService _autorouteService;
        private Localizer T { get; set; }

        public AutorouteBulkUpdateController(IOrchardServices orchardServices, IAutorouteService autorouteService) {
            _orchardServices = orchardServices;
            _autorouteService = autorouteService;
            T = NullLocalizer.Instance;
        }

        public ActionResult Index() {

            if (!_orchardServices.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not authorized to manage settings"))) {
                return new HttpUnauthorizedResult();
            }

            int count = 0;
            IEnumerable<AutoroutePart> contents;

            do {
                //contents = _orchardServices.ContentManager.Query<AutoroutePart>(VersionOptions.Latest, new string[] { "Page" }).Slice(count * 100, 100).ToList();
                contents = _orchardServices.ContentManager.Query<AutoroutePart>(VersionOptions.Latest).Slice(count * 100, 100).ToList();

                foreach (var autoroutePart in contents) {

                    var alias = _autorouteService.GenerateAlias(autoroutePart);

                    if (autoroutePart.DisplayAlias != alias) {
                        autoroutePart.UseCustomPattern = false;
                        autoroutePart.DisplayAlias = alias;
                        _autorouteService.PublishAlias(autoroutePart);
                    }
                }

                _orchardServices.TransactionManager.RequireNew();
                _orchardServices.ContentManager.Clear();

                count += 1;

            } while (contents.Any());

            return null;
        }
    }
}
于 2014-11-09T16:32:15.167 回答