Kentico Document / TreeNode宏命名空​​间

时间:2017-08-15 16:45:13

标签: kentico

creating/registering a custom macro针对TreeNode参数(CurrentDocument)时,可以/应该定位哪个宏命名空间,以便用户在针对TreeNode编写宏表达式时可以访问命名空间的成员对象

documentation提供了StringNamespaceSystemNamespace等示例,应该用于TreeNode个对象的内容?

自定义宏以以下方式注册。它需要TreeNode的参数,理想情况下,它将与网页部件中的{% CurrentDocument.Foobar() %}等中缀表示法一起使用。

[assembly: RegisterExtension(typeof(MacroMethods), typeof(TreeNode))]
public class MacroMethods : MacroMethodContainer
{
    [MacroMethod(typeof(string), "Generates a string.", 1)]
    [MacroMethodParam(0, "CurrentDocument", typeof(TreeNode), "The current rendered document.")]
    public static object Foobar(EvaluationContext context, params object[] parameters)
    {
        // ...
    }

感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:0)

您可能不必将CurrentDocument作为参数传递。您可以使用CMS.DocumentEngine.DocumentContext.CurrentDocument

访问宏中的CurrentDocument

答案 1 :(得分:0)

我担心这是不可能的,因为你需要扩展TreeNode类本身。我也在查看源代码,DocumentContext的注册方式与自定义宏方法/名称空间/属性不同。它没有使用MacroMethodContainer,而是使用AbstractContext,如果没有源代码则无法扩展{% MyCoolMacros.Foobar() %}

然而,即使这是可能的,我强烈建议不要这样做。将自定义代码与Kentico代码混合在一起是违反最佳做法的。我建议做的是创建一个自定义宏命名空间&将所有方法/属性放在那里。

最后,您可以调用所有宏,例如:

>>> from collections import defaultdict
>>> lookup = defaultdict(lambda: 'STRING', int='INTEGER')
>>> lookup['int']
'INTEGER'
>>> lookup['char']
'STRING'
>>> lookup['varchar']
'STRING'