Миграции и таксономии CMS Orchard

#asp.net-mvc #orchardcms #orchardcms-1.7

#asp.net-mvc #orchardcms #orchardcms-1.7

Вопрос:

Я создаю новую часть, к которой необходимо прикрепить таксономию.

Легко присоединить поле таксономии при миграции:

 ContentDefinitionManager.AlterPartDefinition("RecipePart", part => part
    .WithField("Categoria", cfg => cfg
        .OfType("TaxonomyField")
        .WithSetting("TaxonomyFieldSettings.AllowCustomTerms", "false")
        .WithSetting("TaxonomyFieldSettings.SingleChoice", "false")
        .WithSetting("TaxonomyFieldSettings.LeavesOnly", "true")
        .WithSetting("TaxonomyFieldSettings.Required", "true")
        .WithSetting("TaxonomyFieldSettings.Taxonomy", "Ricette Categorie"))
    .WithDescription("Categorie ricette."));
  

Но… Мне нужно вручную создать таксономию и связанные с ней термины.

Возможно ли проверить, существует ли таксономия (например, «Категория Ricette» в данном примере) и, если не найдена, добавить таксономию с некоторыми терминами по умолчанию, чтобы часть была готова к использованию без ручного вмешательства? Спасибо

Ответ №1:

Вы ищете что-то подобное?

 var itemTypeTaxonomy = _taxonomyService.GetTaxonomyByName("ItemType");
if (itemTypeTaxonomy == null)
{
    itemTypeTaxonomy = _orchardServices.ContentManager.New("Taxonomy").As<TaxonomyPart>();
    itemTypeTaxonomy.Name = "ItemType";
    itemTypeTaxonomy.ContentItem.As<TitlePart>().Title = "ItemType";
    _taxonomyService.CreateTermContentType(itemTypeTaxonomy);
    _orchardServices.ContentManager.Create(itemTypeTaxonomy);
    _orchardServices.ContentManager.Publish(itemTypeTaxonomy.ContentItem);
}

ContentDefinitionManager.AlterPartDefinition("StandardItemPart", cfg => cfg
    .WithField("Description", field => field.OfType("HtmlField"))
    .WithField("Thumbnail", field => field.OfType("MediaPickerField"))
    .WithField("Length", field => field.OfType("TextField"))
    .WithField("Type", field => field.OfType("TaxonomyField").WithSetting("FieldIndexing.Included", "True")
                                                               .WithSetting("TaxonomyFieldSettings.TaxonomyId", itemTypeTaxonomy.Id.ToString())
                                                               .WithSetting("TaxonomyFieldSettings.LeavesOnly", "True")
                                                               .WithSetting("TaxonomyFieldSettings.SingleChoice", "True")));
  

Это для старого модуля taxonomies, когда RoutePart еще существовал, который теперь заменен AutoroutePart, но идея есть

Ответ №2:

Спасибо Hazza, что указал мне правильное направление…

В итоге я добрался до этого кода, который создает таксономию и добавляет термины, если они не существуют:

     private void CreateTaxonomy(string taxonomyName, string[] terms)
    {
        var taxonomy = _taxonomyService.GetTaxonomyByName(taxonomyName);

        if (taxonomy == null)
        {
            taxonomy = _orchardServices.ContentManager.New("Taxonomy").As<TaxonomyPart>();
            taxonomy.Name = taxonomyName;
            taxonomy.ContentItem.As<TitlePart>().Title = taxonomyName;
            _taxonomyService.CreateTermContentType(taxonomy);
            _orchardServices.ContentManager.Create(taxonomy);
            _orchardServices.ContentManager.Publish(taxonomy.ContentItem);
        }

        foreach (var term in terms)
        {
            GetOrCreateTerm(taxonomy.Id, term);
        }
    }
  

GetOrCreateTerm — это частный метод, который я создал после исходного в Orchard Source (TaxonomyFieldDriver.cs).

Ответ №3:

Ниже приведен код для создания таксономии и терминов

 public void Enabled(Feature feature) {
    if (_taxonomyService.GetTaxonomyByName("Genre") == null) {


        var tax = _contentManager.New<TaxonomyPart>("Taxonomy");
        tax.Name = "Genre";
        _contentManager.Create(tax, VersionOptions.Published);

        CreateTerm(tax, "Action");
        CreateTerm(tax, "Comedy");
        CreateTerm(tax, "Drama");
        CreateTerm(tax, "Panaorama");
        CreateTerm(tax, "Shikorama");
    }

}

private void CreateTerm(TaxonomyPart tax, string termName) {
    var term = _taxonomyService.NewTerm(tax);
    term.Name = termName;
    _contentManager.Create(term, VersionOptions.Published);
}
  

Я добавил этот код в класс FeatureEventHandler моего модуля, чтобы он запускался, когда я включаю эту функцию.