{"id":230978,"date":"2022-12-24T13:37:00","date_gmt":"2022-12-24T10:37:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230978"},"modified":"2022-12-24T13:41:42","modified_gmt":"2022-12-24T10:41:42","slug":"verktyg-foer-att-skriva-baettre-wordpress-kod-composer","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/verktyg-foer-att-skriva-baettre-wordpress-kod-composer\/","title":{"rendered":"Verktyg f\u00f6r att skriva b\u00e4ttre WordPress-kod: Composer"},"content":{"rendered":"\n<p>\u00c4ven om jag tycker att titeln p\u00e5 den h\u00e4r serien och artiklarna f\u00f6r var och en \u00e4r tillr\u00e4ckligt tydliga, finns det andra saker jag siktar p\u00e5 att g\u00f6ra med den h\u00e4r serien i motsats till de andra serierna jag har skrivit hittills ocks\u00e5.<\/p>\n<p>Specifikt tv\u00e5 av de saker jag f\u00f6rs\u00f6ker g\u00f6ra \u00e4r att tv\u00e5:<\/p>\n<ol>\n<li>h\u00e5lla varje artikel relativt kortfattad (i j\u00e4mf\u00f6relse med hur tidigare artiklar har varit),<\/li>\n<li>fokusera p\u00e5 en sak i taget och h\u00e5ll beskrivningen av den kort.<\/li>\n<\/ol>\n<p>Eftersom det h\u00e4r \u00e4r medlemsinneh\u00e5ll har jag inget emot att det \u00e4r lite l\u00e4ngre \u00e4n vanligt, men jag vill inte heller att det ska vara s\u00e5 l\u00e5ngt att det \u00e4r sv\u00e5rt att f\u00f6lja. Jag vill hellre att det \u00e4r en kort l\u00e4sning med n\u00e5got praktiskt som du kan implementera efter att ha l\u00e4st varje inl\u00e4gg.<\/p>\n<p>Och en av de saker som i h\u00f6g grad hj\u00e4lper till att skriva b\u00e4ttre WordPress-kod \u00e4r Composer.<\/p>\n<h2>B\u00e4ttre WordPress-kod med Composer<\/h2>\n<p>Om du har l\u00e4st den h\u00e4r bloggen hur l\u00e4nge som helst, d\u00e5 vet du att jag \u00e4r ett fan av Composer (dock \u00e4r jag l\u00e5ngt ifr\u00e5n den enda som jobbar i WordPress som \u00e4r det).<\/p>\n<p>Och \u00e4ven om jag har skrivit en del material om det, har jag inte skrivit n\u00e5got med det specifika syftet att f\u00e5 dig att komma ig\u00e5ng med det n\u00e4r du har l\u00e4st en enda kort artikel.<\/p>\n<p>Till den punkten kommer vi att beh\u00f6va g\u00f6ra n\u00e5gra kompromisser: Jag ska n\u00e4mligen tillhandah\u00e5lla ett exempel p\u00e5 en konfigurationsfil tillsammans med ett s\u00e4tt att organisera din plugins katalog. Sedan, i n\u00e4sta inl\u00e4gg, kommer jag att f\u00f6rklara n\u00e5gra av funktionerna i Composer.<\/p>\n<h3>Vad \u00e4r komposit\u00f6r?<\/h3>\n<p>F\u00f6rst \u00e4r det viktigt att f\u00f6rst\u00e5 vad komposit\u00f6r \u00e4r. Och det \u00e4r l\u00e4tt att recitera definitionen som den st\u00e5r p\u00e5 sajten, eller hur? Det \u00e4r en beroendehanterare f\u00f6r PHP.<\/p>\n<h4>Men f\u00f6rst, vad \u00e4r ett beroende?<\/h4>\n<p>F\u00f6r vissa v\u00e4cker det dock n\u00e5gra fr\u00e5gor:<\/p>\n<ul>\n<li>Vad \u00e4r ett beroende?<\/li>\n<li>Varf\u00f6r m\u00e5ste jag hantera dem?<\/li>\n<\/ul>\n<p>Och om du gr\u00e4ver lite djupare kan du uppt\u00e4cka att det \u00e4r en pakethanterare, och detta v\u00e4cker helt enkelt samma fr\u00e5gor f\u00f6rutom att du bara byter ut &quot;beroende&quot; med &quot;paket&quot;, och du \u00e4r tillbaka d\u00e4r du b\u00f6rjade.<\/p>\n<p>S\u00e5 jag ska g\u00f6ra vad jag kan f\u00f6r att g\u00f6ra detta s\u00e5 tydligt som m\u00f6jligt:<\/p>\n<p>Ett beroende, eller ett paket, en mjukvara som din kod anv\u00e4nder. Det kan vara n\u00e5got som det f\u00f6rlitar sig p\u00e5 f\u00f6r funktionalitet under k\u00f6rning, till exempel <a href=\"http:\/\/docs.guzzlephp.org\/en\/stable\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ett s\u00e4tt att g\u00f6ra HTTP-f\u00f6rfr\u00e5gningar<\/a>, eller det kan vara ett bibliotek f\u00f6r att konvertera <a href=\"https:\/\/github.com\/spatie\/array-to-xml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">arrayer till XML<\/a>.<\/p>\n<p>Composer g\u00f6r det enklare att inkludera just dessa paket i ditt bibliotek genom att l\u00e5ta dig:<\/p>\n<ul>\n<li>ladda ner och inkludera paketet i ditt plugin,<\/li>\n<li>laddar din plugin automatiskt under k\u00f6rning,<\/li>\n<li>g\u00f6r det enkelt f\u00f6r din plugin att instansiera eller ringa in plugin efter behov.<\/li>\n<\/ul>\n<p>Det betyder att vi inte beh\u00f6ver beskr\u00e4pa katalogerna i v\u00e5r kodbas med m\u00e5nga manuellt tillagda filer och det betyder att vi inte har anv\u00e4ndning av <strong>include<\/strong> eller <strong>kr\u00e4ver<\/strong> \u00f6verallt.<\/p>\n<p>Dessa kommer att ha sin plats, vilket jag kommer att diskutera i n\u00e4sta inl\u00e4gg, men de beh\u00f6ver inte installeras automatiskt. Ist\u00e4llet kommer Composer att hantera dem. D\u00e4rf\u00f6r \u00e4r beroendehanteraren en del av sitt syfte.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/skriva-baettre-wordpress-kod-introduktion\/\" title=\"Nu n\u00e4r du har det installerat\">Nu n\u00e4r du har det installerat<\/a> har du lite sammanhang.<\/p>\n<h3>Anv\u00e4nder Composer<\/h3>\n<p>Att skriva just det h\u00e4r avsnittet \u00e4r lite sv\u00e5rt eftersom vi alla har olika behov, eller hur? Men \u00e5tminstone kan vi alla dra nytta av en autoloader.<\/p>\n<p>Det \u00e4r n\u00e5got vi alla kan anv\u00e4nda.<\/p>\n<p>S\u00e5 h\u00e4r \u00e4r vad jag ska g\u00f6ra:<\/p>\n<ol>\n<li>Jag kommer att skapa en grundl\u00e4ggande plugin-katalog,<\/li>\n<li>Skapa de n\u00f6dv\u00e4ndiga filerna f\u00f6r att k\u00f6ra plugin,<\/li>\n<li>Konfigurera en enkel Composer-fil,<\/li>\n<li>K\u00f6r det<\/li>\n<\/ol>\n<p>Och sedan l\u00e5ter jag dig se resultatet. Vi kan komma in p\u00e5 tredjepartsbibliotek eller andra funktioner i ett framtida inl\u00e4gg (eller framtida serier, egentligen).<\/p>\n<p>Men om inte annat kommer detta att visa dig hur du g\u00e5r tillv\u00e4ga f\u00f6r att anv\u00e4nda Composer f\u00f6r att definiera en autoloader s\u00e5 att du kan fokusera p\u00e5 att skriva kod och inte p\u00e5 att undra om klasser ing\u00e5r.<\/p>\n<h4>Pluginkatalogen<\/h4>\n<p>Jag strukturerar generellt mina plugins s\u00e5 h\u00e4r:<\/p>\n<ul>\n<li>det finns en bootstrap-fil som l\u00e4ses av WordPress,<\/li>\n<li>det finns en <strong>src-<\/strong> katalog d\u00e4r alla kataloger och PHP-filer f\u00f6rvaras,<\/li>\n<li><strong>det finns en tillg\u00e5ngskatalog<\/strong> p\u00e5 toppniv\u00e5 d\u00e4r bilder, JavaScript-filer och Sass-filer f\u00f6rvaras,<\/li>\n<li>och det finns en <strong>leverant\u00f6rsmapp<\/strong> skapad av Composer f\u00f6r att hysa beroenden och autoloadern.<\/li>\n<\/ul>\n<p>Ibland kan det finnas n\u00e5gon annan udda mapp som en <strong>inc-<\/strong> eller en <strong>lib<\/strong> -mapp, men det \u00e4r mycket oregelbundet vid denna tidpunkt i den typ av arbete jag g\u00f6r. Och p\u00e5 grund av det t\u00e4nker jag inte oroa mig f\u00f6r det h\u00e4r inl\u00e4gget.<\/p>\n<p>Ist\u00e4llet ser min katalog ut ungef\u00e4r s\u00e5 h\u00e4r.<\/p>\n<p>Leverant\u00f6rskatalogen <strong>saknas<\/strong> eftersom jag inte har skapat en Composer-fil som anv\u00e4nds f\u00f6r att k\u00f6ra \u00e4nnu. Men det f\u00e5r vi se innan slutet av inl\u00e4gget.<\/p>\n<h4>Exempelfiler<\/h4>\n<p>L\u00e5t oss installera en exempelfil i plugin-programmet. Och n\u00e4r jag s\u00e4ger prov menar jag ocks\u00e5 enkelt.<\/p>\n<p>Den h\u00e4r filen kommer att ha ett enda syfte: Skriv ut ett meddelande p\u00e5 instrumentpanelen n\u00e4r du loggar in p\u00e5 WordPress.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160226-61e707e186b99.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160226-61e707e186b99.png\" alt=\"Verktyg f\u00f6r att skriva b\u00e4ttre WordPress-kod: Composer\"><\/a><\/p>\n<p>Kom dock ih\u00e5g att syftet med detta inte \u00e4r att visa hur man skriver ett v\u00e4larkitekturerat plugin. Ist\u00e4llet \u00e4r det f\u00f6r att visa hur man genererar en autoloader f\u00f6r att filerna i pluginet genereras automatiskt.<\/p>\n<p>S\u00e5 startbandet f\u00f6r pluginet ser <a href=\"https:\/\/gist.github.com\/tommcfarlin\/94e25b3c6b304d348b8f4a69b03091fd#file-00-sample-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ut s\u00e5 h\u00e4r<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * The plugin bootstrap file\n *\n * This file is read by WordPress to generate the plugin information in the plugin\n * admin area. This file also includes all of the dependencies used by the plugin,\n * registers the activation and deactivation functions, and defines a function\n * that starts the plugin.\n *\n * @since             0.1.0\n * @package           SamplePlugin\n *\n * @wordpress-plugin\n * Plugin Name:       Sample Plugin\n * Description:       A sample plugin used for a blog post.\n * Version:           0.1.0\n * Author:            Tom McFarlin\n * Author URI:        https:\/\/tommcfarlin.com\n * License:           GPL-3.0+\n * License URI:       http:\/\/www.gnu.org\/licenses\/gpl-3.0.txt\n *\/\n\nnamespace SamplePlugin;\n\nuse SamplePluginMessenger;\n\n\/\/ This file called directly.\ndefined('WPINC') || die;\n\n\/\/ Include the autoloader.\nrequire_once __DIR__. '\/vendor\/autoload.php';\n\n\/\/ Start the machine.\n(new Messenger())-&gt;start();\n<\/code><\/pre>\n<p>Och filen som \u00e4r specifikt ansvarig f\u00f6r att visa meddelandet ser <a href=\"https:\/\/gist.github.com\/tommcfarlin\/94e25b3c6b304d348b8f4a69b03091fd#file-01-messenger-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ut s\u00e5 h\u00e4r<\/a> :<\/p>\n<pre><code>&lt;?php\n\nnamespace SamplePlugin;\n\nclass Messenger\n{\n    \/**\n     * Subscribers the `adminNotices` function to the admin_notices hook in WordPress.\n     *\/\n    public function start()\n    {\n        add_action('admin_notices', [$this, 'adminNotices']);\n    }\n\n    \/**\n     * Displays the contents of the `message.html` file into the adminitrative notices\n     * area on the dashboard whenever the plugin is active.\n     *\/\n    public function adminNotices()\n    {\n        if ('dashboard' !== get_current_screen()-&gt;id) {\n            return;\n        }\n\n        include_once dirname(__FILE__). '\/Admin\/Views\/message.html';\n    }\n}\n<\/code><\/pre>\n<p>Och om du \u00e4r nyfiken p\u00e5 HTML-filen \u00e4r <a href=\"https:\/\/gist.github.com\/tommcfarlin\/94e25b3c6b304d348b8f4a69b03091fd#file-02-message-html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">det ocks\u00e5 enkelt<\/a> :<\/p>\n<pre><code>&lt;div class=\"notice notice-success is-dismissible\"&gt;\n    &lt;p&gt;This is a message from the &lt;strong&gt;Sample Plugin&lt;\/strong&gt;&lt;\/p&gt;\n&lt;\/div&gt;\n<\/code><\/pre>\n<p>Jag sa att det var enkelt.<\/p>\n<h4>Composer Configuration File<\/h4>\n<p>Denna speciella fil kan vara s\u00e5 enkel eller s\u00e5 komplicerad som beh\u00f6vs. F\u00f6r det h\u00e4r inl\u00e4gget h\u00e5ller vi det enkelt. M\u00e5let f\u00f6r det h\u00e4r inl\u00e4gget \u00e4r att helt enkelt ge det ett namn, beskrivning, licens, f\u00f6rfattarna och sedan hur man st\u00e4ller in autoloadern.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/94e25b3c6b304d348b8f4a69b03091fd#file-03-composer-json\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Ta en titt h\u00e4r<\/a>, s\u00e5 ska jag f\u00f6rklara vad du ser precis nedanf\u00f6r:<\/p>\n<pre><code>{\n    \"name\": \"tommcfarlin\/sample-plugin\",\n    \"description\": \"A sample plugin used for a blog post.\",\n    \"type\": \"wordpress-plugin\",\n    \"license\": \"GPL-3.0-or-later\",\n    \"authors\": [\n      {\n        \"name\": \"Tom McFarlin\",\n        \"email\": \"tom@tommcfarlin.com\",\n        \"homepage\": \"https:\/\/tommcfarlin.com\"\n      }\n    ],\n      \"autoload\": {\n        \"psr-4\": {\n          \"SamplePlugin\": \"src\/\"\n        }\n      }\n  }<\/code><\/pre>\n<p>F\u00f6r det f\u00f6rsta b\u00f6r namnet, beskrivningen, typen och licensen vara l\u00e4tt nog att f\u00f6lja. F\u00f6rfattaromr\u00e5det \u00e4r ocks\u00e5 rakt fram.<\/p>\n<p>Autoload \u00e4r det omr\u00e5de vi \u00e4r oroliga f\u00f6r just nu. Det borde vara ganska tydligt.<\/p>\n<p>Kort och gott har vi ett direktiv f\u00f6r <strong>PSR4<\/strong> som du kan l\u00e4sa mer om och sedan var ett namnomr\u00e5de finns. S\u00e5 i exemplet ovan finns allt i namnutrymmet <strong>SamplePlugin<\/strong> i <strong>src.\u00a0<\/strong><\/p>\n<p>Detta \u00e4r vad som talar om f\u00f6r autoloadern var den ska leta efter vissa filer. Och i v\u00e5rt fall kommer det bara att leta efter <strong>Messenger<\/strong> -klassen.<\/p>\n<h4>K\u00f6rande komposit\u00f6r<\/h4>\n<p>Nu n\u00e4r vi har t\u00e4ckt grunderna i Composer-konfigurationsfilen \u00e4r det faktiskt dags att k\u00f6ra den. Kom ih\u00e5g att din plugin-katalog b\u00f6r se ut ungef\u00e4r s\u00e5 h\u00e4r:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160226-61e707e55e20b.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160226-61e707e55e20b.png\" alt=\"Verktyg f\u00f6r att skriva b\u00e4ttre WordPress-kod: Composer\"><\/a><\/p>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/94e25b3c6b304d348b8f4a69b03091fd#file-04-run-composer-txt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Ange f\u00f6ljande kommando<\/a> i din terminal :<\/p>\n<p>Och du borde se n\u00e5got s\u00e5nt h\u00e4r:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160226-61e707e92efb9.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160226-61e707e92efb9.png\" alt=\"Verktyg f\u00f6r att skriva b\u00e4ttre WordPress-kod: Composer\"><\/a><\/p>\n<p>F\u00f6rutsatt att allt har g\u00e5tt bra b\u00f6r du kunna logga in p\u00e5 WordPress och aktivera plugin.<\/p>\n<h4>Att se allt tillsammans<\/h4>\n<p>N\u00e4r plugin-programmet \u00e4r aktiverat kan du navigera till instrumentpanelen p\u00e5 din webbplats. D\u00e4r b\u00f6r du se en avvisbar notis som ser ut precis som vi s\u00e5g i b\u00f6rjan av inl\u00e4gget:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160226-61e707e186b99.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160226-61e707e186b99.png\" alt=\"Verktyg f\u00f6r att skriva b\u00e4ttre WordPress-kod: Composer\"><\/a><\/p>\n<p>Om du har kommit s\u00e5 l\u00e5ngt \u00e4r du bra att g\u00e5! Annars dubbelkolla din syntax f\u00f6r att se till att allt \u00e4r bra. Om n\u00e5got \u00e4r fel, \u00e4r det troligt att du inte skulle ha kunnat komma s\u00e5 l\u00e5ngt och f\u00f6rutsatt att du har de grundl\u00e4ggande <a href=\"https:\/\/wordpress.mediadoma.com\/sv\/laesa-och-foerstaa-wordpress-felloggar-del-1\/\" title=\"fels\u00f6kningskonstanterna inst\u00e4llda\">fels\u00f6kningskonstanterna inst\u00e4llda<\/a>, s\u00e5 kommer du sannolikt att se var problemet finns.<\/p>\n<h2>Detta \u00e4r inte allt<\/h2>\n<p>Det finns mycket mer i Composer, och jag rekommenderar starkt att du l\u00e4ser dokumentationen f\u00f6r det. En del av detta kommer jag att t\u00e4cka n\u00e4r jag tittar p\u00e5 de verktyg jag planerar att t\u00e4cka senare i den h\u00e4r serien, men f\u00f6r tillf\u00e4llet rekommenderar jag att bekanta mig med n\u00e5gra av konventionerna.<\/p>\n<p>\u00e5h! Och jag rekommenderar inte att du kontrollerar leverant\u00f6rskatalogen i ditt f\u00f6rr\u00e5d. Det kan bli en enorm katalog senare, och det kan undergr\u00e4va hela syftet med Composer.<\/p>\n<p>I n\u00e4sta inl\u00e4gg ska jag prata om varf\u00f6r. Vissa m\u00e4nniskor g\u00f6r det, och det \u00e4r okej, och jag har gjort det f\u00f6rut, men det \u00e4r viktigt att vara klok p\u00e5 n\u00e4r man g\u00f6r det.<\/p>\n<p>Missa inte att g\u00f6ra det. Och jag ska f\u00f6rklara varf\u00f6r i n\u00e4sta inl\u00e4gg.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En mycket grundl\u00e4ggande introduktion till Composer som f\u00f6rklarar dess syfte och hur du kan anv\u00e4nda den f\u00f6r att dra f\u00f6rdel av autoloading.<\/p>\n","protected":false},"author":1,"featured_media":236343,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[901,724,868],"tags":[1173],"class_list":["post-230978","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-koda","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230978","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=230978"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230978\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/236343"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=230978"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=230978"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=230978"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}