WebDev https://monkeysatkeyboards.com/index.php/ en Making Drupal GMap Look Pretty https://monkeysatkeyboards.com/index.php/blog/making-drupal-gmap-look-pretty <!-- THEME DEBUG --> <!-- THEME HOOK: 'field' --> <!-- FILE NAME SUGGESTIONS: * field--node--title--blog-entry.html.twig x field--node--title.html.twig * field--node--blog-entry.html.twig * field--title.html.twig * field--string.html.twig * field.html.twig --> <!-- BEGIN OUTPUT from 'core/themes/classy/templates/field/field--node--title.html.twig' --> <span class="field field--name-title field--type-string field--label-hidden">Making Drupal GMap Look Pretty</span> <!-- END OUTPUT from 'core/themes/classy/templates/field/field--node--title.html.twig' --> <!-- THEME DEBUG --> <!-- THEME HOOK: 'field' --> <!-- FILE NAME SUGGESTIONS: * field--node--body--blog-entry.html.twig * field--node--body.html.twig * field--node--blog-entry.html.twig * field--body.html.twig x field--text-with-summary.html.twig * field.html.twig --> <!-- BEGIN OUTPUT from 'core/themes/classy/templates/field/field--text-with-summary.html.twig' --> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Recently we built a website that uses the Location and GMap Drupal modules. Our customer is an artist and we wanted to do something slick that matches the style of her site. GMap module offers some basic styling of the map, but what we really wanted was the type of stylized maps shown on <a href="http://snazzymaps.com/">snazzymaps.com</a>.</p> <p>These maps use some JavaScript code similar to the "JavaScript style array" shown on <a href="http://snazzymaps.com/style/21/hopper">this example</a>, which is the style used in this blog post. Unfortunately the GMap module does not directly support this type of styling at the moment. We will need another way to add this code to a Drupal theme.</p> <h2>Step 1: Modules</h2> <p>Install <a href="https://drupal.org/project/location">Location</a> and <a href="https://drupal.org/project/gmap">GMap</a>, and <a href="https://drupal.org/documentation/modules/location">configure them</a>, along with any of the add-on location modules that enables you to attach locations to the various Drupal features such as users, nodes, or taxonomy. Our client is associating the locations with content, so we are using the "Node Locations" module to attach locations and then "GMap Location" to display the map. The example below assumes this; if your setup is different, you might have to adjust the JavaScript code.</p> <p>Once you have location information attached to a page, visit Drupal's block administration page under Structure -&gt; Blocks and enable the GMap Location block. At this point you should see a working Google map, although with the default styling.</p> <h2>Step 2: JavaScript</h2> <p>Hopefully you are working with a <a href="/quick-guide-drupal-subtheming">subtheme</a> as explained previously. Open your theme's THEMENAME.info file and add a scripts line if you don't already have a place to put custom site JavaScript code:</p> <pre> <code> scripts[] = site.js </code> </pre> <p>Next create the file site.js in the same directory as THEMENAME.info and paste the following code, replacing REPLACE_WITH_STYLE_FROM_SNAZZYMAPS variable definition with a style array copied from SnazzyMaps or other source. The format is a JavaScript array that begins with "[" and ends with "]".</p> <pre> <code> (function ($) { var mapstyle = REPLACE_WITH_STYLE_FROM_SNAZZYMAPS; /** * Apply styles to a Google map. This function waits until the Drupal GMap * module has finished creating the map (when Drupal.gmap.getMap() returns a * map instance instead of undefined variable) before applying the styles. If * necessary, use window.setInterval to wait for map to be ready. * * Please note that this is not the best possible solution for styling maps, * check back with us later for an improved solution to this issue: * http://monkeysatkeyboards.com/making-drupal-gmap-look-pretty * * @param mapid Map identifier. GMap module outputs it as a class on the map * wrapper div, e.g... 'gmap-auto1map-gmap'. This can be a string with a * single ID or an array with multiple IDs. The function only has any * effect if an element is found in the document with a CSS class that * matches this ID exactly. * * @param styles JavaScript styles array e.g.. from http://snazzymaps.com */ function styleMaps(mapid, styles) { var mapids = (mapid instanceof Array) ? mapid : [ mapid ]; for (var i in mapids) { if ($('.' + mapids[i]).length) { var gmap = Drupal.gmap.getMap(mapids[i]); if (typeof(gmap.map) != 'undefined') { gmap.map.setOptions({styles: styles}); } else { var args = { gmap: gmap, styles: styles }; args.iid = window.setInterval(function(args) { if (typeof(args.gmap.map) != 'undefined') { window.clearInterval(args.iid); args.gmap.map.setOptions({styles: args.styles}); } }, 20, args); } } } } Drupal.behaviors.site = { attach: function (context, settings) { var maps = [ 'gmap-auto1map-gmap', // Names used by GMap Location 'gmap-auto2map-gmap', 'gmap-auto3map-gmap' ]; styleMaps(maps, mapstyle); } }; }(jQuery)); </code> </pre> <p>Now flush your cache under Configuration -&gt; Development -&gt; Performance and enjoy your newly styled map!</p> <h2>Disclaimer</h2> <p>Please note that this solution ranks pretty low on the list of solutions presented in my last post, <a href="http://monkeysatkeyboards.com/why-drupal-coders-perspective">Why Drupal? The Coder's Perspective</a>, and I am sure this is not the best way to achieve it. It works for now as a short term solution.</p> <p>I suspect a better solution for this long term is to add support for this kind of style array to the GMap module itself. When I get some free time (Hah!) I will look at making a patch for GMap that would configure the settings in the admin and store them, and pass it through Drupal's regular JavaScript settings array. I'll update this post when a patch is available.</p> <p>Please leave a comment if you have any suggestions on improving the above temporary solution or ideas for integrating these styles with GMap.</p> </div> <!-- END OUTPUT from 'core/themes/classy/templates/field/field--text-with-summary.html.twig' --> <!-- THEME DEBUG --> <!-- THEME HOOK: 'field' --> <!-- FILE NAME SUGGESTIONS: * field--node--uid--blog-entry.html.twig x field--node--uid.html.twig * field--node--blog-entry.html.twig * field--uid.html.twig * field--entity-reference.html.twig * field.html.twig --> <!-- BEGIN OUTPUT from 'core/themes/classy/templates/field/field--node--uid.html.twig' --> <span class="field field--name-uid field--type-entity-reference field--label-hidden"> <!-- THEME DEBUG --> <!-- THEME HOOK: 'username' --> <!-- BEGIN OUTPUT from 'core/themes/classy/templates/user/username.html.twig' --> <a title="View user profile." href="/index.php/users/fletch" lang="" about="/index.php/users/fletch" typeof="schema:Person" property="schema:name" datatype="" class="username">Fletch</a> <!-- END OUTPUT from 'core/themes/classy/templates/user/username.html.twig' --> </span> <!-- END OUTPUT from 'core/themes/classy/templates/field/field--node--uid.html.twig' --> <!-- THEME DEBUG --> <!-- THEME HOOK: 'field' --> <!-- FILE NAME SUGGESTIONS: * field--node--created--blog-entry.html.twig x field--node--created.html.twig * field--node--blog-entry.html.twig * field--created.html.twig * field--created.html.twig * field.html.twig --> <!-- BEGIN OUTPUT from 'core/themes/classy/templates/field/field--node--created.html.twig' --> <span class="field field--name-created field--type-created field--label-hidden">Fri, 12/13/2013 - 13:00</span> <!-- END OUTPUT from 'core/themes/classy/templates/field/field--node--created.html.twig' --> <!-- THEME DEBUG --> <!-- THEME HOOK: 'field' --> <!-- FILE NAME SUGGESTIONS: * field--node--field-tags--blog-entry.html.twig * field--node--field-tags.html.twig * field--node--blog-entry.html.twig * field--field-tags.html.twig * field--entity-reference.html.twig x field.html.twig --> <!-- BEGIN OUTPUT from 'core/themes/classy/templates/field/field.html.twig' --> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field__items"> <div class="field__item"><a href="/index.php/tags/drupal" hreflang="en">Drupal</a></div> <div class="field__item"><a href="/index.php/tags/webdev" hreflang="en">WebDev</a></div> <div class="field__item"><a href="/index.php/tags/google-maps" hreflang="en">Google Maps</a></div> </div> <!-- END OUTPUT from 'core/themes/classy/templates/field/field.html.twig' --> <!-- THEME DEBUG --> <!-- THEME HOOK: 'links__node' --> <!-- FILE NAME SUGGESTIONS: x links--node.html.twig x links--node.html.twig * links.html.twig --> <!-- BEGIN OUTPUT from 'core/themes/classy/templates/content/links--node.html.twig' --> <!-- END OUTPUT from 'core/themes/classy/templates/content/links--node.html.twig' --> Fri, 13 Dec 2013 21:00:03 +0000 Fletch 71 at https://monkeysatkeyboards.com Why Drupal? The Coder's Perspective https://monkeysatkeyboards.com/index.php/blog/why-drupal-coders-perspective <!-- THEME DEBUG --> <!-- THEME HOOK: 'field' --> <!-- FILE NAME SUGGESTIONS: * field--node--title--blog-entry.html.twig x field--node--title.html.twig * field--node--blog-entry.html.twig * field--title.html.twig * field--string.html.twig * field.html.twig --> <!-- BEGIN OUTPUT from 'core/themes/classy/templates/field/field--node--title.html.twig' --> <span class="field field--name-title field--type-string field--label-hidden">Why Drupal? The Coder&#039;s Perspective</span> <!-- END OUTPUT from 'core/themes/classy/templates/field/field--node--title.html.twig' --> <!-- THEME DEBUG --> <!-- THEME HOOK: 'field' --> <!-- FILE NAME SUGGESTIONS: * field--node--body--blog-entry.html.twig * field--node--body.html.twig * field--node--blog-entry.html.twig * field--body.html.twig x field--text-with-summary.html.twig * field.html.twig --> <!-- BEGIN OUTPUT from 'core/themes/classy/templates/field/field--text-with-summary.html.twig' --> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p><img alt="Drupal" class="image-original_float_left" height="160" src="https://monkeysatkeyboards.com/sites/default/files/styles/original_float_left/public/MakDruplicon_2.png?itok=qvmeBQK1" title="Drupal" width="140" />Dries Buytaert, founder of <a href="http://drupal.org">Drupal</a>, recently wrote about how it snaps together like Lego pieces, building something he calls <a href="http://buytaert.net/the-assembled-web">"The Assembled Web"</a>.</p> <blockquote class="left-indented-quote"> <p>Being more efficient in the way we assemble a website will allow us to focus on the things that matter more, like innovation and creativity. By standing on the shoulders of giants, we can make things look and operate more beautifully than we'd ever have expected<em>.</em></p> </blockquote> <p>This got us thinking about why we use Drupal. For us at Monkeys At Keyboards working with it is very close to the experience that Dries suggested. I love working with Drupal and something keeps me coming back to it for every website project. Drupal.org tells me that at the time of this writing I have been making Drupal websites for <a href="https://drupal.org/user/72475">7 years and 4 months</a>.</p> <figure class="image-original_float_right"><img alt="Ewok Village" height="241" src="https://monkeysatkeyboards.com/sites/default/files/styles/original_float_right/public/ewok-village-legos-cropped.jpg?itok=cpqAXwUX" title="Ewok Village" width="150" /><figcaption>Ewok village from <a href="http://www.lego.com/en-us/starwars/products/exclusives/10236">lego.com</a></figcaption></figure><p>What we have learned is that some Drupal modules are flexible and adaptable. For example <a href="https://drupal.org/project/views">Views</a> is easy to customize. My minor nitpick in Dries' otherwise darned fine idea is Drupal theming. Occasionally modules do not perform as expected so we have to change the theming to make it behave exactly how we want.</p> <p>There are times when custom theming work is necessary to fulfill customer requirements or our own desire to reduce clumsiness in the user interface. Drupal modules sometimes are not quite designed with our exact usage in mind.</p> <p>This is similar to the way the <a href="http://www.lego.com/en-us/starwars/products/exclusives/10236">Ewok Village Lego kit</a> has trouble making something other than the exact village that the Lego designers intended.</p> <p>Fortunately, Drupal is not as rigid as Ewok Legos and there are often several workable solutions to the problem of changing how modules interact with people. As a developer, Drupal is a playground filled with equipment for teasing and tweaking the work of other people. This enables us to make it behave how we want it to.</p> <p>This post could go very deep into describing how to use and not abuse the following features, but I have chosen to include a high level list of techniques that we use to glue Drupal modules together into a cohesive whole. The list is our order of preferred techniques when there are multiple options for changing things.</p> <ul><li> The first rule of theming is that if it can be done in CSS, it must be done in CSS. Normally we do this in a <a href="/quick-guide-drupal-subtheming">custom theme</a>, which we discussed in a previous post. Be careful not to break mobile support!</li> <li> Attempt to alter the HTML that Drupal is producing in a theme's template.php file using <a href="http://www.benmarshall.me/drupal-preprocess-process/">preprocessing hooks</a>.</li> <li> Create or modify theme templates to override default behavior.</li> <li> Alter the behavior at the module level.</li> <li> Use <a href="http://jquery.com/">JQuery</a> to rearrange or otherwise alter the DOM client side. Hax! This is a method of last resort, except for intentional uses such as AJAX.</li> <li> Give up and write a custom solution using Drupal hooks, forms, and database features.</li> </ul><p>Luckily, in all but a very few cases, we don't make it to the last item on the list and write miles of custom code. CSS is powerful in modern browsers, so we take maximum advantage of this. Since CSS styling doesn't affect the operations of modules, we can focus on making websites look amazing. Stay tuned for case studies on the custom module solutions we have built.</p> <p><strong>Note: </strong><em>Next week we will hear about Laura the designer and project manager's take on "Why Drupal?"</em></p> </div> <!-- END OUTPUT from 'core/themes/classy/templates/field/field--text-with-summary.html.twig' --> <!-- THEME DEBUG --> <!-- THEME HOOK: 'field' --> <!-- FILE NAME SUGGESTIONS: * field--node--uid--blog-entry.html.twig x field--node--uid.html.twig * field--node--blog-entry.html.twig * field--uid.html.twig * field--entity-reference.html.twig * field.html.twig --> <!-- BEGIN OUTPUT from 'core/themes/classy/templates/field/field--node--uid.html.twig' --> <span class="field field--name-uid field--type-entity-reference field--label-hidden"> <!-- THEME DEBUG --> <!-- THEME HOOK: 'username' --> <!-- BEGIN OUTPUT from 'core/themes/classy/templates/user/username.html.twig' --> <a title="View user profile." href="/users/fletch" lang="" about="/users/fletch" typeof="schema:Person" property="schema:name" datatype="" class="username">Fletch</a> <!-- END OUTPUT from 'core/themes/classy/templates/user/username.html.twig' --> </span> <!-- END OUTPUT from 'core/themes/classy/templates/field/field--node--uid.html.twig' --> <!-- THEME DEBUG --> <!-- THEME HOOK: 'field' --> <!-- FILE NAME SUGGESTIONS: * field--node--created--blog-entry.html.twig x field--node--created.html.twig * field--node--blog-entry.html.twig * field--created.html.twig * field--created.html.twig * field.html.twig --> <!-- BEGIN OUTPUT from 'core/themes/classy/templates/field/field--node--created.html.twig' --> <span class="field field--name-created field--type-created field--label-hidden">Wed, 12/11/2013 - 11:31</span> <!-- END OUTPUT from 'core/themes/classy/templates/field/field--node--created.html.twig' --> <!-- THEME DEBUG --> <!-- THEME HOOK: 'field' --> <!-- FILE NAME SUGGESTIONS: * field--node--field-tags--blog-entry.html.twig * field--node--field-tags.html.twig * field--node--blog-entry.html.twig * field--field-tags.html.twig * field--entity-reference.html.twig x field.html.twig --> <!-- BEGIN OUTPUT from 'core/themes/classy/templates/field/field.html.twig' --> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field__items"> <div class="field__item"><a href="/tags/drupal" hreflang="en">Drupal</a></div> <div class="field__item"><a href="/tags/webdev" hreflang="en">WebDev</a></div> </div> <!-- END OUTPUT from 'core/themes/classy/templates/field/field.html.twig' --> <!-- THEME DEBUG --> <!-- THEME HOOK: 'links__node' --> <!-- FILE NAME SUGGESTIONS: x links--node.html.twig x links--node.html.twig * links.html.twig --> <!-- BEGIN OUTPUT from 'core/themes/classy/templates/content/links--node.html.twig' --> <!-- END OUTPUT from 'core/themes/classy/templates/content/links--node.html.twig' --> Wed, 11 Dec 2013 19:31:45 +0000 Fletch 72 at https://monkeysatkeyboards.com Quick Guide to Drupal Subtheming https://monkeysatkeyboards.com/index.php/blog/quick-guide-drupal-subtheming <!-- THEME DEBUG --> <!-- THEME HOOK: 'field' --> <!-- FILE NAME SUGGESTIONS: * field--node--title--blog-entry.html.twig x field--node--title.html.twig * field--node--blog-entry.html.twig * field--title.html.twig * field--string.html.twig * field.html.twig --> <!-- BEGIN OUTPUT from 'core/themes/classy/templates/field/field--node--title.html.twig' --> <span class="field field--name-title field--type-string field--label-hidden">Quick Guide to Drupal Subtheming</span> <!-- END OUTPUT from 'core/themes/classy/templates/field/field--node--title.html.twig' --> <!-- THEME DEBUG --> <!-- THEME HOOK: 'field' --> <!-- FILE NAME SUGGESTIONS: * field--node--body--blog-entry.html.twig * field--node--body.html.twig * field--node--blog-entry.html.twig * field--body.html.twig x field--text-with-summary.html.twig * field.html.twig --> <!-- BEGIN OUTPUT from 'core/themes/classy/templates/field/field--text-with-summary.html.twig' --> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Drupal offers a fantastic mechanism for creating a new theme that builds on an existing theme. For example, if a Drupal theme does 99% of what you want, but you want to change the CSS or javascript in it, subtheming is a great answer. You can get started very quickly.</p> <p><strong><img alt="Drupal!" class="image-original_float_right" height="172" src="https://monkeysatkeyboards.com/sites/default/files/styles/original_float_right/public/MakDruplicon_0.png?itok=WSqxFdpu" title="Drupal!" width="150" />Why create a subtheme?</strong></p> <p>Let's just back up one second and talk about why you would want to use subtheming. If you're already convinced, then just skip below to the list of steps for creating a subtheme.</p> <p>The site you are looking at right now, <a href="http://monkeysatkeyboards.com">monkeysatkeyboards.com</a>, is a subtheme of <a href="http://drupal.org/project/zen">Zen</a>. 90% of the work in it is CSS and Javascript customizations. So we focus on making the site look good instead of rewriting very similar HTML over and over.</p> <p>When first encountering Drupal's theming system, you may have an urge to take an existing theme and just modify the files directly. While this works, it is not recommended. The primary reason is keeping your code up to date with the latest bug and security fixes. A good secondary reason is tidiness. It is cleaner to keep your customizations separated from existing themes.</p> <p>If you just hack up an existing theme and then an issue is discovered in it and fixed by the original developer, how do you now apply that fix? The answer is that you have to find the exact changes in the original theme and apply them back into your own, a tedious and error prone process.</p> <p>However if you used subtheming, then you can drop in the updated base theme (or really, just use the Drupal automatic update system) and this does not affect your custom code in any way. It keeps things separated and clean and really leverages the work that the original theme author is putting in to the project. For similar reasons you should not modify core or third party Drupal modules, you end up breaking the automatic updates mechanism.</p> <p><strong>To create a subtheme:</strong></p> <ol><li> Find a base theme that you want to extend. If you want a plain theme and plan on overriding most of the functionality yourself, <a href="http://drupal.org/project/zen">Zen</a> or <a href="http://drupal.org/project/omega">Omega</a> are two fantastic base themes that don't have much in them by default, ready to make something highly custom. Otherwise pick a more rich visual theme for a base.</li> <li> Create directory sites/all/themes/mytheme</li> <li> Copy the info file from the base theme to the new theme, example: cp sites/all/themes/zen.info sites/all/themes/mytheme/mytheme.info . It should be named the same as your directory with a .info extension.</li> <li> Copy screenshot.png from the base theme to your theme (or take an actual screenshot and crop it to that size).</li> <li> Edit mytheme.info. Change the name and description and project. "project" should have the same name as your directory and the base filename of the .info file. Add line "base theme = [base theme project name]". The original value of "project" from this info file is what you put for the base theme value.</li> <li> Remove the stylesheets and script lines from mytheme.info, they refer to files in the original theme. Add line "stylesheets[all][] = mytheme.css" and create file mytheme.css .  Leave the list of regions, these are not inherited from the base theme.</li> <li> Make a "templates" directory and an empty file called "template.php".</li> <li> Enable your new theme in Drupal admin under "Appearance".</li> </ol><p><strong>Using your subtheme</strong>:</p> <p>Other theming guides around the web and on <a href="http://drupal.org">drupal.org</a> will tell you to create templates inside the templates subdirectory or put functions into template.php. These files will override their equivelants in the original "base theme" and your "mytheme.css" will be included on every page view that uses your theme.</p> <p>You can also now almost directly "hack" the files of the original theme. For example, copy sites/all/themes/zen/templates/node.tpl.php into sites/all/themes/mytheme/templates and hack that up. Now you are using your own custom node.tpl.php but everything else from Zen.</p> <p>It's a good idea to try to minimize the amount of code copied from the original. For example, if you copy all of the templates and template.php from the original base theme, then you are not really leveraging subtheming at all. We want to take advantage of the HTML structure that the theme author has already put considerable time into. So the goal should be "let the base theme take care of as much as possible, only override when it's absolutely necessary." Much of the customization can be done in your subtheme's CSS file without involving a lot of custom HTML.</p> <p>In a future blog post I will discuss some detailed tips and tricks to help you work with an existing theme, in order to truly leverage the work the the author put in to the base theme.</p> </div> <!-- END OUTPUT from 'core/themes/classy/templates/field/field--text-with-summary.html.twig' --> <!-- THEME DEBUG --> <!-- THEME HOOK: 'field' --> <!-- FILE NAME SUGGESTIONS: * field--node--uid--blog-entry.html.twig x field--node--uid.html.twig * field--node--blog-entry.html.twig * field--uid.html.twig * field--entity-reference.html.twig * field.html.twig --> <!-- BEGIN OUTPUT from 'core/themes/classy/templates/field/field--node--uid.html.twig' --> <span class="field field--name-uid field--type-entity-reference field--label-hidden"> <!-- THEME DEBUG --> <!-- THEME HOOK: 'username' --> <!-- BEGIN OUTPUT from 'core/themes/classy/templates/user/username.html.twig' --> <a title="View user profile." href="/users/fletch" lang="" about="/users/fletch" typeof="schema:Person" property="schema:name" datatype="" class="username">Fletch</a> <!-- END OUTPUT from 'core/themes/classy/templates/user/username.html.twig' --> </span> <!-- END OUTPUT from 'core/themes/classy/templates/field/field--node--uid.html.twig' --> <!-- THEME DEBUG --> <!-- THEME HOOK: 'field' --> <!-- FILE NAME SUGGESTIONS: * field--node--created--blog-entry.html.twig x field--node--created.html.twig * field--node--blog-entry.html.twig * field--created.html.twig * field--created.html.twig * field.html.twig --> <!-- BEGIN OUTPUT from 'core/themes/classy/templates/field/field--node--created.html.twig' --> <span class="field field--name-created field--type-created field--label-hidden">Fri, 02/22/2013 - 00:36</span> <!-- END OUTPUT from 'core/themes/classy/templates/field/field--node--created.html.twig' --> <!-- THEME DEBUG --> <!-- THEME HOOK: 'field' --> <!-- FILE NAME SUGGESTIONS: * field--node--field-tags--blog-entry.html.twig * field--node--field-tags.html.twig * field--node--blog-entry.html.twig * field--field-tags.html.twig * field--entity-reference.html.twig x field.html.twig --> <!-- BEGIN OUTPUT from 'core/themes/classy/templates/field/field.html.twig' --> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field__items"> <div class="field__item"><a href="/tags/drupal" hreflang="en">Drupal</a></div> <div class="field__item"><a href="/tags/webdev" hreflang="en">WebDev</a></div> <div class="field__item"><a href="/tags/subtheming" hreflang="en">Subtheming</a></div> </div> <!-- END OUTPUT from 'core/themes/classy/templates/field/field.html.twig' --> <!-- THEME DEBUG --> <!-- THEME HOOK: 'links__node' --> <!-- FILE NAME SUGGESTIONS: x links--node.html.twig x links--node.html.twig * links.html.twig --> <!-- BEGIN OUTPUT from 'core/themes/classy/templates/content/links--node.html.twig' --> <!-- END OUTPUT from 'core/themes/classy/templates/content/links--node.html.twig' --> Fri, 22 Feb 2013 08:36:51 +0000 Fletch 34 at https://monkeysatkeyboards.com