+1-888-365-2779
Try Now
More in this section

Forums / Developing with Sitefinity / API to add taxonomies in Custom Fields

API to add taxonomies in Custom Fields

9 posts, 0 answered
  1. Nathalia
    Nathalia avatar
    25 posts
    Registered:
    16 Nov 2011
    16 Nov 2011
    Link to this post
    Hey, I'm trying to figure out how can I add custom fields for taxo to news, events, blogs, or any other type of content using API's..
  2. Boyan Barnev
    Boyan Barnev avatar
    1429 posts
    Registered:
    19 Sep 2016
    21 Nov 2011
    Link to this post
    Hello Nathalia,


    Thank you for using our services. Can you please clarify whether you want to populate the current metafields for Tags and Categories of the content modules through code, or you want to implement different functionality. For operating with any of the Sitefinity modules' s custom fields you can use our extension methods GetValue() and SetValue() (please add a reference to Telerik.Sitefinity.Model in your class). I believe you might also find this article from our documentation useful. Please let us know if the functionality you want to implement differs from what I've described above, or you have any additional questions.


    Regards,
    Boyan Barnev
    the Telerik team
    Do you want to have your say in the Sitefinity development roadmap? Do you want to know when a feature you requested is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
  3. Nathalia
    Nathalia avatar
    25 posts
    Registered:
    16 Nov 2011
    21 Nov 2011
    Link to this post
    I pretend to add new properties of Tags and Categories in the customer fields in the content modules using API's. (Attached image shows where the custom fields are added).
    I can add Tags and Categories using:
             module.Organizer.AddTaxa("categorynews", taxonId);
    if the taxa that are adding the module does not exist in the custom fields this error occurs:
             "The specified property 'categorynews' does not exist on type 'Telerik.Sitefinity.News.Model.NewsItem'." 

    The "categorynews" is a category that I add.


    Thanks!
  4. Boyan Barnev
    Boyan Barnev avatar
    1429 posts
    Registered:
    19 Sep 2016
    23 Nov 2011
    Link to this post
    Hello Nathalia,

    The easiest way to manipulate data stored inside custom fields would be by using the GetValue() and SetValue() extension methods that we mentioned in our previous reply. For instance, please find below a code sample which adds a certain category to all Ecommerce products:
    TaxonomyManager manager = TaxonomyManager.GetManager();
                var pManager = CatalogManager.GetManager();
                var myCategoryId = manager.GetTaxa<HierarchicalTaxon>().Where(t => t.Name == "TT").Single().Id;
                var productList = pManager.GetProducts().ToList();
                foreach (var product in productList)
                {
                    var catlist = product.GetValue<TrackedList<Guid>>("Department");
                    catlist.Add(myCategoryId);
                    product.SetValue("Department", catlist);
                }
                pManager.SaveChanges();


    Greetings,
    Boyan Barnev
    the Telerik team
    Do you want to have your say in the Sitefinity development roadmap? Do you want to know when a feature you requested is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
  5. Nathalia
    Nathalia avatar
    25 posts
    Registered:
    16 Nov 2011
    24 Nov 2011
    Link to this post
    Hi Boyan, thanks for your reply.  

    The sample code provided in previous email assume that "Department" category already exist associated to Products Module so far so good, however If I use same code but for News then I'll received an unhandled exception "The specified property 'Departments' does not exist on type 'Telerik.Sitefinity.News.Model.NewsItem'."... question is:

    How can I associated "Departments" as a valid News Field using API's?

    For now my code can only avoid this issue by skipping this taxonomies values when they belong to a not associated field:

    NewsItem item = manager.CreateNewsItem();
    ...
    if (item.DoesFieldExist('Department")) // if the field exists.
    {                            
         if (!item.Organizer.TaxonExists("Department", valueID))
              item.Organizer.AddTaxa('Department", valueID); //Add taxonomy                                  
    }


    Regards,
    Nathalia
  6. Boyan Barnev
    Boyan Barnev avatar
    1429 posts
    Registered:
    19 Sep 2016
    25 Nov 2011
    Link to this post
    Hi Nathalia,

    Let me elaborate a little bit on the default taxonomies functionality in Sitefinity.

    By default you have two types of classifications - Hierarchical Taxonomy and Flat Taxonomy. Flat taxonomies(as the name suggests) have a flat structure (e.g. they do not support parent-child hierarchy). An example of the Flat taxonomies in Sitefinity is Tags - you have the base Flat Taxonomy Tags, and all tags you've assigned to your content are stored under Tags.
    Categories, on the other side are an example of Hierarchical taxonomy - you can have a Parent Category, and then Child category, which allows you to structure your content hierarchically. Departments is another example of Hierarchical taxonomies, which is specific for content items of type Product (since it makes more sense to group your products in different departments).
     You can create your own classifications as well, besides the default ones, and assign your content items to then, what's important to know is that you need to specify the correct type when working with classifications through code.

    Let's take for example News. If you want to get all the categories that are assigned to a News item, you'll need to get the value of the metafiled Category, and this value will be a list of Category IDs. In the same line of reasoning, you can get all the Departments, to which a product belongs by getting the value of the metafield "Departments". Let's take the code sample we provided in our previous reply and explain it in more details, I believe this might be useful:
    //First get the manager which operates with Taxonomies
    TaxonomyManager manager = TaxonomyManager.GetManager();
    //Get the manager corresponding to the Content type you'll be operating with
    CatalogManagerpManager = CatalogManager.GetManager();
    //Get the ID of a singe instance (HierarchicalTaxon) of type Hierarchicaltaxonomy
    //(This can be Categories, Departments, or any custom HierarchicalTaxonomy)
                var myCategoryId = manager.GetTaxa<HierarchicalTaxon>().Where(t => t.Name == "TT").Single().Id;
    //Get a list of content items of the desired Content type
                var productList = pManager.GetProducts().ToList();
    //For each of the content items in the above constructed list
                foreach (var product in productList)
                {
    //Get all the IDs of the HierarchicalTaxons in the HierarchicalTaxonomy "Departments"
    // which is stored in the "Department metafield of this content item"
                    var catlist = product.GetValue<TrackedList<Guid>>("Department");
    //modify the list as per your requirements
                    catlist.Add(myCategoryId);
    //assign the modified list to the "Department metafield of this content item
    //this is equivalent to adding a new Department to a product through the UI
                    product.SetValue("Department", catlist);
                }
    //Commit the changes
                pManager.SaveChanges();

    in that line of reasoning the same sample can be easily implemented for News items like this:
    TaxonomyManager manager = TaxonomyManager.GetManager();
                NewsManager nManager = NewsManager.GetManager();
                var myCategoryId = manager.GetTaxa<HierarchicalTaxon>().Where(t => t.Name == "MyNewsCategory").Single().Id;
                var newsList = nManager.GetNewsItems().ToList();
                foreach (var newsItem in newsList)
                {
                    var catlist = newsItem.GetValue<TrackedList<Guid>>("Category");
                    catlist.Add(myCategoryId);
                    newsItem.SetValue("Category", catlist);
                }
                nManager.SaveChanges();

    I believe you might find the Taxonomies section from our Documentation very useful in terms of presenting the theoretical base behind classifications in Sitefinity. Please do not hesitate to let us know if you need some further information.

    Regards,
    Boyan Barnev
    the Telerik team
    Do you want to have your say in the Sitefinity development roadmap? Do you want to know when a feature you requested is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
  7. Nathalia
    Nathalia avatar
    25 posts
    Registered:
    16 Nov 2011
    25 Nov 2011
    Link to this post

    Hi Boyan,

    Thanks for your information, perhaps I didn't explain well and I used taxonomies as a bad example.  It's not Taxonomies but "Custom Fields".  Now, I know how add "Custom Fields" throughout Sitefinity Back-End (http://www.sitefinity.com/documentation/user-guide/creating-and-uploading-content/adding-custom-fields-to-content-items/creating-a-new-custom-field.aspx) but how can I do the same process using API's?   Is there any way to do that?

     

    I used taxonomies at the beginning since they could also added as “Custom Fields”.

     

    Thanks again, sorry for confusion and hope I clarify my question.

    Regards,
    Nathalia.

  8. Boyan Barnev
    Boyan Barnev avatar
    1429 posts
    Registered:
    19 Sep 2016
    25 Nov 2011
    Link to this post
    Hello Nathalia,

    I'm glad that we managed to clarify the essence of the question. Creating new custom fields can be easily achieved through code. For instance, here's how you can add a new custom field to an Email Campaigns Subscriber:
    //get an instance of MetadataManager and create a MetaType for Subscriber
    var metaManager = Telerik.Sitefinity.Data.Metadata.MetadataManager.GetManager();
     metaManager.CreateMetaType(typeof(Subscriber));
     metaManager.SaveChanges();
     //create the new MetaField for the MetaType Subscriber, that will persist the "Organization" value
    App.WorkWith().DynamicData().Type(typeof(Subscriber)).Field().CreateNew("Gender", typeof(String)).SaveChanges(true);
    You can later operate with the custom field using the already discussed GetValue() and SetValue() extension methods:
    var newslettersManager = NewslettersManager.GetManager(this.ProviderName);           
    Subscriber subscriber = newslettersManager.GetSubscribers().Where(s => s.Email == email).SingleOrDefault();
                if(subscriber !=null && !String.IsNullOrEmpty(Gender.Text))
                    {
                        subscriber.SetValue("Gender", Gender.Text);
                        newslettersManager.SaveChanges();
                    }


    All the best,
    Boyan Barnev
    the Telerik team
    Do you want to have your say in the Sitefinity development roadmap? Do you want to know when a feature you requested is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
  9. Guillermo Londono
    Guillermo Londono avatar
    4 posts
    Registered:
    24 Aug 2006
    16 Feb 2012
    Link to this post
    I found the solution for the problem:

    var property = Telerik.Sitefinity.Model.DataExtesion.GetValue(ImageModel,"property_name");

    ---------------------------------------------------------------------------------------------------------------------------------

    Hi Boyan

    I'm trying to get a custom field value from a Telerik.Sitefinity.Libraries.Model.Image but I don't see the GetValue and SetValue methods. I'm working with Sitefinity 4.4. Something I'm missing?

    Thanks

9 posts, 0 answered