3

I am trying to fetch the keyword present in the Category using C# TBB to use the output in following DWT TBB.

For that I have a component with the Category field.

I am trying to write the following C# TBB to get the keyword value.

<%@Import NameSpace="Tridion.ContentManager.Templating.Expression" %>        

try
{
    string className = package.GetValue("Component.Fields.title");  
    KeywordField keywordField = package.GetKeywordByTitle(className);

    package.PushItem("Class", package.CreateStringItem(ContentType.Text, keywordField.Value.Key));


}
catch(TemplatingException ex)
{
    log.Debug("Exception is " + ex.Message);
}

But I am getting following compilation error.

Could not compile template because of: error CS0246: The type or namespace name 'KeywordField' could not be found (are you missing a using directive or an assembly reference?) error CS1061: 'Tridion.ContentManager.Templating.Package' does not contain a definition for 'GetKeywordByTitle' and no extension method 'GetKeywordByTitle' accepting a first argument of type 'Tridion.ContentManager.Templating.Package' could be found (are you missing a using directive or an assembly reference?)

Please suggest me how can I achieve it?

Thanks in advance

Jeremy Grand-Scrutton
  • 2,802
  • 14
  • 20
P.Muralikrishna
  • 1,279
  • 9
  • 30

3 Answers3

4

Af Jeremy suggested you should study API, I am providing you example of getting keywords from categories. Hope it may help

Include files

using Tridion.ContentManager;
using Tridion.ContentManager.CommunicationManagement;
using Tridion.ContentManager.Templating.Assembly;
using Tridion.ContentManager.ContentManagement;
using Tridion.ContentManager.ContentManagement.Fields;
using Tridion.ContentManager.Templating;

Sample Code, You can use Key and Value from loop here as per your requirement.

string catID = package.GetByName("CategoryID").GetAsString();
        TcmUri catURI = new TcmUri(int.Parse(catID), ItemType.Category, PubId);
        var theCategory = m_Engine.GetObject(catURI) as Category;
        catKeywords = GetCatKeywords(theCategory);
        string strSelect = "<select>";
        foreach (Keyword k in catKeywords)
        {

        k.Key  // Keyowrd key
        k.Value // KEyword Value

        }

//keyword list  
private IList<Keyword> GetCatKeywords(Category category)
{
    IList<Keyword> keywords;

    if (!Utilities.IsNull(category))
    {
        Filter filter = new Filter();
        filter.BaseColumns = ListBaseColumns.IdAndTitle;
        keywords = category.GetKeywords(filter);

        if (!Utilities.IsNull(keywords))
        {
            return keywords;
        }
    }

    return null;
}
Jeremy Grand-Scrutton
  • 2,802
  • 14
  • 20
vikas kumar
  • 2,444
  • 15
  • 25
3

The error message is absolutely clear what the problem is - there's no reference to the KeywordField class. You need to import the relevant namespace:

<%@Import NameSpace="Tridion.ContentManager.ContentManagement.Fields" %>

Also absolutely clear is the fact that the Package object doesn't have a method called GetKeywordByTitle. There is a GetByName method, but this is for retrieving a named item from the Package, not for getting an object from the respository.

Tridion.ContentManager.ContentManagement.Category does have a GetKeywordByTitle method, but to use this you will have to get the category first, which will likely mean having to know the URI of the category.

Perhaps you need to study the API docs some more?

Jeremy Grand-Scrutton
  • 2,802
  • 14
  • 20
0

"GetKeywordByTitle" is not a method on Package, its a method on Category. Can't you just new-up Keyword?

string selectedKeyword= package.GetValue("Component.Fields.title");
Keyword keyword = new Keyword(selectedKeyword, engine.GetSession());

Cheers

Neil
  • 2,688
  • 1
  • 23
  • 32
  • There's no constructor for Keyword that takes a string as one of the params. Is this string actually a URI? If so you would need to create a TcmUri object using the string, e.g. TcmUri kwUri = new TcmUri(selectedKeyword) – Jeremy Grand-Scrutton Oct 16 '12 at 08:30