#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 моего модуля, чтобы он запускался, когда я включаю эту функцию.