Drupal https://www.digett.com/ en Which Base Theme We Use (and Why) https://www.digett.com/insights/which-base-theme-we-use-and-why <span>Which Base Theme We Use (and Why)</span> <div class="field field--name-field-teaser-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/styles/blog_card/public/filefield_images/field_teaser_image/getbootstrap.png?itok=323PGdZa" width="323" height="212" alt="" typeof="foaf:Image" /> </div> <span><span lang="" about="/users/jd-collier" typeof="schema:Person" property="schema:name" datatype="">JD Collier</span></span> <span>Tue, 12/16/2014 - 8:34am</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>There are so many website themes, frameworks and opinions out there ... how do you decide which is the best foundation for your next project?</p> <!--break--><p>You can purchase a ready to use theme, start from a base theme with as much or as little foundation as you like or you can build your own HTML from scratch and then add Wordpress or Drupal API code to your HTML.</p> <p>I have personally used all of these approaches across various projects, but I have a strong preference these days for Bootstrap as the foundation for every website I build on Drupal, Wordpress and small static pages.</p> <h2>Why I don't use the other approaches any longer</h2> <p>Of course, there are more reasons than I can list here, but a few notes on why I don't start projects without Bootstrap:</p> <ul> <li><strong>Ready to use purchased theme</strong>: There are many thousands of Wordpress ready to go themes and fewer (but still many) Drupal ready-to-go themes. My biggest reason to avoid these has to do with the design being mostly locked in already. These themes are usually complete designs just waiting for a logo, copy and images. I find I have to argue with the theme too much to bend it away from the built-in design. Some of these themes are so complex they actually change the CMS core functions, but I need consistency across projects in the CMS so my content editors can work across client sites.</li> <li><strong>Build your own HTML:</strong> For years, my preferred approach was to build my own perfectly clean HTML/CSS. This has the benefit of being clean and exactly suited to the needed design. In recent years, though, I have fallen out of love with this approach due to the need to reinvent the wheel with every project. Now that every website needs to be responsive and work across browsers and devices and websites requirements include sophisticated CSS3 effects, jQuery magic and HTML5 sophistication—it just doesn't make sense to start over with each project.</li> <li><strong>Wonderful frameworks</strong> like 960 grid and others don't include all the <a href="http://getbootstrap.com/css/#less">LESS</a>/<a href="http://getbootstrap.com/css/#sass">SASS</a> mix-ins that I have at my fingertips with Bootstrap.</li> </ul> <h2>Why I use Bootstrap</h2> <p>Before I begin, I should include a quick disclaimer—I have used and also love Zurb <a href="http://foundation.zurb.com/">Foundation</a>. Bootstrap and Foundation have pretty good feature parity these days. We chose Bootstrap when Foundation didn't have as much Drupal support, but Foundation has <a href="https://www.drupal.org/project/zurb_foundation">pretty robust Drupal support</a> now so in the end you can choose by features meaningful to you.</p> <ul> <li>Boostrap includes all the documentation and code to work across browsers and devices.</li> <li>Bootstrap includes tons of mix-ins that allow sophisticated content even inside the WYSIWYG. I also use it in template code and event in Drupal views and Drupal Display Suite.</li> <li>Bootstrap has mobile functionality built in. Whether I'm mobile-first or desktop-first, I am pleasantly surprised when I'm styling a page and then check other breakpoints and almost every time, it is already 95% there ... I just need to add a few adjustments here and there.</li> <li>Many common advanced widgets are <a href="http://getbootstrap.com/javascript/">already included</a>: buttons, carousels, accordion lists, tabs, and more are already included and just require you to add some classes to your html output.</li> <li><em>Lots</em> of documentation already exists. If I run into an issue, I can check the <a href="http://getbootstrap.com/">Bootstrap website</a>, Stack Overflow and Drupal theme support issue queues.</li> </ul> <h2>Drupal-specific modules used to help create a Drupal Bootstrap site</h2> <ul> <li><a href="https://www.drupal.org/project/bootstrap">Drupal Bootstrap theme</a></li> <li><a href="https://www.drupal.org/project/ds_bootstrap_layouts">Display Suite Bootstrap Layouts</a> (I'm a ds person, but I know there are Panels helpers too)</li> <li><a href="https://www.drupal.org/project/views_bootstrap">Views Bootstrap</a>: This module adds displays to Views to allow you to output Bootstrap grids, accordions, carousels and more.</li> </ul> <h2>What do you think?</h2> <p>If you've tried one of these methods and have other opinions, please chime in. I seem to check out themes and frameworks like a hobby. I often find myself downloading and playing with a new framework or theme and constantly evaluating it against what I do now. Have you found something better?</p> </div> <section> <h2>LEAVE A COMMENT</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=1155&amp;2=comment_no_subject&amp;3=comment_no_subject" token="wAI39MX97h9DaqDLlZRNH8kdGVuRB0mOUp6OoybdjxA"></drupal-render-placeholder> <article data-comment-user-id="0" id="comment-2165" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1418762889"></mark> <div> <div class="comment-name">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">WorldFallz</span> on Tue, 12/16/2014 - 2:48pm</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>Totally agree! And have recently also switched to a complete bootstrap operation. I'm in the process of migrating all my sites so it.</p> <p>The efficiency gained from learning and knowing just ONE theme system is worth it's wait in person hours, lol.</p> <p>In addition to the modules also mentioned, checkout: </p> <p><a href="https://www.drupal.org/project/panels_bootstrap_layouts">https://www.drupal.org/project/panels_bootstrap_layouts</a></p> <p>and</p> <p><a href="https://www.drupal.org/project/bootstrap_tour">https://www.drupal.org/project/bootstrap_tour</a> </p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=2165&amp;1=default&amp;2=en&amp;3=" token="vhqLjCGs31DdLc9ghhK5Q5V4aS2XDu8-NvcqrDq-YQA"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="0" id="comment-2167" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1418820539"></mark> <div> <div class="comment-name">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Rajab Natshah</span> on Wed, 12/17/2014 - 6:48am</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>Bootstrap theme is the way.<br /> But I find the Open Framework is another way.</p> <p><a href="https://openframework.stanford.edu/">https://openframework.stanford.edu/</a><br /> <a href="https://github.com/SU-SWS/open_framework/tree/7.x-3.x">https://github.com/SU-SWS/open_framework/tree/7.x-3.x</a></p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=2167&amp;1=default&amp;2=en&amp;3=" token="3i22WgL-P4wTJqby6zEeOXmaqD0Wux6sHB4syJuGwA4"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="21" id="comment-2168" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1418832190"></mark> <div> <div class="comment-name">Submitted by <span lang="" about="/users/jd-collier" typeof="schema:Person" property="schema:name" datatype="">JD Collier</span> on Wed, 12/17/2014 - 10:03am</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>I haven't been able to use Open Framework because I've found Bootstrap 3 to be a vast improvement ... I would probably not use Bootstrap if I was stuck with v2 for what I need.</p> <p>I just did a quick search and saw a fork or two but didn't see anything supported. Do you know if they ever ported? I'm wondering if Stanford might be slow to act since Bootstrap moved to MIT licensing.</p> <p>Any openframework on v3?</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=2168&amp;1=default&amp;2=en&amp;3=" token="O-f8Uor92pBYLa1zaVtt9K5msI7X4mQifvqYnvWC73s"></drupal-render-placeholder> </div> </div> </article> </section> <div class="sharethis-wrapper"><span st_url="https://www.digett.com/insights/which-base-theme-we-use-and-why" st_title="Which Base Theme We Use (and Why)" class="st_facebook_large" displayText="facebook"></span> <span st_url="https://www.digett.com/insights/which-base-theme-we-use-and-why" st_title="Which Base Theme We Use (and Why)" class="st_linkedin_large" displayText="linkedin"></span> <span st_url="https://www.digett.com/insights/which-base-theme-we-use-and-why" st_title="Which Base Theme We Use (and Why)" class="st_twitter_large" displayText="twitter"></span> <span st_url="https://www.digett.com/insights/which-base-theme-we-use-and-why" st_title="Which Base Theme We Use (and Why)" class="st_email_large" displayText="email"></span> </div> Tue, 16 Dec 2014 14:34:45 +0000 JD Collier 1155 at https://www.digett.com 4 Challenges With a Webforms Project, Part IV https://www.digett.com/insights/4-challenges-webforms-project-part-iv <span>4 Challenges With a Webforms Project, Part IV</span> <div class="field field--name-field-teaser-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/styles/blog_card/public/filefield_images/field_teaser_image/challenges-webform-drupal.png?itok=g7mDhvDj" width="275" height="183" alt="" typeof="foaf:Image" /> </div> <span><span lang="" about="/users/travis-flatt" typeof="schema:Person" property="schema:name" datatype="">Travis Flatt</span></span> <span>Wed, 12/03/2014 - 10:27am</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Welcome to the fourth and final part of my in-depth look at customizing some default behavior in Webforms, and in this installment, Drupal’s Bootstrap theme. Today we’ll look specifically at repurposing bootstrap alerts and some more general minor DOM manipulation.</p> <!--break--><p>(Here’s <a href="/insights/4-challenges-webform-project-part-i">Part I</a>, <a href="/insights/4-challenges-webform-project-part-ii">Part II</a>, and <a href="/insights/4-challenges-webforms-project-part-iii">Part III</a> for easy reference if you’re late to the party.)</p> <h2>Challenge #4: Thank you, come again!</h2> <p>So, at this point in the project, the form behaves as desired right up until a successful submission.</p> <p>As we start looking at the form’s confirmation behavior, it’s currently reloading the page and giving us a pretty generic bootstrap alert box with some confirmation text. This is with the basic webform setting of sending a confirmation to the same page as the submission form. We could also redirect to another page, but in this instance we don’t want either of those things.</p> <p>The desired behavior is for the area with the form to remain open upon submission, and have the form be replaced with a thank you message box that can be closed in much the same way as the form itself (much like the <a href="http://jsfiddle.net/travtex/u3f50mox/">toggle effect here</a>, to refresh your memory).</p> <p>Before we do anything, we want to be sure we’re on an actual confirmation page. Our bootstrap theme has us set up here by putting an element right there on the page for us, even though we don’t want to look at it. In this instance, I’m just going to add a class to that particular bootstrap alert’s parent, which will already be set up in CSS with display: none.</p> <pre>  </pre><p>$('.confirmation-message').parent().addClass('form-confirmation');</p> <pre>  </pre><h2>Customize that confirmation</h2> <p>At this point our confirmation page is just getting a hidden bootstrap alert div sent to the page. We can use that as our condition for triggering the confirmation behavior, but first we check to see if that particular alert box exists.</p> <pre>  </pre><p>if ($(.form-confirmation).length) { // Do things here }</p> <pre>  </pre><p>Once we know that we’re working with a completed, validated, and confirmed form entry, we’re going to place our confirmation message right there in the toggle area where our original form once lived.</p> <pre>  </pre><p>if ($(.form-confirmation).length) {</p> <pre>  </pre><p>$('.form-div').before("&lt;div class='alert alert-info alert-dismissible signup-confirmation' role='alert'&gt;&lt;button type='button' class='close confirmation-corner-button'&gt;&lt;span class='close-button-text '&gt;Close &lt;span aria-hidden='true'&gt;&lt;i class='fa fa-times' ;&gt;&lt;/i&gt;&lt;/span&gt;&lt;/button&gt;&lt;h2&gt;Thank You!&lt;/h2&gt;&lt;p&gt; Your message has been sent. Thank you for your interest.&lt;/p&gt;&lt;div class=' close-button'&gt;&lt;button type='button' class='btn close-confirmation-button'&gt;Close&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;");</p> <pre>  </pre><p>This creates a new alert box more in the area of where we want it. In addition to the “X” in the upper right corner, we’re also adding a more explicit “Close” button in case the purpose of that “X” isn’t immediately obvious to our user.</p> <p>Also, we’re going to scroll to the thank you message.</p> <pre>  </pre><p>$('html, body').animate({ scrollTop: $(".signup-confirmation") .offset().top - 100 }, 500); }</p> <pre>  </pre><h2>Closing things up</h2> <p>Now all that’s left to do is to ensure that our two “Close” function buttons do the same thing. We want them both to close the form/confirmation area and slide back up to the original position on the page.</p> <pre>  </pre><p>$('.confirmation-corner-button').click(function(e) { $(this).parent().slideUp ('slow'); $('html, body').animate({ scrollTop: $("html") .offset() .top }, 800); (e.preventDefault) ? e.preventDefault() : e.returnValue = false; });</p> <pre>  </pre><p>This should look familiar — it’s pretty similar to the slide code we used back in Part I to open the form in the first place.</p> <p>Finally, we just force the second button’s click action to trigger that of the first instead of its own.</p> <pre>  </pre><p>$('.close-confirmation-button').click(function(e) { $('. confirmation-corner-button').trigger('click'); (e.preventDefault) ? e.preventDefault() : e.returnValue = false; });</p> <pre>  </pre><p>JSFiddle with some simple shared click event functions can be <a href="http://jsfiddle.net/travtex/habyvd2u/">found here</a>. </p> <p><em>[Image: <a href="https://www.flickr.com/photos/eduardox/2533079036/">EduardoEquis</a>] </em></p> </div> <section> <h2>LEAVE A COMMENT</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=1153&amp;2=comment_no_subject&amp;3=comment_no_subject" token="z2CTXzYCCYdvMv5dCJQ0swUCRVlsmC3H5e7E0mrUYHA"></drupal-render-placeholder> </section> <div class="sharethis-wrapper"><span st_url="https://www.digett.com/insights/4-challenges-webforms-project-part-iv" st_title="4 Challenges With a Webforms Project, Part IV" class="st_facebook_large" displayText="facebook"></span> <span st_url="https://www.digett.com/insights/4-challenges-webforms-project-part-iv" st_title="4 Challenges With a Webforms Project, Part IV" class="st_linkedin_large" displayText="linkedin"></span> <span st_url="https://www.digett.com/insights/4-challenges-webforms-project-part-iv" st_title="4 Challenges With a Webforms Project, Part IV" class="st_twitter_large" displayText="twitter"></span> <span st_url="https://www.digett.com/insights/4-challenges-webforms-project-part-iv" st_title="4 Challenges With a Webforms Project, Part IV" class="st_email_large" displayText="email"></span> </div> Wed, 03 Dec 2014 16:27:03 +0000 Travis Flatt 1153 at https://www.digett.com Product Review: New Relic APM for Drupal Performance Tuning https://www.digett.com/insights/product-review-new-relic-apm-drupal-performance-tuning <span>Product Review: New Relic APM for Drupal Performance Tuning</span> <div class="field field--name-field-teaser-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/styles/blog_card/public/filefield_images/field_teaser_image/newrelic-logo-square_0.png?itok=BeMQYJPy" width="275" height="183" alt="" typeof="foaf:Image" /> </div> <span><span lang="" about="/users/jd-collier" typeof="schema:Person" property="schema:name" datatype="">JD Collier</span></span> <span>Tue, 10/07/2014 - 10:36am</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field__item"><p><a href="http://newrelic.com/">New Relic</a> APM (Application Monitoring) is an amazing tool to help you tune the performance of your Drupal website.</p> <!--break--><p>Application Monitoring allows you to trace Drupal performance. You can deep dive into Drupal tuning with analytics on the performance of Modules, Hooks, Views and much more.</p> <p>I can quickly scan the data to determine which module has the slowest average call time. I can peer into the running website to determine where the roadblocks to performance are coming from.</p> <p>One of the most useful pieces of data is the average load time for a page and the <a href="https://en.wikipedia.org/wiki/Apdex">Apdex score</a> for the site. The Apdex is a complex algorithm which measures user satisfaction of application performance / response time.</p> <p><img alt="" src="/sites/default/files/screenshot_2014-10-07_10.35.22.png" /></p> <p>There is a mountain of data in this tool, but here are a few highlights that affect Drupalistas the most:</p> <ul> <li>Modules that are the most time consuming for the server</li> <li>Which Hooks are consuming the most resources</li> <li>Views that take the most time to run</li> <li>Most time consuming / slowest queries</li> <li>Measure page views as a percentage of total page load times</li> <li>Ajax performance bottlenecks</li> <li>Javascript error analytics</li> <li>Page load statics by browser</li> </ul> <p>The list really could go on and on. You are able to drill into almost any metric to get more detailed information.</p> <p><img alt="" src="/sites/default/files/screenshot_2014-10-07_09.57.58.png" /></p> <p><img alt="" src="/sites/default/files/screenshot_2014-10-07_10.15.43_0.png" /></p> <h2>How to get it</h2> <p><a href="/blog/02/25/2014/why-i-love-pantheon-drupal-hosting">We love Pantheon for Drupal hosting</a> and most plans come with New Relic APM. You can also sign up on <a href="http://newrelic.com/">newrelic.com</a> for their SaaS APM solution.</p> </div> <section> <h2>LEAVE A COMMENT</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=1142&amp;2=comment_no_subject&amp;3=comment_no_subject" token="b33fLK7xXHnJnSEKk_sO6BV10YGcWNIckQ8Pxr-cN70"></drupal-render-placeholder> </section> <div class="sharethis-wrapper"><span st_url="https://www.digett.com/insights/product-review-new-relic-apm-drupal-performance-tuning" st_title="Product Review: New Relic APM for Drupal Performance Tuning" class="st_facebook_large" displayText="facebook"></span> <span st_url="https://www.digett.com/insights/product-review-new-relic-apm-drupal-performance-tuning" st_title="Product Review: New Relic APM for Drupal Performance Tuning" class="st_linkedin_large" displayText="linkedin"></span> <span st_url="https://www.digett.com/insights/product-review-new-relic-apm-drupal-performance-tuning" st_title="Product Review: New Relic APM for Drupal Performance Tuning" class="st_twitter_large" displayText="twitter"></span> <span st_url="https://www.digett.com/insights/product-review-new-relic-apm-drupal-performance-tuning" st_title="Product Review: New Relic APM for Drupal Performance Tuning" class="st_email_large" displayText="email"></span> </div> Tue, 07 Oct 2014 15:36:12 +0000 JD Collier 1142 at https://www.digett.com 4 Challenges with a Webform Project, Part I https://www.digett.com/insights/4-challenges-webform-project-part-i <span>4 Challenges with a Webform Project, Part I</span> <div class="field field--name-field-teaser-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/styles/blog_card/public/filefield_images/field_teaser_image/drupal-webforms-javascript_1.png?itok=fAJ82J3S" width="275" height="183" alt="" typeof="foaf:Image" /> </div> <span><span lang="" about="/users/travis-flatt" typeof="schema:Person" property="schema:name" datatype="">Travis Flatt</span></span> <span>Tue, 09/23/2014 - 8:42am</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>I like Javascript. There, I said it. It’s all out there floating across the internet, and no doubt my kids will mock me for it twenty years from now when they’re busily developing code via direct brain-link. For now, though, I find it to be a remarkably versatile problem solver for things that just aren’t quite handled by the default behavior of your favorite framework or CMS.</p> <!--break--><p>A recent Drupal project allowed me the opportunity for some Javascript/jQuery troubleshooting, which I usually find to be the fun part of any given day. Even when I’m not technically at work.</p> <div class="rtecenter"><img alt="Sleeping Programmer" src="/sites/default/files/programmer_250.jpg" style="width: 250px; height: 167px;" /></div> <p class="rtecenter"><em>Computering until this point, basically.</em></p> <p dir="ltr">I was originally thinking this would make for a single quick post, until I started explaining things. I’ve broken it up into four easily-digestible bites, each focusing on a specific problem that needed to be handled and its solution. First, we begin with...</p> <h2 dir="ltr">Challenge #1: Hide the form</h2> <p dir="ltr">I was working in Drupal for this particular project, but the jQuery methods I’m going to talk about are pretty platform agnostic.</p> <p dir="ltr">In this case, we wanted the form to not immediately appear on the page. The desired behavior was the appearance of a shiny button, which when clicked would display our glorious webform.</p> <p dir="ltr">This is a pretty common general usage, and easily accomplished with a <span style="font-family: monotype;">display: none</span> in CSS.</p> <p dir="ltr"> </p> <pre> .hide-this-element { display: none; }</pre><p> </p> <p dir="ltr">With the element stealthily hiding on the page, we need to take over the behavior of our button. In this case, I’m going to use jQuery’s <span style="font-family: monotype;">slideToggle()</span>method just to give the added functionality to open or close the form with the same button.</p> <p> </p> <pre> var button = $(‘.button-selector‘); var form = $(‘.form-selector'); button.click(function(event) { form.slideToggle(‘slow'); if (button.text().trim() === ‘Default Text') { button.text(‘Different Text'); } else { button.text(‘Default Text'); } event.preventDefault(); $('html, body').animate({ scrollTop: form.offset().top }, 800); form.addClass('open'); }); </pre><p> </p> <p>So, there’s a few extra things going on here. The function itself is living inside a jQuery <span style="font-family: monotype;">.click()</span>method that’s telling the browser, “When this thing is clicked, do these things.”</p> <p>An important element of event listeners like this is that <span style="font-family: monotype;">event.preventDefault</span>bit. For most modern browsers, <span style="font-family: monotype;">event.preventDefault()</span>will work just fine in keeping the browser from doing the default behavior associated with the element. Usually this is a link. We don’t want the browser to look for an href attribute or redirect the page here, so we block that behavior.</p> <p>(The actual production code is a bit heavier for some things, and <span style="font-family: monotype;">preventDefault()</span>is one of them, as it doesn’t work with IE8, but if I start turning this into a discussion of what doesn’t work on IE8 we’ll never get anywhere.)</p> <p>There are a handful of options with <span style="font-family: monotype;">slideToggle</span>, but we’re keeping it simple here, only passing it <span style="font-family: monotype;">‘slow’</span>. This refers to the speed of the animation when the element we’re hiding or displaying is revealed or hidden.</p> <p>The conditional isn’t something that made it into production, but I threw it back in for the sake of building a more interactive event handler for this discussion. By using <span style="font-family: monotype;">slideToggle()</span>, the button has hide and show functionality. I like the idea of changing the text of the button to refer to whatever its current action will do.</p> <p>The last bit is using the <span style="font-family: monotype;">.animate()</span>method, which has enough options to fill a book. Here we’re using it for a bit of user experience consideration. A big form has just opened, so we’re going to assume the user actually wanted to use said form and scroll the screen down to where it begins.</p> <p>Working example <a href="http://jsfiddle.net/travtex/u3f50mox/">here</a>.</p> <p>Next time we’ll talk about problem #2: Hide the form some more — which turned out to be a significantly different problem than the title might imply. We’ll cover some default webform rendering behavior, the problems it can cause, and ways to work around it.</p> <p><em>[Images: <a href="https://www.flickr.com/photos/simonpowca/" target="_blank">Simon Pow</a>, <a href="https://www.flickr.com/photos/patrickgensel/6716877299/">Patrick Gensel</a>]</em></p> </div> <section> <h2>LEAVE A COMMENT</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=1140&amp;2=comment_no_subject&amp;3=comment_no_subject" token="yJo0-NlO6MYTsP4lHlMLGD1YFpr-3sViJHlTJW5R7BI"></drupal-render-placeholder> </section> <div class="sharethis-wrapper"><span st_url="https://www.digett.com/insights/4-challenges-webform-project-part-i" st_title="4 Challenges with a Webform Project, Part I" class="st_facebook_large" displayText="facebook"></span> <span st_url="https://www.digett.com/insights/4-challenges-webform-project-part-i" st_title="4 Challenges with a Webform Project, Part I" class="st_linkedin_large" displayText="linkedin"></span> <span st_url="https://www.digett.com/insights/4-challenges-webform-project-part-i" st_title="4 Challenges with a Webform Project, Part I" class="st_twitter_large" displayText="twitter"></span> <span st_url="https://www.digett.com/insights/4-challenges-webform-project-part-i" st_title="4 Challenges with a Webform Project, Part I" class="st_email_large" displayText="email"></span> </div> Tue, 23 Sep 2014 13:42:59 +0000 Travis Flatt 1140 at https://www.digett.com A module I've been wanting for a long time — insert a block in WYSIWYG https://www.digett.com/insights/module-i-ve-been-wanting-long-time-%E2%80%94-insert-block-wysiwyg <span>A module I&#039;ve been wanting for a long time — insert a block in WYSIWYG</span> <div class="field field--name-field-teaser-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/styles/blog_card/public/filefield_images/field_teaser_image/insert-block-wysiwyg-drupal.png?itok=ogV-_KNp" width="275" height="183" alt="" typeof="foaf:Image" /> </div> <span><span lang="" about="/users/jd-collier" typeof="schema:Person" property="schema:name" datatype="">JD Collier</span></span> <span>Tue, 07/01/2014 - 8:35am</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Sometimes what you are looking for is right in front of you. I have been searching for a module to allow me to insert a block into a WYSIWYG field. I tried looking for a Drupal implementation like Wordpress Shortcodes, perhaps the SimpleAd module would do what I'm wanting, maybe there is a Ckeditor plugin written for this? I came up short.</p> <!--break--><h2>Suddenly, the obvious choice</h2> <p>I need to be able to insert small bits of content into WYSIWYG that can be edited once but placed all over the site. In this case, I needed a call to action that only appeared on certain pages and I wanted the CTA to be inline and not outside the content.</p> <p>It suddenly hit me to start searching for "insert a block into WYSIWYG" and I felt stupid. The second result is a module called "<a href="https://www.drupal.org/project/insert_block">Insert Block</a>." I quickly spun off a testing environment of my site and installed the module. It works beautifully. </p> <h2>How it works</h2> <p>After you install the module, there is an administration screen where you can adjust permissions (the default worked just fine for me). Before you start using the module, you just need to access the Text Format and turn on the "Insert Blocks" filter.</p> <p>The code is<strong> [block:module=delta]</strong></p> <p>Look Greek? It actually isn’t. Lots of modules can produce blocks; in this case I am making a simple text block using the block function itself. This means the module is named "block." The <em>delta</em> is just fancy Drupal-speak for which one to display.</p> <p>You can find the block delta by hovering over the configure link for the desired block and the delta will be listed in the URL path. For a block created in the blocks screen, it is a number. If the block is created by Views or another module, it could be a string.</p> <p>Insert [block:block=10] into the WYSIWYG editor and <em>voilà</em>! The block is inserted and if you change the block content, it will change everywhere it is used.</p> <p>Give it a try! What do you think? Also, I've love to hear if you found another solution.</p> <p><em>[Photo credit: <a href="https://www.flickr.com/photos/jefharris/4047722702/in/photostream/">Jeff Harris</a>]</em></p> </div> <section> <h2>LEAVE A COMMENT</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=1122&amp;2=comment_no_subject&amp;3=comment_no_subject" token="6MLedR1vVOAge-IMOqPSD1P2VSklIVGJ1LATHIXx32U"></drupal-render-placeholder> <article data-comment-user-id="0" id="comment-2048" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1404312105"></mark> <div> <div class="comment-name">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Danny</span> on Wed, 07/02/2014 - 9:41am</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>And what happens when you have 1000 nodes with block tokens inside and you want to disable this module because you no longer want to use its functionality? :)</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=2048&amp;1=default&amp;2=en&amp;3=" token="PtPGNdjFfttxQVEf5SkwBIzbaMeM9kzmnoRg_F7E8Ck"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="21" id="comment-2049" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1404312340"></mark> <div> <div class="comment-name">Submitted by <span lang="" about="/users/jd-collier" typeof="schema:Person" property="schema:name" datatype="">JD Collier</span> on Wed, 07/02/2014 - 9:45am</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>What happens? I would imagine silent tears in the corner of my office.</p> <p>But ... there are plenty of things that if they might happen, would create a lot of work on every site. </p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=2049&amp;1=default&amp;2=en&amp;3=" token="2sEG4LUADQnXzsiBFS49RPI09gW02uS4EAGdUT9lh-Y"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="0" id="comment-2055" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1405340780"></mark> <div> <div class="comment-name">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Håvard Pedersen</span> on Mon, 07/14/2014 - 7:26am</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>If you want to display those nodes, you ARE still using its functionality.</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=2055&amp;1=default&amp;2=en&amp;3=" token="Xd9bEIIFb9GaehBFaamGpAtmlk06UrTN7WItQ2aQORc"></drupal-render-placeholder> </div> </div> </article> </section> <div class="sharethis-wrapper"><span st_url="https://www.digett.com/insights/module-i-ve-been-wanting-long-time-%E2%80%94-insert-block-wysiwyg" st_title="A module I&#039;ve been wanting for a long time — insert a block in WYSIWYG" class="st_facebook_large" displayText="facebook"></span> <span st_url="https://www.digett.com/insights/module-i-ve-been-wanting-long-time-%E2%80%94-insert-block-wysiwyg" st_title="A module I&#039;ve been wanting for a long time — insert a block in WYSIWYG" class="st_linkedin_large" displayText="linkedin"></span> <span st_url="https://www.digett.com/insights/module-i-ve-been-wanting-long-time-%E2%80%94-insert-block-wysiwyg" st_title="A module I&#039;ve been wanting for a long time — insert a block in WYSIWYG" class="st_twitter_large" displayText="twitter"></span> <span st_url="https://www.digett.com/insights/module-i-ve-been-wanting-long-time-%E2%80%94-insert-block-wysiwyg" st_title="A module I&#039;ve been wanting for a long time — insert a block in WYSIWYG" class="st_email_large" displayText="email"></span> </div> Tue, 01 Jul 2014 13:35:43 +0000 JD Collier 1122 at https://www.digett.com Varnish, Memcache — Cache All the Things BUT Still Run Dynamic Code https://www.digett.com/insights/varnish-memcache-%E2%80%94-cache-all-things-still-run-dynamic-code <span>Varnish, Memcache — Cache All the Things BUT Still Run Dynamic Code</span> <div class="field field--name-field-teaser-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/styles/blog_card/public/filefield_images/field_teaser_image/x-all-the-things.jpg?itok=dF6geuj4" width="552" height="414" alt="" typeof="foaf:Image" /> </div> <span><span lang="" about="/users/jd-collier" typeof="schema:Person" property="schema:name" datatype="">JD Collier</span></span> <span>Tue, 06/03/2014 - 8:23am</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>There are quite a few caching options out there, and we frequently combine several services to cache every little piece of a site. Think about it: standard Drupal cache, Varnish, Memcache, Redis, various files coming from CDNs, and more.</p> <!--break--><h3>What if you want something unique?</h3> <p>These are great tools to create peppy websites, but what happens when you want to change a menu based on a cookie value or create a view with a random sort? There are lots of valid use cases for small pieces of unique content.</p> <p>You will run into issues where the content is cached and once the page is rendered and cached, it will continue being served up with the same render for every subsequent person — the random sort, the randomly loaded image, the unique output based on a cookie value will not work.</p> <h2>Here are two quick options:</h2> <h3><strong>Move the dynamic content from PHP to JS</strong></h3> <p>If you move the execution of the dynamic content from PHP (which gets compiled and cached) to jQuery, the unique code gets rendered by the browser and not the server. This allows you to display custom code on the page without it being cached.</p> <h3><strong>Use the Ajax Blocks Drupal module</strong></h3> <p>Another way to do when I need or want to code this in PHP and I don't want it in jQuery visible for the world to see is to use the Drupal Ajax Blocks module.</p> <p>I had a scenario where I had a cookie written by a web application on a subdomain and a different server and the servers Varnish cache was very strict with what I could do with cookies. I needed to pull in encrypted data from the cookie and use the openssl_decrypt PHP function to decrypt and display unique data for users of the app, but anonymous to Drupal. Varnish would cache the page and there was no way to edit this vendors Varnish config to allow my content to run.</p> <p>Ajax Blocks saved the day. I had my code run in a block .tpl file and set the block to run from Ajax Blocks; the page rendered and then my code was pulled in via Ajax and wasn't cached.</p> <p>You can also use Varnish ESI (Edge Side Includes), but that didn't work for me in this server environment.</p> <p>Cache all the things! Use all the aggregation and caching tools at your disposal — you can still serve small bits of uniqueness on the page.</p> <p><em>[<a href="http://hyperboleandahalf.blogspot.com/">All the things image and meme originated from Allie Brosh</a>]</em></p> </div> <section> <h2>LEAVE A COMMENT</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=1112&amp;2=comment_no_subject&amp;3=comment_no_subject" token="J964wuucvIzsc2z09fLKct-GI5fncysHSjDGto4mVSU"></drupal-render-placeholder> </section> <div class="sharethis-wrapper"><span st_url="https://www.digett.com/insights/varnish-memcache-%E2%80%94-cache-all-things-still-run-dynamic-code" st_title="Varnish, Memcache — Cache All the Things BUT Still Run Dynamic Code" class="st_facebook_large" displayText="facebook"></span> <span st_url="https://www.digett.com/insights/varnish-memcache-%E2%80%94-cache-all-things-still-run-dynamic-code" st_title="Varnish, Memcache — Cache All the Things BUT Still Run Dynamic Code" class="st_linkedin_large" displayText="linkedin"></span> <span st_url="https://www.digett.com/insights/varnish-memcache-%E2%80%94-cache-all-things-still-run-dynamic-code" st_title="Varnish, Memcache — Cache All the Things BUT Still Run Dynamic Code" class="st_twitter_large" displayText="twitter"></span> <span st_url="https://www.digett.com/insights/varnish-memcache-%E2%80%94-cache-all-things-still-run-dynamic-code" st_title="Varnish, Memcache — Cache All the Things BUT Still Run Dynamic Code" class="st_email_large" displayText="email"></span> </div> Tue, 03 Jun 2014 13:23:14 +0000 JD Collier 1112 at https://www.digett.com Crawling vs. Indexing: Robots.txt and sitemap.xml https://www.digett.com/insights/crawling-vs-indexing-robotstxt-and-sitemapxml <span>Crawling vs. Indexing: Robots.txt and sitemap.xml</span> <div class="field field--name-field-teaser-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/styles/blog_card/public/filefield_images/field_teaser_image/crawling-vs-indexing-robots-txt-sitemap-xml.png?itok=2JVvUodZ" width="275" height="183" alt="Crawling vs. indexing: robots.txt and sitemap.xml" typeof="foaf:Image" /> </div> <span><span lang="" about="/users/jd-collier" typeof="schema:Person" property="schema:name" datatype="">JD Collier</span></span> <span>Tue, 04/15/2014 - 9:55am</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Sometimes you need to prevent a site, page or everything at a particular path from showing up in Google search. I've heard people say to just disallow the page in robots.txt file. This is actually incorrect.</p> <!--break--><p>If you simply add a disallow to your robots.txt file, then it is true that Google will not "crawl" that page, but if you have that page in your sitemap.xml file then the page will still be submitted to the Google Index.</p> <p>You will find your disallowed content in Google search.</p> <h2> For example</h2> <p>Scenario:</p> <ul> <li> I have created a view with client logos and I don't want each node to be seen. I only want the nodes to appear inside my view.</li> <li> The nodes are at a /clients path.</li> </ul> <p>In this scenario, I will do just one thing:</p> <p><meta content="noindex" name="robots" /></p> <ul> <li> Add noindex to the page</li> </ul> <p>A common error I've seen is for people to add:</p> <ul> <li> disallow: /clients to robots.txt</li> </ul> <p>I've seen people perform this update and think this will prevent the page from showing in Google search. However, if you are using the sitemap.xml module to create your sitemap.xml file, chances are you also have it set to auto submit your index to Google and possibly other search engines.</p> <h2> Crawling vs. indexing</h2> <p>You have prevented Google from <em>crawling</em> your site, but you may have just allowed your sitemap module to autosubmit the url to be indexed. It will not crawl further after this link, but it has still been indexed.</p> <p><em>Note: You should also configure your sitemap.xml module correctly, but that is another topic.</em></p> <p>Robots.txt tells Googlebot and other crawlers what is and is not allowed to be crawled; the noindex tag tells Google Search what is and is not allowed to be indexed and displayed in Google Search.</p> <h3> One step further</h3> <p>This part hurts my brain, but there seems to be consensus that you should <em>not</em> add items you want to prevent from search to your robots file. Instead, you should allow them to be crawled and have a noindex tag on them to then ensure Google knows not to display them.</p> <h2> Development environments</h2> <p>On a development server, this is much simpler. You can tell Apache to globally disallow all files. In the Apache httpd.conf file, add this:</p> <p><code># Globally disallow robots from the development sever<br /> Header Set X-Robots-Tag "noindex, noarchive, nosnippet"</code> </p><p>You can also do this in an htaccess file to add this header in a more granular scenario.</p> <p>What do you think? Agree, disagree, or duh? :)</p> <p><em>[Image by  <a href="https://www.flickr.com/photos/iguanajo/277209483">giorgio raffaelli</a>]</em></p> </div> <section> <h2>LEAVE A COMMENT</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=1098&amp;2=comment_no_subject&amp;3=comment_no_subject" token="-lVWn5vBacPBdHtO6rc2AqWf7OUEU0bJvzEB30YBoek"></drupal-render-placeholder> <article data-comment-user-id="0" id="comment-2004" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1397657127"></mark> <div> <div class="comment-name">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">kalabro</span> on Wed, 04/16/2014 - 9:05am</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>Both robots.txt and sitemap.xml are recommendations. Usually you need to configure 403 HTTP status for non-public data.</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=2004&amp;1=default&amp;2=en&amp;3=" token="MXijhLoJF2Mfb6M_UM45Kv1zTTW4mIe3vx_4we9LwXE"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="0" id="comment-2008" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1398124278"></mark> <div> <div class="comment-name">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Your Name</span> on Mon, 04/21/2014 - 6:51pm</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>Nice post. It's a duh and a jeh all in once. We see a lot of things go wrong with robots.txt and sitemaps because somehow all website developers, hobbyist and pro alike, need to do some seo it seems. They then turn to the usual suspects that are top of mind resulting in people putting in regular expressions in the robots as well. So the want to disallow a url and end up take down a whole tag or category with 40 valuable pages on it. </p> <p>Truth of the matter is that the real masters of the crawl and indexing process do not use robots.txt nor a xml sitemap. A well designed and structured site should provide ample breadcrumbs for the spider to follow starting with an effective menu and navigation structure on the front page for every website as not doing this causes a chain reaction like effect on the indexability of a site as a whole. When we do not cut corners we manage to get millions of pages indexed in the first year for new websites. How? With with followed links on to targets we choose and for the rest it’s never cutting corners. </p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=2008&amp;1=default&amp;2=en&amp;3=" token="WVvLIk32cpkXnQ41JrbGD_9ouhY7jXkxCZK1a0fh50E"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="0" id="comment-2053" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1404591998"></mark> <div> <div class="comment-name">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Stefan</span> on Sat, 07/05/2014 - 3:26pm</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>Commands in a robots.txt file are requests, not commands, to web crawlers, which they hopefully choose to honor.</p> <p>However malicious crawlers will actually look for the locations of hidden content in robots.txt - which they would otherwise not have discovered if the robots.txt file was not present.</p> <p>That is why I believe it is better not to specify the location of hidden pages using robots.txt, but instead with a meta robots tag with a noindex value (or other solutions f you have access to server configuration.)</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=2053&amp;1=default&amp;2=en&amp;3=" token="anoQX8HAJIdAj3aCrPQOfz3z3LdlC8m05OhfmVcssaI"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="0" id="comment-2073" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1407334645"></mark> <div> <div class="comment-name">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">ahmed</span> on Wed, 08/06/2014 - 9:17am</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>so what if i submitted both xml sitemap and submitted another sitemap (for videos for example) in robots.txt? are both of them gonna be indexed? or one will override the other? here's exactly my confusion...</p> <p>i actually have my sitemap in the root of my site, and i am in process now for making my content rich by adding videos and implement video SEO for it, so the video seo tool is advising to add 1 line to robots.txt to point to the sitemap that is hosted on their servers for videos, i am not sure what to do now.. i wish if i have separate sitemaps, but not to index them in one file, i want to keep the default way for videos to be added to robots and leave my other sitemap as it is, how could i perform that?</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=2073&amp;1=default&amp;2=en&amp;3=" token="r2kvd3j7AMpbPz1j8Dwqp_6zWChZFGp9j2_bSt8xcqA"></drupal-render-placeholder> </div> </div> </article> </section> <div class="sharethis-wrapper"><span st_url="https://www.digett.com/insights/crawling-vs-indexing-robotstxt-and-sitemapxml" st_title="Crawling vs. Indexing: Robots.txt and sitemap.xml" class="st_facebook_large" displayText="facebook"></span> <span st_url="https://www.digett.com/insights/crawling-vs-indexing-robotstxt-and-sitemapxml" st_title="Crawling vs. Indexing: Robots.txt and sitemap.xml" class="st_linkedin_large" displayText="linkedin"></span> <span st_url="https://www.digett.com/insights/crawling-vs-indexing-robotstxt-and-sitemapxml" st_title="Crawling vs. Indexing: Robots.txt and sitemap.xml" class="st_twitter_large" displayText="twitter"></span> <span st_url="https://www.digett.com/insights/crawling-vs-indexing-robotstxt-and-sitemapxml" st_title="Crawling vs. Indexing: Robots.txt and sitemap.xml" class="st_email_large" displayText="email"></span> </div> Tue, 15 Apr 2014 14:55:05 +0000 JD Collier 1098 at https://www.digett.com Why I Love Pantheon for Drupal Hosting https://www.digett.com/insights/why-i-love-pantheon-drupal-hosting <span>Why I Love Pantheon for Drupal Hosting </span> <div class="field field--name-field-teaser-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/styles/blog_card/public/filefield_images/field_teaser_image/1004449_627382883946367_495381272_n.jpg?itok=M8adcM7v" width="800" height="296" alt="" typeof="foaf:Image" /> </div> <span><span lang="" about="/users/jd-collier" typeof="schema:Person" property="schema:name" datatype="">JD Collier</span></span> <span>Tue, 02/25/2014 - 8:55am</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>We have been using <a href="https://pantheon.io/">Pantheon</a> for several months now and I am ready to declare it a strong winner <em>for us</em>. If you haven't experienced it, Pantheon is a hosting platform that is optimized for Drupal.</p> <!--break--><p>I've used so many hosting platforms — from tiny GoDaddy hosting plans to beefy dedicated servers with Rackspace Cloud Sites and Rackspace Cloud servers in betweeen. I love several things about Pantheon and that is what I wanted to focus on today.</p> <h2>Time-savers</h2> <h3>Dev -&gt; Test -&gt; Live</h3> <p><img align="right" alt="" src="/sites/default/files/dev-test-live-environments.png" />Every site on Pantheon gets a Dev, Test and Live environment.</p> <p>You edit your files and database and then migrate with a click into the Test environment. Then you can migrate to the Live environment.</p> <p>At each stage, you can choose if you want to migrate only files or if you want to also migrate the Drupal database.</p> <p>Of course, I can do this on my own on a server where I have command line and use Drush. It is simple with Drush as well, but it is not quite so point and click easy.</p> <p>The biggest benefit comes from zero time setting up a server. I just fill out a wizard to create the new site and environments and the rest comes with it.</p> <h3>Git version control</h3> <p>Git is baked in...with flexibility to use SFTP as well.</p> <p><img alt="" src="/sites/default/files/git-sftp-combined_0.png" /></p> <p>I can add theme files and modules through Git workflow and quickly add them via SFTP; Pantheon inserts the files into the Git workflow for me. I love this!</p> <p>When I upload a file with SFTP, Pantheon sees it immediately and asks for the commit message to add the files into Git. Then, I can migrate the code from Dev to Production.</p> <h3>Status checks</h3> <p>Pantheon automatically runs a number of status checks on your site. This is much more in-depth than a Drupal Status Report. It reports on Database usage, a few best practices in Drupal setups, caching (Pantheon uses Varnish), modules best practices, Views caching status, and error log warning.</p> <p>The great part about this is the fact that they aren't just warnings. Each warning lists instructions and recommendations on fixes to your site.</p> <p><img alt="" src="/sites/default/files/status-checks.png" /></p> <h3>Backups</h3> <p>Backups are a simple click and they begin daily backups for Drupal, the file system and the database. A click or two — that is all it took.</p> <h2>Drawbacks</h2> <p>I've only run into two issues so far with Pantheon.</p> <p><strong>First</strong>: Their Apache Solr implementation. The way Pantheon has Solr set up, you aren't able to modify the stopwords.txt files and a couple of other Solr settings. I can't imagine this being a large issue for 99% of the sites out there, but I have one where the word "will" is included in the stopwords.txt file that cannot be edited. This website has a lot of information about "Wills" (like after you die, you leave a will). Solr stop words help prevent common words from being searched like "I will" (used as a verb). Pantheon support says they have a solution for this issue coming in a few months.</p> <p><strong>Second</strong>: Pantheon's Varnish implementation is especially aggressive. This makes sites very responsive and that's awesome. On the downside, those outlier scenarios where you need customized data based on a cookie value require a little extra effort. They do have a few ways to <a href="https://pantheon.io/docs/articles/sites/varnish/">bypass cache</a>, but they don't work for all scenarios. I have a site where I had to implement <a href="https://www.drupal.org/project/esi">ESI</a> (Edge Side Includes). ESI seems to be working, but we're still testing.</p> <p><strong>Third</strong>: Price. There is too much of a jump in price between the $25 plan and the next plan at $100/month. If you have a super simple site that happens to need SSL, you have to bump up to the $100 plan and then also pay $30 more for static IP, which can be too much for some clients.</p> <h2>Conclusion</h2> <p>I expect a few issues in any server situation, and I love so many features of Pantheon that the few issues are not show-stoppers.</p> </div> <section> <h2>LEAVE A COMMENT</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=1087&amp;2=comment_no_subject&amp;3=comment_no_subject" token="Td9L3xHB8DsrXDb7_D6WJVp1_HdjQ9KGRhN88MvBV_I"></drupal-render-placeholder> <article data-comment-user-id="0" id="comment-1983" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1393349540"></mark> <div> <div class="comment-name">Submitted by <a rel="nofollow" href="http://www.drupalking.org/digett-why-i-love-pantheon-for-drupal-hosting/" lang="" typeof="schema:Person" property="schema:name" datatype="" content="Digett: Why I Love Pantheon for Drupal Hosting - Drupal King">Digett: Why I …</a> on Tue, 02/25/2014 - 11:32am</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>[...] If you haven&#8217;t experienced it, Pantheon is a hosting platform that is optimized for Drupal.read more drupal, drupal answers, drupal king, drupal modules, drupal stack exchange, drupal supportShare [...]</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=1983&amp;1=default&amp;2=en&amp;3=" token="IYWpQgoe5HalL3rusnfr8s0g9duQK0Vf35a6lAgVnpw"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="0" id="comment-1984" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1393400584"></mark> <div> <div class="comment-name">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Jeff</span> on Wed, 02/26/2014 - 1:43am</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>You can get equivalent service and performance with better limited SSH access and the full power of Aegir staging at a much lower cost from omega8.cc and koumbit.org. Pantheon limits you to one site per account at which point I did a U-turn. For some reason these alternatives don't get as much attention but they're worth a look. An honest comparison: <a href="https://omega8.cc/compare">https://omega8.cc/compare</a></p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=1984&amp;1=default&amp;2=en&amp;3=" token="SKjXz9HyvC6Q2vysKhR3T4mzQoJxBpGf7-PwJaP3Ims"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="0" id="comment-1989" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1393784644"></mark> <div> <div class="comment-name">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Scott</span> on Sun, 03/02/2014 - 12:24pm</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>I have recently switched several sites over to Pantheon also. It is a pretty awesome platform. But like all tech, not without flaws. Several of which are mentioned above. I haven't hosted on Omega8 or Koumbit, but I am very familiar with Aegir and use it to host and develop many sites also. Aegir is also an awesome project, but Aegir and Pantheon work very differently. </p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=1989&amp;1=default&amp;2=en&amp;3=" token="kt-3Ats3Ug6SdpEhv1AtYqA7-23M1I7CMRckdWTLw3Y"></drupal-render-placeholder> </div> </div> </article> </section> <div class="sharethis-wrapper"><span st_url="https://www.digett.com/insights/why-i-love-pantheon-drupal-hosting" st_title="Why I Love Pantheon for Drupal Hosting " class="st_facebook_large" displayText="facebook"></span> <span st_url="https://www.digett.com/insights/why-i-love-pantheon-drupal-hosting" st_title="Why I Love Pantheon for Drupal Hosting " class="st_linkedin_large" displayText="linkedin"></span> <span st_url="https://www.digett.com/insights/why-i-love-pantheon-drupal-hosting" st_title="Why I Love Pantheon for Drupal Hosting " class="st_twitter_large" displayText="twitter"></span> <span st_url="https://www.digett.com/insights/why-i-love-pantheon-drupal-hosting" st_title="Why I Love Pantheon for Drupal Hosting " class="st_email_large" displayText="email"></span> </div> Tue, 25 Feb 2014 14:55:29 +0000 JD Collier 1087 at https://www.digett.com Pairing Static Websites with CMS https://www.digett.com/insights/pairing-static-websites-cms <span>Pairing Static Websites with CMS</span> <div class="field field--name-field-teaser-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/styles/blog_card/public/filefield_images/field_teaser_image/matched_copy.png?itok=ZweiDCcf" width="800" height="561" alt="" typeof="foaf:Image" /> </div> <span><a title="View user profile." href="/about/mark-figart" lang="" about="/about/mark-figart" typeof="schema:Person" property="schema:name" datatype="">Mark Figart</a></span> <span>Thu, 01/16/2014 - 7:00am</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>I’m going out on a limb by saying we may be on the cusp of a revolution as it relates to how we build, deploy and manage websites. That’s a strong claim, but witness the new Reese’s candy of web technologies: Static files combined with the content management system.</p> <!--break--><p>Separately each has a certain charming flavor along with any number of nutritional deficiencies. Together, though, they create a compelling recipe for the future of the web.</p> <h2 id="staticfiles">Static files</h2> <p><a href="https://en.wikipedia.org/wiki/Static_web_page">Static websites</a> are built with HTML, CSS and maybe a few javascript files. The websites are “static” because the web server doesn’t <em>dynamically</em> assemble pages before serving them up to a requesting browser.</p> <p>The files are served up as-is straight from the file system…right from where the webmaster put them after the files were created. There’s no server-side scripting going on, and no database.</p> <p><img alt="" id="fig" src="/sites/default/files/images/static_site_0.png" title="Static Website Diagram" /></p> <p>Static websites avoid two big problems that we might face using some other approach.</p> <p>First, static sites are blazing fast. A web server tasked with serving static sites can run circles around a web server bogged down with executing server-side scripts and making twenty-plus database queries per HTTP request. It’s an all-too-common scenario.</p> <p>Second, static sites typically don’t expose the vulnerabilities that so often come with a site dependent on execution of scripts like PHP and ASP.net and running on the public Internet. Avoiding this complexity, a static website in and of itself offers hackers little in the way of exploitable security vulnerabilities.</p> <h3 id="thedownsideofstatic">The downside of static</h3> <p>Unfortunately, static websites don’t lend themselves to the serious work some might demand of, say, a mission-critical sales and marketing tool.</p> <p>Let’s sum it up this way: Static sites offer no inherent build and management interface. Without providing a way for non-technical resources to manage content, static websites can hardly be taken seriously in some contexts.</p> <h2 id="contentmanagementsystems">Content management systems</h2> <p><a href="https://en.wikipedia.org/wiki/Content_management_system">Content management systems</a> have been around and quite functional now for at least a decade. They are, themselves, sophisticated applications that typically run on a site owner’s web server. They were developed as a means to overcome the shortcomings of the static file approach to building and managing sites, and they represent a huge leap forward.</p> <p>A few benefits that the typical CMS delivers include:</p> <ul> <li>User administration</li> <li>User authentication and authorization</li> <li>Flexible permissions schemes</li> <li>Content modeling</li> <li>Content entry and updating</li> <li>Content query and output</li> <li>URL handling</li> </ul> <p>The list is hardly comprehensive. But even if the CMS did little more than what the list describes, you can imagine the immense value wrapped up in these functions alone.</p> <h3 id="thedownsideofthecms">The downside of the CMS</h3> <p>Despite its value, the CMS comes with its own baggage.</p> <p>Untuned, a CMS can be disappointingly slow. The traditional solution has been to throw more technology on the stack in the form of high-performance caching mechanisms. In essence, these solutions create, you guessed it, a “static” version of the site, and serve pages from it in response to requests.</p> <p>This averts having to go through the more resource intensive process of regenerating responses from from the database upon each request. Practically speaking, however, these caching solutions tend to be complex and expensive.</p> <p> </p> <p><img alt="" id="fig2" src="/sites/default/files/images/cms_site.png" title="Diagram of CMS on Website" /></p> <p>Performance isn’t the only common complaint of CMS users. Popular stacks like Drupal, Wordpress, and Joomla are often attractive targets for hackers.</p> <p>To avoid nasty outcomes site owners often endeavor to keep their CMS current with security patches. It’s an effective, although expensive, proposition.</p> <p>Static websites let us avoid deploying big and complicated applications where every hacker can try to work their tomfoolery.</p> <h2 id="amatchmadeininternetheaven">A match made in Internet heaven</h2> <p>So what if we could assemble an approach to building, deploying and managing websites with all the benefits of static files — including speed and security — with the robust build and management capabilities of a tool like Wordpress or Drupal?</p> <p>To be fair, variations of this approach have been in existence for years. But recently I’ve caught glimpses of what is apparently a resurgence of the idea.</p> <p>The concept is simple: <em>Build</em> a website using a CMS, but rather than deploy the CMS directly on an organization’s public web server, we extract a static representation of the site’s output in the form of a complete file and folder hierarchy. This static version of the site is what gets pushed to the web server.</p> <h2 id="toconclude">To conclude</h2> <p>Call me crazy, but once existing attempts at making this happen mature a little, I believe we will see widespread adoption of the technique. I can’t wait to explore some of the efforts I’ve uncovered thus far.</p> <p>Is it a panacea? Of course not. Fact is, the most common CMS platforms fall short in <a href="/insights/how-cms-fails-marketing">other ways</a> that beg a better mousetrap. But this is movement in the right direction, and Rome wasn’t built in a day.</p> <p><strong>What do <em>you</em> think of the idea of the static website?</strong></p> </div> <section> <h2>LEAVE A COMMENT</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=1074&amp;2=comment_no_subject&amp;3=comment_no_subject" token="ctMJtzy_AozhpomdRXpWMVSRmy8a9sF7vwKfnRznJZ8"></drupal-render-placeholder> <article data-comment-user-id="0" id="comment-1950" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1389889193"></mark> <div> <div class="comment-name">Submitted by <a rel="nofollow" href="http://www.drupalking.org/digett-pairing-static-websites-with-cms/" lang="" typeof="schema:Person" property="schema:name" datatype="" content="Digett: Pairing Static Websites with CMS - Drupal King">Digett: Pairin…</a> on Thu, 01/16/2014 - 10:19am</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>[...] read more [...]</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=1950&amp;1=default&amp;2=en&amp;3=" token="5ehXnMxUNGvWN4Bn74_B4otOvURqWWgf9z3y8z5FELs"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="0" id="comment-1951" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1389889691"></mark> <div> <div class="comment-name">Submitted by <a rel="nofollow" href="http://openworld.cjac.biz/blog/server-software/digett-pairing-static-websites-with-cms/" lang="" typeof="schema:Person" property="schema:name" datatype="" content="Digett: Pairing Static Websites with CMS &amp;amp;#124; Open Wor">Digett: Pairin…</a> on Thu, 01/16/2014 - 10:28am</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>[...] read more [...]</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=1951&amp;1=default&amp;2=en&amp;3=" token="DVaYdZzux5zyYDKVggoEAoSxa8hKtk8q0kjOLp883jc"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="0" id="comment-1953" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1389893629"></mark> <div> <div class="comment-name">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Nir</span> on Thu, 01/16/2014 - 11:33am</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>We at Gizra are working on doing just that - pairing Drupal with static sites: <a href="http://www.gizra.com/content/drupal-x5-faster/">http://www.gizra.com/content/drupal-x5-faster/</a></p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=1953&amp;1=default&amp;2=en&amp;3=" token="-9mYt3LbGIDOEu2xdFmkibG5iH5jDEyxDuSVQrIzFBE"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="7" id="comment-1954" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1389894360"></mark> <div> <div class="comment-name">Submitted by <a title="View user profile." href="/about/mark-figart" lang="" about="/about/mark-figart" typeof="schema:Person" property="schema:name" datatype="">Mark Figart</a> on Thu, 01/16/2014 - 11:46am</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>@Nir Yes, I saw this just within the past couple of weeks, and it was the primary catalyst leading me to write this post! I didn't mention it in this article only because I wanted to first have an opportunity to get my hands on it and understand how far along you guys are. I'm super excited to explore it, and hope you won't mind me reaching out to you for help or some comments before I write about it. </p> <p>Thanks for reading and commenting!</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=1954&amp;1=default&amp;2=en&amp;3=" token="suc7eQiyQxObbGxEUy9aqZ1GqyUFArPp0UcAxvLHAdY"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="0" id="comment-1955" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1389895130"></mark> <div> <div class="comment-name">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Nir</span> on Thu, 01/16/2014 - 11:58am</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>Sure thing, we'd be happy to help you get acquainted with Zariz when you get some time. </p> <p>Meanwhile, a video of Amitai discussing it with jam went up today, if you're interested: <a href="http://www.gizra.com/content/zariz-on-tv/">http://www.gizra.com/content/zariz-on-tv/</a></p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=1955&amp;1=default&amp;2=en&amp;3=" token="5zNbgh4v1FD96CgqB_Wr5jDzLk0ntR31Wwa3WESY9_o"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="0" id="comment-1956" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1389908337"></mark> <div> <div class="comment-name">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">mikeytown2</span> on Thu, 01/16/2014 - 3:38pm</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>Old school way of doing this is to use the boost module. <a href="https://drupal.org/project/boost">https://drupal.org/project/boost</a></p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=1956&amp;1=default&amp;2=en&amp;3=" token="yeoCftIE3ZBIu-wJtG8rnRfYeltLuNAK2I26hiSGc1U"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="7" id="comment-1957" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1389910069"></mark> <div> <div class="comment-name">Submitted by <a title="View user profile." href="/about/mark-figart" lang="" about="/about/mark-figart" typeof="schema:Person" property="schema:name" datatype="">Mark Figart</a> on Thu, 01/16/2014 - 4:07pm</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>@Nir, the video is great. I plan on recommending to others in the office. Thanks for sharing.</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=1957&amp;1=default&amp;2=en&amp;3=" token="qa7iXnbyyPdmtgs5e1IZHeBWob054_D2F3w62hZa35Q"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="7" id="comment-1958" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1389910907"></mark> <div> <div class="comment-name">Submitted by <a title="View user profile." href="/about/mark-figart" lang="" about="/about/mark-figart" typeof="schema:Person" property="schema:name" datatype="">Mark Figart</a> on Thu, 01/16/2014 - 4:21pm</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>@mikeytown2 Thanks... have heard this now from a couple sources. While it doesn't address *everything* that some other solutions might, I'd still like to try it out for myself.</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=1958&amp;1=default&amp;2=en&amp;3=" token="rfe0uxXDpd8_o5CHaAQE8FlHL6FQ8R9_41wGiqYOcCY"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="0" id="comment-1959" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1389918028"></mark> <div> <div class="comment-name">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Gijs</span> on Thu, 01/16/2014 - 6:20pm</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>Funny to read this. Was my idea as well. I had a Drupal website but then realized it was doing lots of db dynamics to serve not-user-specific pages.</p> <p>I now have a custom backend which produces new json files every 15 minutes (yes, its a very dynamic website !) and then use grunt / handlebars to produce new 'static' html files.</p> <p>I think most websites not having user-specific content would be much faster (on cheaper hosting) with a solution like this. Instead of doing lots of calculations for every request (and putting a lot of effort in optimizing that), the calculations are done just once in a while. No expensive hardware needed.</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=1959&amp;1=default&amp;2=en&amp;3=" token="DliMT_wOHpwhUJ48XWtCTg9y5qBlPHxr9uW6W6vfS0M"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="7" id="comment-1961" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1389976823"></mark> <div> <div class="comment-name">Submitted by <a title="View user profile." href="/about/mark-figart" lang="" about="/about/mark-figart" typeof="schema:Person" property="schema:name" datatype="">Mark Figart</a> on Fri, 01/17/2014 - 10:40am</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>@Gijs Thanks for taking the time to read and respond. Not surprising that great minds think alike. :-)</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=1961&amp;1=default&amp;2=en&amp;3=" token="8epAmZfWv65mXIW8oRKK4KZK60UDKQKSMYvPUI3j9yY"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="0" id="comment-1962" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1389993142"></mark> <div> <div class="comment-name">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">John_B</span> on Fri, 01/17/2014 - 3:12pm</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>I agree this looks like the trend. However I cannot see how pushing a CMS site into static pages improves on using Boost, or a public-facing Varnish server, with a fresh cache (e.g. refreshed by crawling? An automatically rebuilt static site is in effect pushing static pages; a public-facing 'Boosted' or Varnish server in effect pulls them off the CMS backend. How is pushing static pages better than pulling them with Boost or Varnish?</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=1962&amp;1=default&amp;2=en&amp;3=" token="54mvgc6g0IvgTUn8gVW8CjN59w6ThlCvktYeDJpZc5o"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="7" id="comment-1964" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1389994600"></mark> <div> <div class="comment-name">Submitted by <a title="View user profile." href="/about/mark-figart" lang="" about="/about/mark-figart" typeof="schema:Person" property="schema:name" datatype="">Mark Figart</a> on Fri, 01/17/2014 - 3:36pm</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>@john_b So "better" is subjective, right? As someone supporting a good number of sites, the advantages from my perspective include (1) getting Drupal and its vulnerabilities off of the public web server and (2) eliminating the use of yet another technology (or module, at the very least). Simpler tools mean lower costs. But I wouldn't say "better", as my evaluation criteria won't necessarily be the same as yours. To make one other point, I LOVE Drupal... and have loved it for years. It's an awesome tool, and stands above many if not most of its peers. But it's power does not come without a few strings attached... as with any other piece of software.</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=1964&amp;1=default&amp;2=en&amp;3=" token="qOn3QMnka8qUIDi4XRGuJ2UbMmbITgAEK38j4y9r0_c"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="0" id="comment-1966" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1390192706"></mark> <div> <div class="comment-name">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Brice</span> on Sun, 01/19/2014 - 10:38pm</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>Mark,</p> <p>I think this is a great idea. I have been advocating for the use of semi-static content for a while. The first time I toyed with this idea and even used it to some extent was back in 1999 at an online retailer that we both know well! It is merely a form of long-standing cache.</p> <p>Synchronization can still cause issues, and the fact that we are introducing another layer of indirection. We also have to realize that 'some' content needs to remain dynamic. For instance, we allow our clients to specify some sidebar ads targeting different pages (ie: the ski pass discount ad goes on the recreation/activity pages, and the bed and breakfast ad goes on the vacation planner page). This can be handled in a couple of different ways... Donut caching/partial page caching using a longer duration cached or static component and server side logic (yuck) or javascript (yes we use it quite a bit with the concept of a 'base page' that is rendered immediately without javascript with all the trimmings filled in later).</p> <p>We sort of talked about the problems we have building CMS-backed sites that these approaches can solve a while back. Our custom 'mid tier' runs on Lucene and is a very fast cache, but not completely static. </p> <p>Have you experimented with static content very much? </p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=1966&amp;1=default&amp;2=en&amp;3=" token="u5SoLOoTnlUYEuYxSFi5IbHoh3XdSQgtIJUL6nnNmig"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="7" id="comment-1967" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1390228866"></mark> <div> <div class="comment-name">Submitted by <a title="View user profile." href="/about/mark-figart" lang="" about="/about/mark-figart" typeof="schema:Person" property="schema:name" datatype="">Mark Figart</a> on Mon, 01/20/2014 - 8:41am</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>Brice, you're right, I remember now talking about the stuff you had been working on, and this necessitates further conversation! No, I really haven't toyed with static approaches much, and erected a new blog recently (<a href="http://figart.github.io">http://figart.github.io</a>) to play with one of the more common approaches, Jekyll. Let's talk soon!</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=1967&amp;1=default&amp;2=en&amp;3=" token="OY4t_VsAWjv2-7KQ0muCQQWqNpa0geY3YJjsaq0d84g"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="0" id="comment-2012" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1398869309"></mark> <div> <div class="comment-name">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Mathieu Bolla</span> on Wed, 04/30/2014 - 9:48am</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>Hi,</p> <p>I definitely thinks that is the solution.</p> <p>But here is my story about it:</p> <p>I've worked for months building a solution that is able to host static websites easily, safely, and that is real fast.</p> <p>But, when I first tried to sell it to web agencies, the answer was "That sounds good, but how the hell do I explain my clients they have no online admin interface?"</p> <p>I then added a simple, made-in-one-day feature: The solution may now take files from the storage, or delegate to a URL. You can then benefit from all my pretty speed optimization tools (cache headers, caches, image profile striper, auto gzip...) And you can back your static website with a CMS, just playing some DNS tricks.</p> <p>And it rocked. Apart one thing: CMS usually tend to use absolute URLs with hostname, and the likes, wherever they want. Time for a search-and-replace tool.</p> <p>Now, I think I've come to a nice solution. But it has now grown with complexity, from what seemed a super simple fast-cloud-content-hosting-solution.</p> <p>What do you think about my way to this cruel end? Would you like to try it and give me some feedback? Here it is: <a href="http://www.staticms.com">http://www.staticms.com</a> (sorry, most of the content is in French, but I'm translating as fast as I can... First error was maybe to target French web agencies...)</p> <p>Mathieu, founder of StatiCMS.com</p> <p>PS: Here is a blog post of mine (in French, again...) on how you may use my solution to hide a wordpress install behind my solution to be "20h proof" (able to withstand nation wide TV news coverage... with your URL center, bold)<br /> PPS: Sorry for below average English, I'm no native speaker</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=2012&amp;1=default&amp;2=en&amp;3=" token="iarAFGg9oadbiVIVPYs5I6MWjsEHEQr3vEeA8r1YcAY"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="7" id="comment-2014" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1398869923"></mark> <div> <div class="comment-name">Submitted by <a title="View user profile." href="/about/mark-figart" lang="" about="/about/mark-figart" typeof="schema:Person" property="schema:name" datatype="">Mark Figart</a> on Wed, 04/30/2014 - 9:58am</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>@Mathieu, pas de problème. Je vais jeter un oeil at ta solution. Merci d'avoir visité notre website!</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=2014&amp;1=default&amp;2=en&amp;3=" token="1QKY7zmZJddVfODV5QYdHo4XmXo8a9FSRNPtzmTl6v4"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="0" id="comment-2015" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1398870596"></mark> <div> <div class="comment-name">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">Mathieu Bolla</span> on Wed, 04/30/2014 - 10:09am</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>You've got my email, should you need some demo account for testing purposes...</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=2015&amp;1=default&amp;2=en&amp;3=" token="DrA4ue6__2lZPvdA8W2kmqjU51GfvYIAzd3ZlaiXE5A"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="0" id="comment-2078" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1408888601"></mark> <div> <div class="comment-name">Submitted by <span lang="" typeof="schema:Person" property="schema:name" datatype="">nick</span> on Sun, 08/24/2014 - 8:56am</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>Would just like to add that many Information Security companies are now doing this (mine included). Some have even completely ditched the hybrid model opting for a full static build. Downside is you need a developer that is familiar with managing various Dev/Stage/Prod environments with CLI experience. </p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=2078&amp;1=default&amp;2=en&amp;3=" token="pCv6HvhrVA9-eN-NKk_ytsLobLoe_iE6ueAO3vEzKX0"></drupal-render-placeholder> </div> </div> </article> <article data-comment-user-id="10" id="comment-2080" class="js-comment comment-container"> <mark class="hidden" data-comment-timestamp="1408974726"></mark> <div> <div class="comment-name">Submitted by <span lang="" about="/users/amy-peveto" typeof="schema:Person" property="schema:name" datatype="">Amy Peveto</span> on Mon, 08/25/2014 - 8:52am</div> <div class="comment-body"> <div class="field field--name-comment-body field--type-text-long field--label-hidden field__item"><p>There's always a down side, right?</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=2080&amp;1=default&amp;2=en&amp;3=" token="QAWyWMBSnvaMS2YnDUR5yjINtVwR3NDgy3Tj9-gZcb8"></drupal-render-placeholder> </div> </div> </article> </section> <div class="sharethis-wrapper"><span st_url="https://www.digett.com/insights/pairing-static-websites-cms" st_title="Pairing Static Websites with CMS" class="st_facebook_large" displayText="facebook"></span> <span st_url="https://www.digett.com/insights/pairing-static-websites-cms" st_title="Pairing Static Websites with CMS" class="st_linkedin_large" displayText="linkedin"></span> <span st_url="https://www.digett.com/insights/pairing-static-websites-cms" st_title="Pairing Static Websites with CMS" class="st_twitter_large" displayText="twitter"></span> <span st_url="https://www.digett.com/insights/pairing-static-websites-cms" st_title="Pairing Static Websites with CMS" class="st_email_large" displayText="email"></span> </div> Thu, 16 Jan 2014 13:00:00 +0000 Mark Figart 1074 at https://www.digett.com Scripts of a Drupal Newbie – A Love Letter to Views https://www.digett.com/insights/scripts-drupal-newbie-%E2%80%93-love-letter-views <span>Scripts of a Drupal Newbie – A Love Letter to Views</span> <div class="field field--name-field-teaser-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/styles/blog_card/public/filefield_images/field_teaser_image/drupal-views-limitless.jpg?itok=OJvliqLt" width="275" height="183" alt="" typeof="foaf:Image" /> </div> <span><span lang="" about="/users/oliver-yin" typeof="schema:Person" property="schema:name" datatype="">Oliver Yin</span></span> <span>Wed, 09/25/2013 - 8:50am</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Drupal is definitely not something you can master or even comprehend in a few weeks, or even a few months. All the little details start to take their toll after a while. But my personal savior and motivator as a Drupal newbie came in an immensely useful package that most Drupal developers might recognize.</p> <!--break--><h2>An eloquent comparison for Views</h2> <p>Most people enjoy using the television, or at least enjoy watching the entertaining shows that pop up every now and again. Yet, turning on the television nowadays requires having to fiddle with unresponsive touch glass that decides to work if your fingers are just dry enough, or pushing a button behind the television in that indentation in the wall…</p> <p>…or, you could just use the television remote and save yourself all that hassle.</p> <h2>What are Views…</h2> <p>That ineloquent metaphor for my discovery of the Views module describes how I felt when I realized that instead of fighting against Drupal to get custom functionality through a series of SQL queries and a useful interface, I could create structures and formats similar to those that I planned out in HTML/PHP. To say the least, Views rekindled a lot of my lost interest in using Drupal through the sheer possibilities and power that Views provides (to the point where it is included in Drupal 8 core!).</p> <h2>… and why I like Views</h2> <p>The Views module is essentially a customizable data presentation layer on top of Drupal that allows for flexible presentation of content in a lot of ways that would require individual modules, hacks, or additional code to maintain otherwise.</p> <p>When I first started using Views, I thought it was just an entertaining and useful way to make data appear the way I wanted it to. But I soon found myself examining all the different presentation types that Views can generate, ranging from simple article presenters to interactive slideshows. To say the least, I’m somewhat intimidated by the scope of what Views is capable of. But in all honesty, what in Drupal isn’t very intimidating at first glance?</p> <p>Oh well. It’s going to be my pleasure learning how this wonderful interface works. Needless to say, I’m more than happy to continue pursuing Drupal. Especially if little joys like this are in store for me.</p> <h3>Related Links</h3> <ul> <li><a href="/insights/digett-s-favorite-drupal-7-contrib-modules">Digett's Favorite Drupal 7 Contrib Modules</a></li> <li><a href="/insights/how-i-build-drupal-sites-fresh-year-audit">How I Build Drupal Sites: A Fresh-Year Audit</a></li> </ul> <p><em>[Image: <a href="https://commons.wikimedia.org/wiki/File:Remote_Control,_Television_-_TV-controller.jpg">espensorvik</a>]</em></p> </div> <section> <h2>LEAVE A COMMENT</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=1040&amp;2=comment_no_subject&amp;3=comment_no_subject" token="VCz4VGIbMXYMr5LBUlKpwcrIwOnMn3nyT39wGfHTPn8"></drupal-render-placeholder> </section> <div class="sharethis-wrapper"><span st_url="https://www.digett.com/insights/scripts-drupal-newbie-%E2%80%93-love-letter-views" st_title="Scripts of a Drupal Newbie – A Love Letter to Views" class="st_facebook_large" displayText="facebook"></span> <span st_url="https://www.digett.com/insights/scripts-drupal-newbie-%E2%80%93-love-letter-views" st_title="Scripts of a Drupal Newbie – A Love Letter to Views" class="st_linkedin_large" displayText="linkedin"></span> <span st_url="https://www.digett.com/insights/scripts-drupal-newbie-%E2%80%93-love-letter-views" st_title="Scripts of a Drupal Newbie – A Love Letter to Views" class="st_twitter_large" displayText="twitter"></span> <span st_url="https://www.digett.com/insights/scripts-drupal-newbie-%E2%80%93-love-letter-views" st_title="Scripts of a Drupal Newbie – A Love Letter to Views" class="st_email_large" displayText="email"></span> </div> Wed, 25 Sep 2013 13:50:31 +0000 Oliver Yin 1040 at https://www.digett.com