{"id":768,"date":"2010-07-06T19:04:45","date_gmt":"2010-07-06T23:04:45","guid":{"rendered":"https:\/\/clarionsharp.com\/blog\/?p=768"},"modified":"2010-07-06T19:04:45","modified_gmt":"2010-07-06T23:04:45","slug":"clarion-t4-template-walk-through","status":"publish","type":"post","link":"https:\/\/clarionsharp.com\/blog\/clarion-t4-template-walk-through\/","title":{"rendered":"Clarion T4 template walk-through"},"content":{"rendered":"<p>T4 templates have a simple ASP.NET-like syntax and consist of processing directives, text blocks and code blocks.  For this discussion we&#8217;re using the attached DCTTreeWizard.tt file which is a Utility template. <a href=\"http:\/\/www.clarionsharp.com\/files\/DCTTreeWizard.zip\">Download it from here<\/a><\/p>\n<p>We have two types of Utility Templates; DCT Utility Templates and ApplicationUtility Templates. Within the IDE when the &#8220;Document&#8221; tab that has focus is a .DCT or an .APPX the &#8220;Run Utility Template&#8221; menu item under the File menu is enabled, and depending on the type of the active document, the &#8220;Run Utility Template&#8221; Menu item will show a Selection Dialog displaying the appropriate Utility Templates for the document (DCT Utility Templates or Application Utility Templates) The big difference between a standard template and a Utility Template, is that the when the Utility Template is executed, the code will not output any text\/code automatically. The template developer must define the output using the built-in Open\/Close or Create\/Close methods.<\/p>\n<p>The DCT Utility template focuses on the DataDictionary object. The DataDictionary object is of type IDataDictionary, and using the IDE&#8217;s code completion we can learn how to use it; seeing its properties and methods with the complete descriptions. The DataDictionary object is very straight forward and easy to undertand. For example, it&#8217;s likely pretty clear that &#8220;this.DataDictionary.Tables&#8221; returns all the tables defined in the Dictionary.<\/p>\n<p>The Application Utility template also has the DataDictionary object, but it has another object called &#8220;Application&#8221;. And of course you can query &#8220;this.Application.Procedures&#8221;, and guess what that returns? Yes you guessed it, all the procedures defined in that .APPX file.<\/p>\n<p>Let&#8217;s do a walk-through of our simple DCT Utility template.<\/p>\n<p>We&#8217;ll start with a look at Directives. The syntax of a directive is:<\/p>\n<p><span style=\"color: #993300;\"><span style=\"color: #ff6600;\">&lt;#@<\/span> DirectiveName [ParameterName = &#8220;ParameterValue&#8221;] <span style=\"color: #ff6600;\">#&gt;<\/span><\/span><\/p>\n<p>for an example look at line 1 from the attached template:<\/p>\n<p><span style=\"color: #993300;\"><span style=\"color: #ff6600;\">&lt;#@<\/span> template language=&#8221;C#&#8221; debug=&#8221;true&#8221; type=&#8221;Utility&#8221; name = &#8220;DCTTreeWizard&#8221; chain=&#8221;Clarion.File&#8221;<span style=\"color: #ff6600;\">#&gt;<\/span><\/span><\/p>\n<p>The &#8220;<strong>language<\/strong>&#8221; parameter specifies which language is used in the code blocks of the template, and in this case we specify C#.<\/p>\n<p>The &#8220;<strong>debug<\/strong>&#8221; paramater allows you to debug templates. When that parameter is on, and the corresponding IDE option is also on, the template source code files are copied to the %root%..Templatesdotnet folder. And when there is an error in compiling the template (compilation occurs when you register the template), the error is displayed in the Error pad, and you can then double-click on the error and the .TT file with the error is opened for editing at the line with the error.<\/p>\n<p>The &#8220;<strong>type<\/strong>&#8221; parameter specifies the type of template, current possible types are:<br \/>\nApplication,<br \/>\nProcedure,<br \/>\nApplicationExtension,<br \/>\nProcedureExtension,<br \/>\nUtility,<br \/>\nUtilityApplication,<br \/>\nWizardApplication,<br \/>\nWizardProcedure<\/p>\n<p>The &#8220;<strong>name<\/strong>&#8221; parameter assigns a name to this template, and finally the &#8220;<strong>chain<\/strong>&#8221; parameter specifies the template family.<\/p>\n<p>Lines 2-6 use the &#8220;<strong>assembly<\/strong>&#8221; directive:<br \/>\n<span style=\"color: #993300;\"><span style=\"color: #ff6600;\">&lt;#@<\/span> assembly name=&#8221;mscorlib.dll&#8221; <span style=\"color: #ff6600;\">#&gt;<\/span><br \/>\n<span style=\"color: #ff6600;\">&lt;#@<\/span> assembly name=&#8221;System.dll&#8221; <span style=\"color: #ff6600;\">#&gt;<\/span><br \/>\n<span style=\"color: #ff6600;\">&lt;#@<\/span> assembly name=&#8221;System.Drawing.dll&#8221; <span style=\"color: #ff6600;\">#&gt;<\/span><br \/>\n<span style=\"color: #ff6600;\">&lt;#@ <\/span>assembly name=&#8221;System.Design.dll&#8221; <span style=\"color: #ff6600;\">#&gt;<\/span><br \/>\n<span style=\"color: #ff6600;\">&lt;#@<\/span> assembly name=&#8221;System.Drawing.Design.dll&#8221; <span style=\"color: #ff6600;\">#&gt;<\/span><\/span><\/p>\n<p>The &#8220;<strong>assembly<\/strong>&#8221; directive identifies an assembly to be referenced by the template so that you can use types within that assembly from within the code in your template. Using the assembly directive is equivalent to using the Add Reference feature in the Clarion# IDE. The &#8220;assembly&#8221; directive does not affect the source code of the compiled template.<\/p>\n<p>Lines 7-12 use the &#8220;<strong>import<\/strong>&#8221; directive.<br \/>\n<span style=\"color: #993300;\"><span style=\"color: #ff6600;\">&lt;#@<\/span> import namespace=&#8221;System.Collections.Generic&#8221; <span style=\"color: #ff6600;\">#&gt;<\/span><br \/>\n<span style=\"color: #ff6600;\">&lt;#@<\/span> import namespace=&#8221;System&#8221; <span style=\"color: #ff6600;\">#&gt;<\/span><br \/>\n<span style=\"color: #ff6600;\">&lt;#@<\/span> import namespace=&#8221;SoftVelocity.TextTemplating&#8221; <span style=\"color: #ff6600;\">#&gt;<\/span><br \/>\n<span style=\"color: #ff6600;\">&lt;#@<\/span> import namespace=&#8221;System.Drawing&#8221; <span style=\"color: #ff6600;\">#&gt;<\/span><br \/>\n<span style=\"color: #ff6600;\">&lt;#@<\/span> import namespace=&#8221;System.Drawing.Design&#8221; <span style=\"color: #ff6600;\">#&gt;<\/span><br \/>\n<span style=\"color: #ff6600;\">&lt;#@ <\/span>import namespace=&#8221;SoftVelocity.DataDictionary.Design&#8221; <span style=\"color: #ff6600;\">#&gt;<\/span><\/span><\/p>\n<p>The import directive allows you to refer to types within a text template without providing a fully qualified name. The &#8220;namespace&#8221; parameter is transformed into a .Net &#8220;using&#8221; directive in the compiled template.<\/p>\n<p>Now look at line 13:<br \/>\n<span style=\"color: #993300;\"> <span style=\"color: #ff6600;\">&lt;#@<\/span> property processor=&#8221;PropertyProcessor&#8221; name=&#8221;OutputFile&#8221; type=&#8221;System.String&#8221; defaultValue=&#8221;none&#8221; editor=&#8221;System.Windows.Forms.Design.FileNameEditor&#8221;<span style=\"color: #ff6600;\">#&gt; <\/span><\/span><\/p>\n<p>The &#8220;property&#8221; directive defines an editable property of the template. It corresponds to #PROMPT in our Win32 template language. The parameters are probably self-explanatory; &#8220;<strong>name<\/strong>&#8221; is the name that is displayed in the property grid, &#8220;<strong>type<\/strong>&#8221; defines what type of value is accepted, &#8220;<strong>defaultValue<\/strong>&#8221; is exactly as the name suggests, and &#8220;<strong>editor<\/strong>&#8221; is the object that is used to visually edit the property. The &#8220;editor&#8221; can be just the default; a simple text string, but it can also be a dialog window, a dropList, a checkbox, or by default a simple textBox.<\/p>\n<p>Line 14 is interesting: <span style=\"color: #993300;\"><span style=\"color: #ff6600;\">&lt;#+<\/span> string _OutputFile = &#8220;&#8221;;<span style=\"color: #ff6600;\">#&gt;<\/span><\/span><\/p>\n<p>the <span style=\"color: #ff6600;\">&lt;#+<\/span> tag indicates a template<em> helper block<\/em>. The helper block allows the template developer to add code at the TextTransformation Class level. The code added can be a Method, a Field, or a Property declaration.<\/p>\n<p>If a Method is declared within the helper block, it can be compared to a #GROUP from our Win32 template language. Embeds can also be declared inside a helper block.<\/p>\n<p>for example:<\/p>\n<p><span style=\"color: #993300;\"><span style=\"color: #ff6600;\">&lt;#+<\/span> void MyPseudoGroup() {<span style=\"color: #ff6600;\">#&gt;<\/span> <span style=\"color: #ff6600;\">&lt;#%<\/span> MyEmbed <span style=\"color: #ff6600;\">#&gt;<\/span> <span style=\"color: #ff6600;\">&lt;#+<\/span>}<span style=\"color: #ff6600;\">#&gt;<\/span><\/span><\/p>\n<p>In this case when the method MyPseudoGroup is called, the content of the MyEmbed will be also executed.<\/p>\n<p><span style=\"color: #993300;\">Line 15: <span style=\"color: #ff6600;\">&lt;# <\/span>this._OutputFile = this.OutputFile;<span style=\"color: #ff6600;\">#&gt;<\/span><\/span><\/p>\n<p>just the value set in the &#8220;OutputFile&#8221; within the property directive to the internal _OutputFile variable.<\/p>\n<p>Line 16: <span style=\"color: #993300;\"><span style=\"color: #ff6600;\">&lt;#<\/span> Create(this._OutputFile);<span style=\"color: #ff6600;\">#&gt;<\/span><\/span><\/p>\n<p>calls an internal method that creates a file on disk to receive the generated text (code or other text). It corresponds to our Win32 counterpart #CREATE.<\/p>\n<p>Line 17:<br \/>\n<span style=\"color: #993300;\"> *************************<\/span><\/p>\n<p>is a <em>text block<\/em>, as there are no template directives surrounding it. Text blocks are copied to the output \u201cas is\u201d, with no further processing.<\/p>\n<p>Line 18: &#8211; <span style=\"color: #993300;\">Listing for Dictionary: <span style=\"color: #ff6600;\">&lt;#<\/span>= this.DataDictionary.FileName <span style=\"color: #ff6600;\">#&gt;<\/span><\/span><\/p>\n<p>mixes a text block:  &#8216;<span style=\"color: #993300;\">&#8211; Listing for Dictionary: <\/span>&#8216; with an expression block:<br \/>\n<span style=\"color: #993300;\"> <span style=\"color: #ff6600;\">&lt;#=<\/span> this.DataDictionary.FileName <span style=\"color: #ff6600;\">#&gt;<\/span><\/span><\/p>\n<p>You use expression blocks in text templates to add strings to the generated text output. In this case we&#8217;re asking for the name of the Dictionary that we&#8217;re processing. Expression blocks are delineated by using the &lt;#= template tag. The syntax is: <span style=\"color: #993300;\"><span style=\"color: #ff6600;\">&lt;#=<\/span> ExpressionCode<span style=\"color: #ff6600;\"> #&gt;<\/span><\/span><\/p>\n<p>Lines 19-49 use code blocks. The syntax for a code block is: <span style=\"color: #993300;\">&lt;# Code block #&gt; <\/span><\/p>\n<p>Code blocks can generate template output. In our template the code block uses a few nested foreach loops to walk the dictionary. We&#8217;re using a mix of text blocks and expression blocks to write the details of the dictionary to the output file. Code blocks can use any available .NET APIs.  In this template we&#8217;re using the DataDictionary API to output the Dictionaries collections and properties; Tables, Columns, Keys and Relationships.<\/p>\n<p>I hope this walk-through has provided a good introduction to the new template syntax used in AppGen.Net.\u00a0 For those who are thinking of writing some T4 templates the attached example is a good starting point to get familiar with the essentials. Next time we&#8217;ll go a bit deeper into the template syntax.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>T4 templates have a simple ASP.NET-like syntax and consist of processing directives, text blocks and code blocks. For this discussion we&#8217;re using the attached DCTTreeWizard.tt file which is a Utility template. Download it from here We have two types of Utility Templates; DCT Utility Templates and ApplicationUtility Templates. Within the IDE when the &#8220;Document&#8221; tab &hellip; <a href=\"https:\/\/clarionsharp.com\/blog\/clarion-t4-template-walk-through\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Clarion T4 template walk-through<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15,16,5,7],"tags":[],"class_list":["post-768","post","type-post","status-publish","format-standard","hentry","category-appgennet","category-aspnet","category-clarionnews","category-clarionsharp"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Clarion T4 template walk-through - Clarion<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/clarionsharp.com\/blog\/clarion-t4-template-walk-through\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Clarion T4 template walk-through - Clarion\" \/>\n<meta property=\"og:description\" content=\"T4 templates have a simple ASP.NET-like syntax and consist of processing directives, text blocks and code blocks. For this discussion we&#8217;re using the attached DCTTreeWizard.tt file which is a Utility template. Download it from here We have two types of Utility Templates; DCT Utility Templates and ApplicationUtility Templates. Within the IDE when the &#8220;Document&#8221; tab &hellip; Continue reading Clarion T4 template walk-through &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/clarionsharp.com\/blog\/clarion-t4-template-walk-through\/\" \/>\n<meta property=\"og:site_name\" content=\"Clarion\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/softvelocity\/\" \/>\n<meta property=\"article:published_time\" content=\"2010-07-06T23:04:45+00:00\" \/>\n<meta name=\"author\" content=\"rzaunere\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"rzaunere\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/clarion-t4-template-walk-through\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/clarion-t4-template-walk-through\\\/\"},\"author\":{\"name\":\"rzaunere\",\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#\\\/schema\\\/person\\\/b90e860529aea05ad064cf2687697ce3\"},\"headline\":\"Clarion T4 template walk-through\",\"datePublished\":\"2010-07-06T23:04:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/clarion-t4-template-walk-through\\\/\"},\"wordCount\":1150,\"commentCount\":6,\"publisher\":{\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#organization\"},\"articleSection\":[\"AppGen.Net\",\"ASP.NET\",\"Clarion News\",\"Clarion.Net\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/clarion-t4-template-walk-through\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/clarion-t4-template-walk-through\\\/\",\"url\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/clarion-t4-template-walk-through\\\/\",\"name\":\"Clarion T4 template walk-through - Clarion\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#website\"},\"datePublished\":\"2010-07-06T23:04:45+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/clarion-t4-template-walk-through\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/clarion-t4-template-walk-through\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/clarion-t4-template-walk-through\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Clarion T4 template walk-through\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/\",\"name\":\"Clarion\",\"description\":\"Deliver your software on time, every time\",\"publisher\":{\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#organization\",\"name\":\"SoftVelocity\",\"url\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/03\\\/svlogonew57.png\",\"contentUrl\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/03\\\/svlogonew57.png\",\"width\":221,\"height\":57,\"caption\":\"SoftVelocity\"},\"image\":{\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/softvelocity\\\/\",\"https:\\\/\\\/www.youtube.com\\\/user\\\/SoftVelocity\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#\\\/schema\\\/person\\\/b90e860529aea05ad064cf2687697ce3\",\"name\":\"rzaunere\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/91d95e38759c411d27f646b60da7f4769ce91e87b484669af240e51c729b1e7c?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/91d95e38759c411d27f646b60da7f4769ce91e87b484669af240e51c729b1e7c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/91d95e38759c411d27f646b60da7f4769ce91e87b484669af240e51c729b1e7c?s=96&d=mm&r=g\",\"caption\":\"rzaunere\"},\"url\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/author\\\/rzaunere\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Clarion T4 template walk-through - Clarion","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/clarionsharp.com\/blog\/clarion-t4-template-walk-through\/","og_locale":"en_US","og_type":"article","og_title":"Clarion T4 template walk-through - Clarion","og_description":"T4 templates have a simple ASP.NET-like syntax and consist of processing directives, text blocks and code blocks. For this discussion we&#8217;re using the attached DCTTreeWizard.tt file which is a Utility template. Download it from here We have two types of Utility Templates; DCT Utility Templates and ApplicationUtility Templates. Within the IDE when the &#8220;Document&#8221; tab &hellip; Continue reading Clarion T4 template walk-through &rarr;","og_url":"https:\/\/clarionsharp.com\/blog\/clarion-t4-template-walk-through\/","og_site_name":"Clarion","article_publisher":"https:\/\/www.facebook.com\/softvelocity\/","article_published_time":"2010-07-06T23:04:45+00:00","author":"rzaunere","twitter_card":"summary_large_image","twitter_misc":{"Written by":"rzaunere","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/clarionsharp.com\/blog\/clarion-t4-template-walk-through\/#article","isPartOf":{"@id":"https:\/\/clarionsharp.com\/blog\/clarion-t4-template-walk-through\/"},"author":{"name":"rzaunere","@id":"https:\/\/clarionsharp.com\/blog\/#\/schema\/person\/b90e860529aea05ad064cf2687697ce3"},"headline":"Clarion T4 template walk-through","datePublished":"2010-07-06T23:04:45+00:00","mainEntityOfPage":{"@id":"https:\/\/clarionsharp.com\/blog\/clarion-t4-template-walk-through\/"},"wordCount":1150,"commentCount":6,"publisher":{"@id":"https:\/\/clarionsharp.com\/blog\/#organization"},"articleSection":["AppGen.Net","ASP.NET","Clarion News","Clarion.Net"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/clarionsharp.com\/blog\/clarion-t4-template-walk-through\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/clarionsharp.com\/blog\/clarion-t4-template-walk-through\/","url":"https:\/\/clarionsharp.com\/blog\/clarion-t4-template-walk-through\/","name":"Clarion T4 template walk-through - Clarion","isPartOf":{"@id":"https:\/\/clarionsharp.com\/blog\/#website"},"datePublished":"2010-07-06T23:04:45+00:00","breadcrumb":{"@id":"https:\/\/clarionsharp.com\/blog\/clarion-t4-template-walk-through\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/clarionsharp.com\/blog\/clarion-t4-template-walk-through\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/clarionsharp.com\/blog\/clarion-t4-template-walk-through\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/clarionsharp.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Clarion T4 template walk-through"}]},{"@type":"WebSite","@id":"https:\/\/clarionsharp.com\/blog\/#website","url":"https:\/\/clarionsharp.com\/blog\/","name":"Clarion","description":"Deliver your software on time, every time","publisher":{"@id":"https:\/\/clarionsharp.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/clarionsharp.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/clarionsharp.com\/blog\/#organization","name":"SoftVelocity","url":"https:\/\/clarionsharp.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/clarionsharp.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2019\/03\/svlogonew57.png","contentUrl":"https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2019\/03\/svlogonew57.png","width":221,"height":57,"caption":"SoftVelocity"},"image":{"@id":"https:\/\/clarionsharp.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/softvelocity\/","https:\/\/www.youtube.com\/user\/SoftVelocity"]},{"@type":"Person","@id":"https:\/\/clarionsharp.com\/blog\/#\/schema\/person\/b90e860529aea05ad064cf2687697ce3","name":"rzaunere","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/91d95e38759c411d27f646b60da7f4769ce91e87b484669af240e51c729b1e7c?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/91d95e38759c411d27f646b60da7f4769ce91e87b484669af240e51c729b1e7c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/91d95e38759c411d27f646b60da7f4769ce91e87b484669af240e51c729b1e7c?s=96&d=mm&r=g","caption":"rzaunere"},"url":"https:\/\/clarionsharp.com\/blog\/author\/rzaunere\/"}]}},"_links":{"self":[{"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/posts\/768","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/comments?post=768"}],"version-history":[{"count":0,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/posts\/768\/revisions"}],"wp:attachment":[{"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/media?parent=768"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/categories?post=768"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/tags?post=768"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}