<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:og="http://ogp.me/ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:schema="http://schema.org/" xmlns:sioc="http://rdfs.org/sioc/ns#" xmlns:sioct="http://rdfs.org/sioc/types#" xmlns:skos="http://www.w3.org/2004/02/skos/core#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" version="2.0" xml:base="http://badzilla.co.uk/">
  <channel>
    <title>JavaScript</title>
    <link>http://badzilla.co.uk/</link>
    <description/>
    <language>en</language>
    
    <item>
  <title>Drupal 8 as a Static Site: Drupal 8 Contact Form Thank You Page</title>
  <link>http://badzilla.co.uk/drupal-8-static-site-drupal-8-contact-form-thank-you-page</link>
  <description>
&lt;span&gt;Drupal 8 as a Static Site: Drupal 8 Contact Form Thank You Page&lt;/span&gt;

&lt;span&gt;&lt;span lang="" about="http://badzilla.co.uk/user/1" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;nigel&lt;/span&gt;&lt;/span&gt;

&lt;span&gt;Sat, 04/05/2019 - 14:50&lt;/span&gt;

      &lt;div class="field field--name-field-heading-image-text field--type-entity-reference-revisions field--label-hidden field--items"&gt;
              &lt;div class="field--item"&gt;  &lt;div class="paragraph paragraph--type--blog-heading-picture-text paragraph--view-mode--default"&gt;
          
            &lt;div class="field field--name-field-heading field--type-string field--label-hidden field--item"&gt;Architecture&lt;/div&gt;
      
            &lt;div class="field field--name-field-blog-text field--type-text-long field--label-hidden field--item"&gt;&lt;p&gt;Our previous two tutorials on the Drupal 8 as a static site covered the Contact Form and the journey through the action to AWS Lambda to process the form and send an email. Now the final part of the contact form journey - returning back to the static site and showing a Thank You page. &lt;/p&gt;

&lt;p&gt;In fact in this tutorial the Thank You path will actually be the same path with the contact form on it - so we return to the starting point, but we want to show a message back to the user to thank them for filling out the form. The notification back to the user will have to be JavaScript obviously since we have no backend language functionality.&lt;/p&gt;

&lt;p&gt;If you remember the redirect back to the static site from AWS uses a HTTP code of 307. This code matches in the incoming HTTP request with the redirect. So since in our case the form was POSTed, then the redirect will also be POSTed back to the static site. This is both a blessing and a curse as we'll see. &lt;/p&gt;

&lt;p&gt;Common wisdom says that JavaScript can neither detect whether an incoming request is POSTed or GETed, nor retrieve any of the POSTed data. That is theoretically true, but there are always workarounds of course :) :) &lt;/p&gt;&lt;/div&gt;
      
      &lt;/div&gt;
&lt;/div&gt;
              &lt;div class="field--item"&gt;  &lt;div class="paragraph paragraph--type--blog-heading-picture-text paragraph--view-mode--default"&gt;
          
            &lt;div class="field field--name-field-heading field--type-string field--label-hidden field--item"&gt;Adding the JavaScript&lt;/div&gt;
      
            &lt;div class="field field--name-field-blog-text field--type-text-long field--label-hidden field--item"&gt;This is very similar to our earlier tutorial on how to add the Elasticsearch JavaScript client. So I won't dwell too much on this. Firstly we need to extend our template_preprocess_page function to add our thank-you JS library. This is the second section of code below, underneath the elasticsearch part&lt;br /&gt;&lt;br /&gt;
&lt;strong&gt;{themename}.theme&lt;/strong&gt; - in my case the custom theme is called beezee8. 
&lt;div class="codeblock geshifilter"&gt;&lt;code&gt;&lt;span style="color: #000000"&gt;&lt;span style="color: #0000BB"&gt;&lt;?php&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #007700"&gt;function &lt;/span&gt;&lt;span style="color: #0000BB"&gt;beezee8_preprocess_page&lt;/span&gt;&lt;span style="color: #007700"&gt;(&amp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$variables&lt;/span&gt;&lt;span style="color: #007700"&gt;) {&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #FF8000"&gt;// If we are on the search page, load the JS search client api&lt;br /&gt;    // and our implementation to Elasticsearch&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #007700"&gt;if (\&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Drupal&lt;/span&gt;&lt;span style="color: #007700"&gt;::&lt;/span&gt;&lt;span style="color: #0000BB"&gt;routeMatch&lt;/span&gt;&lt;span style="color: #007700"&gt;()-&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;getRouteName&lt;/span&gt;&lt;span style="color: #007700"&gt;() == &lt;/span&gt;&lt;span style="color: #DD0000"&gt;'search.view_node_search'&lt;/span&gt;&lt;span style="color: #007700"&gt;) {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000BB"&gt;$variables&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'#attached'&lt;/span&gt;&lt;span style="color: #007700"&gt;][&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'library'&lt;/span&gt;&lt;span style="color: #007700"&gt;][] = &lt;/span&gt;&lt;span style="color: #DD0000"&gt;'beezee8/elastic-library'&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #FF8000"&gt;// If we are on the contact form page, load the JS to show thank you message&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #007700"&gt;if (\&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Drupal&lt;/span&gt;&lt;span style="color: #007700"&gt;::&lt;/span&gt;&lt;span style="color: #0000BB"&gt;request&lt;/span&gt;&lt;span style="color: #007700"&gt;()-&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;getRequestUri&lt;/span&gt;&lt;span style="color: #007700"&gt;() == &lt;/span&gt;&lt;span style="color: #DD0000"&gt;'/about'&lt;/span&gt;&lt;span style="color: #007700"&gt;) {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000BB"&gt;$variables&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'#attached'&lt;/span&gt;&lt;span style="color: #007700"&gt;][&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'library'&lt;/span&gt;&lt;span style="color: #007700"&gt;][] = &lt;/span&gt;&lt;span style="color: #DD0000"&gt;'beezee8/thank-you-library'&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
In the code above I get the current path alias and should that equal the '/about' page then I inject my JS library which is defined below.&lt;/div&gt;
      
      &lt;/div&gt;
&lt;/div&gt;
              &lt;div class="field--item"&gt;  &lt;div class="paragraph paragraph--type--blog-heading-picture-text paragraph--view-mode--default"&gt;
          
            &lt;div class="field field--name-field-heading field--type-string field--label-hidden field--item"&gt;Libraries file&lt;/div&gt;
      
            &lt;div class="field field--name-field-blog-text field--type-text-long field--label-hidden field--item"&gt;The libraries file now needs a further entry for our thank you JS. Again we already created an entry for elasticsearch so I am not going to go over this in too much detail. &lt;br /&gt;&lt;br /&gt;
&lt;strong&gt;{themename}.libraries.yml&lt;/strong&gt;
&lt;div class="geshifilter"&gt;&lt;div class="bash geshifilter-bash" style="font-family:monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal"&gt;global-styling:
  css:
    theme:
      css&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;style.css: &lt;span style="color: #7a0874; font-weight: bold;"&gt;{&lt;/span&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;}&lt;/span&gt;
elastic-library:
  js:
    js&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;elasticsearch-js&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;elasticsearch.min.js: &lt;span style="color: #7a0874; font-weight: bold;"&gt;{&lt;/span&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;}&lt;/span&gt;
    js&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;beezee&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;beezee_elastic.js: &lt;span style="color: #7a0874; font-weight: bold;"&gt;{&lt;/span&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;}&lt;/span&gt;
thank-you-library:
  js:
    js&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;beezee&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;beezee_thankyou.js: &lt;span style="color: #7a0874; font-weight: bold;"&gt;{&lt;/span&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
      
      &lt;/div&gt;
&lt;/div&gt;
              &lt;div class="field--item"&gt;  &lt;div class="paragraph paragraph--type--blog-heading-picture-text paragraph--view-mode--default"&gt;
          
            &lt;div class="field field--name-field-heading field--type-string field--label-hidden field--item"&gt;JavaScript Thank You&lt;/div&gt;
      
            &lt;div class="field field--name-field-blog-text field--type-text-long field--label-hidden field--item"&gt;Now here's the JavaScript. I did say that there is no way of knowing whether the HTTP request is GET or POST - well true, but we can deduce it. If we interrogate the referrer and it equals the current URL then we can make the assumption that the form has been POSTed, completed its round trip to AWS Lambda and back with a 307 code, and therefore we should show the thank you message. If you have a look at my code below you will see the conditional, and you will see the markup I inject into the page - it's classic Drupal 8 Bootstrap since that's how my theme is built. Your mileage here will obviously vary dependent upon your own theme.&lt;br /&gt;&lt;br /&gt;
&lt;strong&gt;{themename}_thankyou.js&lt;/strong&gt;
&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family:monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;$&lt;span style="color: #339933;"&gt;,&lt;/span&gt; Drupal&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
 
    &lt;span style="color: #000066; font-weight: bold;"&gt;var&lt;/span&gt; thank_once&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
 
    &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; BeezeeThankyou&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
        &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #339933;"&gt;!&lt;/span&gt;thank_once&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
            thank_once &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
 
            &lt;span style="color: #006600; font-style: italic;"&gt;// If we are arriving here from lambda which passes on the referrer from here&lt;/span&gt;
            &lt;span style="color: #006600; font-style: italic;"&gt;// then the form has been POSTed so show the thank you page&lt;/span&gt;
            &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;document.&lt;span style="color: #660066;"&gt;referrer&lt;/span&gt; &lt;span style="color: #339933;"&gt;==&lt;/span&gt; document.&lt;span style="color: #660066;"&gt;URL&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
 
                &lt;span style="color: #006600; font-style: italic;"&gt;// Markup to add the thankyou message&lt;/span&gt;
                &lt;span style="color: #000066; font-weight: bold;"&gt;var&lt;/span&gt; thanks &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #009900;"&gt;[&lt;/span&gt;
                    &lt;span style="color: #3366CC;"&gt;'&lt;div class="alert alert-success alert-dismissible" role="alert"&gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
                    &lt;span style="color: #3366CC;"&gt;'&lt;button role="button" class="close" data-dismiss="alert" aria-label="Close"&gt;&lt;span aria-hidden="true"&gt;×&lt;/span&gt;&lt;/button&gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
                    &lt;span style="color: #3366CC;"&gt;'&lt;h4 class="sr-only"&gt;Status message&lt;/h4&gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
                    &lt;span style="color: #3366CC;"&gt;'Thank you for contacting me. I will be in touch.'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
                    &lt;span style="color: #3366CC;"&gt;'&lt;/div&gt;'&lt;/span&gt;
                &lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
 
                &lt;span style="color: #006600; font-style: italic;"&gt;// Inject the markup&lt;/span&gt;
                $&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'.region-highlighted'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;append&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;thanks.&lt;span style="color: #660066;"&gt;join&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;''&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
            &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
 
    Drupal.&lt;span style="color: #660066;"&gt;behaviors&lt;/span&gt;.&lt;span style="color: #660066;"&gt;beezee_thankyou&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
        attach&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;context&lt;span style="color: #339933;"&gt;,&lt;/span&gt; settings&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
            BeezeeThankyou&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;jQuery&lt;span style="color: #339933;"&gt;,&lt;/span&gt; Drupal&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
      
      &lt;/div&gt;
&lt;/div&gt;
              &lt;div class="field--item"&gt;  &lt;div class="paragraph paragraph--type--blog-heading-picture-text paragraph--view-mode--default"&gt;
          
            &lt;div class="field field--name-field-heading field--type-string field--label-hidden field--item"&gt;nginx Server Configuration&lt;/div&gt;
      
      &lt;div class="field field--name-field-blog-image field--type-image field--label-hidden field--items"&gt;
              &lt;div class="field--item"&gt;    &lt;img srcset="https://assets.badzilla.co.uk/s3fs-public/styles/max_325x325/public/2019-05/Screenshot%202019-05-04%20at%2014.20.54.png?itok=6tpIS5Ha 325w, https://assets.badzilla.co.uk/s3fs-public/styles/max_650x650/public/2019-05/Screenshot%202019-05-04%20at%2014.20.54.png?itok=ob3PdIWy 650w, https://assets.badzilla.co.uk/s3fs-public/styles/max_1300x1300/public/2019-05/Screenshot%202019-05-04%20at%2014.20.54.png?itok=HXKYNHSr 1232w" sizes="(min-width: 1290px) 1290px, 100vw" src="https://assets.badzilla.co.uk/s3fs-public/styles/max_325x325/public/2019-05/Screenshot%202019-05-04%20at%2014.20.54.png?itok=6tpIS5Ha" alt="nginx error" typeof="foaf:Image" class="img-responsive" /&gt;


&lt;/div&gt;
          &lt;/div&gt;
  
            &lt;div class="field field--name-field-blog-text field--type-text-long field--label-hidden field--item"&gt;If we try our form now (or at least if I do since I'm using nginx) - we will get an nginx &lt;strong&gt;405 Not Allowed&lt;/strong&gt; error. Remember I said the POST could be a blessing and a curse? The error is because by default nginx will not allow a POST to a static page. Thankfully there is a workaround. Locate the server configuration for your particular virtual host, and edit it by adding the following line into the &lt;strong&gt;server&lt;/strong&gt; section. &lt;br /&gt;&lt;br /&gt;
&lt;strong&gt;{VM name}.conf&lt;/strong&gt;
&lt;div class="geshifilter"&gt;&lt;div class="bash geshifilter-bash" style="font-family:monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal"&gt;server &lt;span style="color: #7a0874; font-weight: bold;"&gt;{&lt;/span&gt;
.
.
.
      error_page  &lt;span style="color: #000000;"&gt;405&lt;/span&gt;     =&lt;span style="color: #000000;"&gt;200&lt;/span&gt; &lt;span style="color: #007800;"&gt;$uri&lt;/span&gt;;
.
.&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
      
      &lt;/div&gt;
&lt;/div&gt;
              &lt;div class="field--item"&gt;  &lt;div class="paragraph paragraph--type--blog-heading-picture-text paragraph--view-mode--default"&gt;
          
            &lt;div class="field field--name-field-heading field--type-string field--label-hidden field--item"&gt;Form submission&lt;/div&gt;
      
      &lt;div class="field field--name-field-blog-image field--type-image field--label-hidden field--items"&gt;
              &lt;div class="field--item"&gt;    &lt;img srcset="https://assets.badzilla.co.uk/s3fs-public/styles/max_325x325/public/2019-05/Screenshot%202019-05-04%20at%2015.36.57.png?itok=0_8Bbaz8 325w, https://assets.badzilla.co.uk/s3fs-public/styles/max_650x650/public/2019-05/Screenshot%202019-05-04%20at%2015.36.57.png?itok=k1HGEgk5 650w, https://assets.badzilla.co.uk/s3fs-public/styles/max_1300x1300/public/2019-05/Screenshot%202019-05-04%20at%2015.36.57.png?itok=InG6NxCW 1300w, https://assets.badzilla.co.uk/s3fs-public/styles/max_2600x2600/public/2019-05/Screenshot%202019-05-04%20at%2015.36.57.png?itok=xNGfoh3u 2518w" sizes="(min-width: 1290px) 1290px, 100vw" src="https://assets.badzilla.co.uk/s3fs-public/styles/max_325x325/public/2019-05/Screenshot%202019-05-04%20at%2015.36.57.png?itok=0_8Bbaz8" alt="form submission" typeof="foaf:Image" class="img-responsive" /&gt;


&lt;/div&gt;
          &lt;/div&gt;
  
            &lt;div class="field field--name-field-blog-text field--type-text-long field--label-hidden field--item"&gt;&lt;p&gt;Ok we should now be good to go. Submit the form and it should do the round trip from static site to AWS Lambda back to static site and an email arriving in your inbox! &lt;/p&gt;&lt;/div&gt;
      
      &lt;/div&gt;
&lt;/div&gt;
              &lt;div class="field--item"&gt;  &lt;div class="paragraph paragraph--type--blog-heading-picture-text paragraph--view-mode--default"&gt;
          
            &lt;div class="field field--name-field-heading field--type-string field--label-hidden field--item"&gt;An even better solution? &lt;/div&gt;
      
      &lt;div class="field field--name-field-blog-image field--type-image field--label-hidden field--items"&gt;
              &lt;div class="field--item"&gt;    &lt;img srcset="https://assets.badzilla.co.uk/s3fs-public/styles/max_325x325/public/2019-05/Screenshot%202019-05-04%20at%2012.22.24.png?itok=gRLJM0fM 325w, https://assets.badzilla.co.uk/s3fs-public/styles/max_650x650/public/2019-05/Screenshot%202019-05-04%20at%2012.22.24.png?itok=ZCyJqk5L 650w, https://assets.badzilla.co.uk/s3fs-public/styles/max_1300x1300/public/2019-05/Screenshot%202019-05-04%20at%2012.22.24.png?itok=iJlZV3ZA 1300w, https://assets.badzilla.co.uk/s3fs-public/styles/max_2600x2600/public/2019-05/Screenshot%202019-05-04%20at%2012.22.24.png?itok=U51-2amo 2494w" sizes="(min-width: 1290px) 1290px, 100vw" src="https://assets.badzilla.co.uk/s3fs-public/styles/max_325x325/public/2019-05/Screenshot%202019-05-04%20at%2012.22.24.png?itok=gRLJM0fM" alt="alternative solution" typeof="foaf:Image" class="img-responsive" /&gt;


&lt;/div&gt;
          &lt;/div&gt;
  
            &lt;div class="field field--name-field-blog-text field--type-text-long field--label-hidden field--item"&gt;&lt;p&gt;If you look carefully above you will see a placeholder in the thank you message. So am I saying it is possible to retrieve the POSTed data and insert the name into the placeholder? Sort of. There is a JS library called &lt;a href="https://github.com/ssut/jQuery-PostCapture"&gt;jQuery-PostCapture&lt;/a&gt; which can achieve this. It works by capturing the POSTed data when the form is initially submitted. This copy of the data is stored either as a cookie or in the browser's local storage. Once the trip to AWS Lambda is completed, this data can be fetched from the cookie or local storage - so the data isn't fetched from the actual POST itself. &lt;/p&gt;

&lt;p&gt;The problem I've got with this is neither a cookie nor local storage is secure. However if you feel that the gains (being able to customise a message on the thank you page) is worth the security risk, then give it a shot! &lt;/p&gt;&lt;/div&gt;
      
      &lt;/div&gt;
&lt;/div&gt;
          &lt;/div&gt;
  
      &lt;div class="field field--name-field-blog-youtube field--type-entity-reference-revisions field--label-hidden field--items"&gt;
              &lt;div class="field--item"&gt;  &lt;div class="paragraph paragraph--type--blog-text-youtube paragraph--view-mode--default"&gt;
          
      &lt;/div&gt;
&lt;/div&gt;
          &lt;/div&gt;
  
  &lt;div class="field field--name-field-blog-terms field--type-entity-reference field--label-inline"&gt;
    &lt;div class="field--label"&gt;blog terms&lt;/div&gt;
          &lt;span class="field__items"&gt;
              &lt;span class="field--item"&gt;&lt;a href="http://badzilla.co.uk/static-site" hreflang="en"&gt;Static Site&lt;/a&gt;&lt;/span&gt;
          &lt;span class="field--item"&gt;&lt;a href="http://badzilla.co.uk/drupal8" hreflang="en"&gt;Drupal 8&lt;/a&gt;&lt;/span&gt;
          &lt;span class="field--item"&gt;&lt;a href="http://badzilla.co.uk/drupal" hreflang="en"&gt;Drupal&lt;/a&gt;&lt;/span&gt;
          &lt;span class="field--item"&gt;&lt;a href="http://badzilla.co.uk/php" hreflang="en"&gt;PHP&lt;/a&gt;&lt;/span&gt;
          &lt;span class="field--item"&gt;&lt;a href="http://badzilla.co.uk/development" hreflang="en"&gt;Development&lt;/a&gt;&lt;/span&gt;
          &lt;span class="field--item"&gt;&lt;a href="http://badzilla.co.uk/js" hreflang="en"&gt;JavaScript&lt;/a&gt;&lt;/span&gt;
              &lt;/span&gt;
      &lt;/div&gt;
</description>
  <pubDate>Sat, 04 May 2019 13:50:36 +0000</pubDate>
    <dc:creator>nigel</dc:creator>
    <guid isPermaLink="false">167 at http://badzilla.co.uk</guid>
    </item>
<item>
  <title>Drupal 8 as a Static Site: JavaScript Search Client</title>
  <link>http://badzilla.co.uk/drupal-8-static-site-javascript-search-client</link>
  <description>
&lt;span&gt;Drupal 8 as a Static Site: JavaScript Search Client&lt;/span&gt;

&lt;span&gt;&lt;span lang="" about="http://badzilla.co.uk/user/1" typeof="schema:Person" property="schema:name" datatype="" xml:lang=""&gt;nigel&lt;/span&gt;&lt;/span&gt;

&lt;span&gt;Sat, 15/12/2018 - 10:19&lt;/span&gt;

      &lt;div class="field field--name-field-heading-image-text field--type-entity-reference-revisions field--label-hidden field--items"&gt;
              &lt;div class="field--item"&gt;  &lt;div class="paragraph paragraph--type--blog-heading-picture-text paragraph--view-mode--default"&gt;
          
            &lt;div class="field field--name-field-blog-text field--type-text-long field--label-hidden field--item"&gt;&lt;p&gt;We now need to plug the Elasticsearch query that was built in &lt;a href="http://badzilla.co.uk/drupal-8-static-site-elasticsearch-query"&gt;the previous blog&lt;/a&gt; into a JavaScript client that has been loaded on the search page as described in another &lt;a href="http://badzilla.co.uk/drupal-8-static-site-search-architecture-and-drupal-configuration"&gt;earlier blog&lt;/a&gt;. So a few lines of JavaScript will be required here, and it will need to work on my three environments:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;Sandbox Drupal site connecting to local Elasticsearch server.&lt;/li&gt;
	&lt;li&gt;Sandbox static site connecting to local Elasticsearch server.&lt;/li&gt;
	&lt;li&gt;Production static site connecting to production Elasticsearch server. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The JavaScript will use the elasticsearch.js API library which can be downloaded from &lt;a href="https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/index.html"&gt;here&lt;/a&gt;. We need to make our theme aware of our JavaScript files and we only wanted them loading on the node search page route. Our JavaScript file will be called beezee_elastic.js, which is the name of my theme (beezee8) and elastic obviously.  &lt;/p&gt;&lt;/div&gt;
      
      &lt;/div&gt;
&lt;/div&gt;
              &lt;div class="field--item"&gt;  &lt;div class="paragraph paragraph--type--blog-heading-picture-text paragraph--view-mode--default"&gt;
          
            &lt;div class="field field--name-field-heading field--type-string field--label-hidden field--item"&gt;Add the JavaScript to the Beezee theme&lt;/div&gt;
      
            &lt;div class="field field--name-field-blog-text field--type-text-long field--label-hidden field--item"&gt;Firstly we need an entry in our theme's info.yml file under the Libraries heading. &lt;br /&gt;
&lt;strong&gt;beezee8.info.yml&lt;/strong&gt;&lt;br /&gt;
&lt;div class="geshifilter"&gt;&lt;div class="bash geshifilter-bash" style="font-family:monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal"&gt;libraries:
  - &lt;span style="color: #ff0000;"&gt;'beezee8/elastic-library'&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
Next we need to append to the libraries yml file the location of our JavaScript files - the Elastic API library and our own personal script. &lt;br /&gt;
&lt;strong&gt;beezee8.libraries.yml&lt;/strong&gt;
&lt;div class="geshifilter"&gt;&lt;div class="bash geshifilter-bash" style="font-family:monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal"&gt;elastic-library:
  js:
    js&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;elasticsearch-js&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;elasticsearch.min.js: &lt;span style="color: #7a0874; font-weight: bold;"&gt;{&lt;/span&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;}&lt;/span&gt;
    js&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;beezee&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;beezee_elastic.js: &lt;span style="color: #7a0874; font-weight: bold;"&gt;{&lt;/span&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;}&lt;/span&gt; &lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
Obviously we then have to copy our JS files into the filesystem at those locations - for now I will have a placeholder empty file for beezee_elastic.js which we will flesh out later.&lt;/div&gt;
      
      &lt;/div&gt;
&lt;/div&gt;
              &lt;div class="field--item"&gt;  &lt;div class="paragraph paragraph--type--blog-heading-picture-text paragraph--view-mode--default"&gt;
          
            &lt;div class="field field--name-field-heading field--type-string field--label-hidden field--item"&gt;Load the JavaScript files on the search page only&lt;/div&gt;
      
            &lt;div class="field field--name-field-blog-text field--type-text-long field--label-hidden field--item"&gt;There are a few ways of doing this, but my favourite is to use a preprocessor function in the {themename}.theme file. We can use hook_preprocess_page for this.&lt;br /&gt;
&lt;strong&gt;beezee8.theme&lt;/strong&gt;
&lt;div class="codeblock geshifilter"&gt;&lt;code&gt;&lt;span style="color: #000000"&gt;&lt;span style="color: #0000BB"&gt;&lt;?php&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;/**&lt;br /&gt; * @param $variables&lt;br /&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #007700"&gt;function &lt;/span&gt;&lt;span style="color: #0000BB"&gt;beezee8_preprocess_page&lt;/span&gt;&lt;span style="color: #007700"&gt;(&amp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$variables&lt;/span&gt;&lt;span style="color: #007700"&gt;) {&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #FF8000"&gt;// If we are on the search page, load the JS search client api&lt;br /&gt;    // and our implementation to Elasticsearch&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #007700"&gt;if (\&lt;/span&gt;&lt;span style="color: #0000BB"&gt;Drupal&lt;/span&gt;&lt;span style="color: #007700"&gt;::&lt;/span&gt;&lt;span style="color: #0000BB"&gt;routeMatch&lt;/span&gt;&lt;span style="color: #007700"&gt;()-&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;getRouteName&lt;/span&gt;&lt;span style="color: #007700"&gt;() == &lt;/span&gt;&lt;span style="color: #DD0000"&gt;'search.view_node_search'&lt;/span&gt;&lt;span style="color: #007700"&gt;) {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000BB"&gt;$variables&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'#attached'&lt;/span&gt;&lt;span style="color: #007700"&gt;][&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'library'&lt;/span&gt;&lt;span style="color: #007700"&gt;][] = &lt;/span&gt;&lt;span style="color: #DD0000"&gt;'beezee8/elastic-library'&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;
      
      &lt;/div&gt;
&lt;/div&gt;
              &lt;div class="field--item"&gt;  &lt;div class="paragraph paragraph--type--blog-heading-picture-text paragraph--view-mode--default"&gt;
          
            &lt;div class="field field--name-field-heading field--type-string field--label-hidden field--item"&gt;The JavaScript search client&lt;/div&gt;
      
            &lt;div class="field field--name-field-blog-text field--type-text-long field--label-hidden field--item"&gt;Ok so finally we are ready to build out our front end search client. Here we go!&lt;br /&gt;
&lt;strong&gt;beezee_elastic.js&lt;/strong&gt;
&lt;div class="geshifilter"&gt;&lt;div class="javascript geshifilter-javascript" style="font-family:monospace;"&gt;&lt;pre style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;$&lt;span style="color: #339933;"&gt;,&lt;/span&gt; Drupal&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
 
    &lt;span style="color: #000066; font-weight: bold;"&gt;var&lt;/span&gt; elastic_once&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
 
    &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; BeezeeElastic&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
        &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #339933;"&gt;!&lt;/span&gt;elastic_once&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
            elastic_once &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
 
            &lt;span style="color: #006600; font-style: italic;"&gt;// Get the params from the url&lt;/span&gt;
            &lt;span style="color: #000066; font-weight: bold;"&gt;var&lt;/span&gt; pageURL &lt;span style="color: #339933;"&gt;=&lt;/span&gt; window.&lt;span style="color: #660066;"&gt;location&lt;/span&gt;.&lt;span style="color: #660066;"&gt;search&lt;/span&gt;.&lt;span style="color: #660066;"&gt;substring&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #CC0000;"&gt;1&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
            &lt;span style="color: #000066; font-weight: bold;"&gt;var&lt;/span&gt; URLVariables &lt;span style="color: #339933;"&gt;=&lt;/span&gt; pageURL.&lt;span style="color: #660066;"&gt;split&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'&amp;'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
            &lt;span style="color: #000066; font-weight: bold;"&gt;var&lt;/span&gt; keys&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
            i &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #CC0000;"&gt;0&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
            while &lt;span style="color: #009900;"&gt;(&lt;/span&gt;i &lt;span style="color: #339933;"&gt;&lt;&lt;/span&gt; URLVariables.&lt;span style="color: #660066;"&gt;length&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
                &lt;span style="color: #000066; font-weight: bold;"&gt;var&lt;/span&gt; ParameterName &lt;span style="color: #339933;"&gt;=&lt;/span&gt; URLVariables&lt;span style="color: #009900;"&gt;[&lt;/span&gt;i&lt;span style="color: #009900;"&gt;]&lt;/span&gt;.&lt;span style="color: #660066;"&gt;split&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'='&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;ParameterName&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #CC0000;"&gt;0&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt; &lt;span style="color: #339933;"&gt;==&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;'keys'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
                    keys &lt;span style="color: #339933;"&gt;=&lt;/span&gt; ParameterName&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #CC0000;"&gt;1&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
                i&lt;span style="color: #339933;"&gt;++;&lt;/span&gt;
            &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
 
            &lt;span style="color: #006600; font-style: italic;"&gt;// Did we get anything from the URL? If not bail, otherwise do the search.&lt;/span&gt;
            &lt;span style="color: #006600; font-style: italic;"&gt;// We shouldn't get to here so don't show a message to user.&lt;/span&gt;
            &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #339933;"&gt;!&lt;/span&gt;keys&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
                console.&lt;span style="color: #660066;"&gt;log&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'Invalid keys'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                &lt;span style="color: #000066; font-weight: bold;"&gt;return&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
            &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
 
            &lt;span style="color: #006600; font-style: italic;"&gt;// Add the search key to the h1 selector&lt;/span&gt;
            $&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"h1"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;append&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;Drupal.&lt;span style="color: #660066;"&gt;t&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;" for "&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; keys&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
 
            &lt;span style="color: #006600; font-style: italic;"&gt;// Endpoint defined during instantiation of API Client&lt;/span&gt;
            &lt;span style="color: #000066; font-weight: bold;"&gt;var&lt;/span&gt; client &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;new&lt;/span&gt; elasticsearch.&lt;span style="color: #660066;"&gt;Client&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;
                host&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;'http://meedjum.test:9200/'&lt;/span&gt; &lt;span style="color: #006600; font-style: italic;"&gt;/*,*/&lt;/span&gt;
                &lt;span style="color: #006600; font-style: italic;"&gt;/* log: 'trace' */&lt;/span&gt;
            &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
 
            client.&lt;span style="color: #660066;"&gt;search&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;
                index&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;'elasticsearch_index_badzilla_meedjum_staticcontent'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
                body&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
                    query&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
                        function_score&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
                            query&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
                                query_string&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
                                    query&lt;span style="color: #339933;"&gt;:&lt;/span&gt; keys&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
                                    fields&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #009900;"&gt;[&lt;/span&gt;
                                        &lt;span style="color: #3366CC;"&gt;"title"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
                                        &lt;span style="color: #3366CC;"&gt;"*body"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
                                        &lt;span style="color: #3366CC;"&gt;"term"&lt;/span&gt;
                                    &lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
                                    default_operator&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"OR"&lt;/span&gt;
                                &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
                            &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
                            functions&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #009900;"&gt;[&lt;/span&gt;
                                &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
                                    linear&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
                                        &lt;span style="color: #3366CC;"&gt;"created"&lt;/span&gt;&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
                                            origin&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"now"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
                                            offset&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"365d"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
                                            scale&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"1460d"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
                                            decay&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #CC0000;"&gt;0.5&lt;/span&gt;
                                        &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
                                    &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
                                &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
                            &lt;span style="color: #009900;"&gt;]&lt;/span&gt;
                        &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
                    &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
                    highlight&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
                        number_of_fragments&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #CC0000;"&gt;1&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
                        pre_tags&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"&lt;strong&gt;"&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
                        post_tags&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"&lt;/strong&gt;"&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
                        fragment_size&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #CC0000;"&gt;400&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
                        no_match_size&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #CC0000;"&gt;400&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
                        phrase_limit&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #CC0000;"&gt;1&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
                        fields&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
                            &lt;span style="color: #3366CC;"&gt;"*body"&lt;/span&gt;&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
                            &lt;span style="color: #3366CC;"&gt;"title"&lt;/span&gt;&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
                            &lt;span style="color: #3366CC;"&gt;"term"&lt;/span&gt;&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;
                        &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
                    &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;
                    size&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #CC0000;"&gt;10&lt;/span&gt;
                &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
            &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; response&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
 
            &lt;span style="color: #006600; font-style: italic;"&gt;/*
             Process the response from Elastic
             */&lt;/span&gt;
            &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; response&lt;span style="color: #009900;"&gt;(&lt;/span&gt;err&lt;span style="color: #339933;"&gt;,&lt;/span&gt; resp&lt;span style="color: #339933;"&gt;,&lt;/span&gt; status&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
 
                &lt;span style="color: #006600; font-style: italic;"&gt;// Are we logged in? If so our jQuery calls will be slightly different due to additional DOM stuff&lt;/span&gt;
                &lt;span style="color: #006600; font-style: italic;"&gt;// for non anonymous&lt;/span&gt;
                &lt;span style="color: #006600; font-style: italic;"&gt;// These are our targets for injecting the content on the page. Markup is Bootstrap 3&lt;/span&gt;
                &lt;span style="color: #000066; font-weight: bold;"&gt;var&lt;/span&gt; h1_find&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                &lt;span style="color: #000066; font-weight: bold;"&gt;var&lt;/span&gt; h2_find&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;$&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;".user-logged-in"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;length&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
                    h1_find &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"h1 + nav:last-child"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                    h2_find &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"h1 + nav + h2:last-child"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                &lt;span style="color: #009900;"&gt;}&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;else&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
                    h1_find &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"h1"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                    h2_find &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"h1 + h2:last-child"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
 
                &lt;span style="color: #000066; font-weight: bold;"&gt;var&lt;/span&gt; hits &lt;span style="color: #339933;"&gt;=&lt;/span&gt; resp.&lt;span style="color: #660066;"&gt;hits&lt;/span&gt;.&lt;span style="color: #660066;"&gt;hits&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
 
                &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;resp.&lt;span style="color: #660066;"&gt;hits&lt;/span&gt;.&lt;span style="color: #660066;"&gt;total&lt;/span&gt; &lt;span style="color: #339933;"&gt;==&lt;/span&gt; &lt;span style="color: #CC0000;"&gt;0&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
                    $&lt;span style="color: #009900;"&gt;(&lt;/span&gt;h1_find&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;after&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"&lt;h3&gt;"&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; Drupal.&lt;span style="color: #660066;"&gt;t&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"Your search yielded no results."&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"&lt;/h3&gt;"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
                &lt;span style="color: #000066; font-weight: bold;"&gt;else&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
                    $&lt;span style="color: #009900;"&gt;(&lt;/span&gt;h1_find&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;after&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"&lt;h2&gt;"&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; Drupal.&lt;span style="color: #660066;"&gt;t&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"Search results"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"&lt;/h2&gt;"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
 
                    &lt;span style="color: #000066; font-weight: bold;"&gt;var&lt;/span&gt; inject &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"&lt;ol&gt;"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                    $.&lt;span style="color: #660066;"&gt;each&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;hits&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;key&lt;span style="color: #339933;"&gt;,&lt;/span&gt; value&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
 
                        &lt;span style="color: #006600; font-style: italic;"&gt;// Url, title and Body&lt;/span&gt;
                        &lt;span style="color: #000066; font-weight: bold;"&gt;var&lt;/span&gt; prefix &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"&lt;li&gt;&lt;h3&gt;"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                        &lt;span style="color: #000066; font-weight: bold;"&gt;var&lt;/span&gt; suffix &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"&lt;/li&gt;"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                        &lt;span style="color: #000066; font-weight: bold;"&gt;var&lt;/span&gt; title &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"&lt;a href=&lt;span style="color: #000099; font-weight: bold;"&gt;\"&lt;/span&gt;"&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; value._source.&lt;span style="color: #660066;"&gt;url&lt;/span&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #CC0000;"&gt;0&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"&lt;span style="color: #000099; font-weight: bold;"&gt;\"&lt;/span&gt;&gt;"&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; value.&lt;span style="color: #660066;"&gt;highlight&lt;/span&gt;.&lt;span style="color: #660066;"&gt;title&lt;/span&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #CC0000;"&gt;0&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"&lt;/a&gt;&lt;/h3&gt;"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
 
                        &lt;span style="color: #006600; font-style: italic;"&gt;// do we have a book body or a paragraph body?&lt;/span&gt;
                        &lt;span style="color: #000066; font-weight: bold;"&gt;var&lt;/span&gt; body&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                        &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;typeof&lt;/span&gt; value.&lt;span style="color: #660066;"&gt;highlight&lt;/span&gt;.&lt;span style="color: #660066;"&gt;blog_body&lt;/span&gt; &lt;span style="color: #339933;"&gt;!=&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;'undefined'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
                            body &lt;span style="color: #339933;"&gt;=&lt;/span&gt; value.&lt;span style="color: #660066;"&gt;highlight&lt;/span&gt;.&lt;span style="color: #660066;"&gt;blog_body&lt;/span&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #CC0000;"&gt;0&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                        &lt;span style="color: #009900;"&gt;}&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;else&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
                            body &lt;span style="color: #339933;"&gt;=&lt;/span&gt; value.&lt;span style="color: #660066;"&gt;highlight&lt;/span&gt;.&lt;span style="color: #660066;"&gt;body&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                        &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
                        body &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"&lt;p&gt;"&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; body &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"&lt;/p&gt;"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
 
                        inject &lt;span style="color: #339933;"&gt;+=&lt;/span&gt; prefix &lt;span style="color: #339933;"&gt;+&lt;/span&gt; title &lt;span style="color: #339933;"&gt;+&lt;/span&gt; body &lt;span style="color: #339933;"&gt;+&lt;/span&gt; suffix&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
 
                        &lt;span style="color: #006600; font-style: italic;"&gt;// Add the tag&lt;/span&gt;
                        &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066; font-weight: bold;"&gt;typeof&lt;/span&gt; value.&lt;span style="color: #660066;"&gt;highlight&lt;/span&gt;.&lt;span style="color: #660066;"&gt;term&lt;/span&gt; &lt;span style="color: #339933;"&gt;!=&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;'undefined'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
                            inject &lt;span style="color: #339933;"&gt;+=&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"&lt;p&gt;"&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; Drupal.&lt;span style="color: #660066;"&gt;t&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"Tag:"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;" "&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; value.&lt;span style="color: #660066;"&gt;highlight&lt;/span&gt;.&lt;span style="color: #660066;"&gt;term&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"&lt;/p&gt;"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                        &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
 
                        &lt;span style="color: #006600; font-style: italic;"&gt;// Author and date&lt;/span&gt;
                        &lt;span style="color: #000066; font-weight: bold;"&gt;var&lt;/span&gt; gb_obj &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;new&lt;/span&gt; &lt;span style=""&gt;Date&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;value._source.&lt;span style="color: #660066;"&gt;created&lt;/span&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #CC0000;"&gt;0&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt; &lt;span style="color: #339933;"&gt;*&lt;/span&gt; &lt;span style="color: #CC0000;"&gt;1000&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                        &lt;span style="color: #000066; font-weight: bold;"&gt;var&lt;/span&gt; gb_date &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'0'&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; gb_obj.&lt;span style="color: #660066;"&gt;getDate&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;slice&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&lt;/span&gt;&lt;span style="color: #CC0000;"&gt;2&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt;
                            &lt;span style="color: #3366CC;"&gt;"/"&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;'0'&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;gb_obj.&lt;span style="color: #660066;"&gt;getMonth&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #CC0000;"&gt;1&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;slice&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&lt;/span&gt;&lt;span style="color: #CC0000;"&gt;2&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt;
                            &lt;span style="color: #3366CC;"&gt;"/"&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; gb_obj.&lt;span style="color: #660066;"&gt;getFullYear&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt;
                            &lt;span style="color: #3366CC;"&gt;" "&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"-"&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"&amp;nbsp"&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt;
                            gb_obj.&lt;span style="color: #660066;"&gt;getHours&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;":"&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt;
                            gb_obj.&lt;span style="color: #660066;"&gt;getMinutes&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
 
                        inject &lt;span style="color: #339933;"&gt;+=&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"&lt;p&gt;"&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; value._source.&lt;span style="color: #660066;"&gt;author&lt;/span&gt;&lt;span style="color: #009900;"&gt;[&lt;/span&gt;&lt;span style="color: #CC0000;"&gt;0&lt;/span&gt;&lt;span style="color: #009900;"&gt;]&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;" "&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"-"&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;" "&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; gb_date&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
 
                    &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                    inject &lt;span style="color: #339933;"&gt;+=&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"&lt;/ol&gt;"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                    $&lt;span style="color: #009900;"&gt;(&lt;/span&gt;h2_find&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;after&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;inject&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
                &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
            &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
 
 
    Drupal.&lt;span style="color: #660066;"&gt;behaviors&lt;/span&gt;.&lt;span style="color: #660066;"&gt;beezee_elastic&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
        attach&lt;span style="color: #339933;"&gt;:&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;function&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;context&lt;span style="color: #339933;"&gt;,&lt;/span&gt; settings&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt;
            BeezeeElastic&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;}&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;jQuery&lt;span style="color: #339933;"&gt;,&lt;/span&gt; Drupal&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
      
      &lt;/div&gt;
&lt;/div&gt;
              &lt;div class="field--item"&gt;  &lt;div class="paragraph paragraph--type--blog-heading-picture-text paragraph--view-mode--default"&gt;
          
            &lt;div class="field field--name-field-heading field--type-string field--label-hidden field--item"&gt;Code commentary&lt;/div&gt;
      
            &lt;div class="field field--name-field-blog-text field--type-text-long field--label-hidden field--item"&gt;&lt;p&gt;I'd like to think the code is self-explanatory, but here are a few words for additional clarification. &lt;/p&gt;
&lt;p&gt;The first block of code is processing the URL params. We are expecting the &lt;em&gt;?keys={search_phrase}&lt;/em&gt;. The search phrase needs to be injected into the Elasticsearch query later. &lt;/p&gt;
&lt;p&gt;The &lt;em&gt;client&lt;/em&gt; object is returned from me instantiating the Elasticsearch API. I needed a parameter of the Elasticsearch endpoint which is currently hardcoded. It will work for my two sandbox environments (Drupal and static) but not for production. I will have to come up with a solution to rewrite the endpoint during the deployment process!&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;client.search&lt;/em&gt; call is our query created earlier, and I have added the search term from the URL. The Elasticsearch API provides two mechanisms for this call - it can return a promise or invoke a callback. I opted for the latter. &lt;/p&gt;
&lt;p&gt;The &lt;em&gt;response&lt;/em&gt; function is the callback and it handles the Elastic response. My first task is to set the selectors where I will inject the results - note that the DOM is different whether I am logged into my sandbox Drupal or not - so my injection anchor points are different dependent upon this circumstance. &lt;/p&gt;
&lt;p&gt;I add the title, body text, tag, author and published date to my output, concatenating them together, and then inject them into the content area of the screen around ordered list tags. &lt;/p&gt;
&lt;p&gt;The next result is very similar visually to the default Drupal core search with the addition of my blog tags, although of course it can be styled differently if wanted. &lt;/p&gt;
&lt;/div&gt;
      
      &lt;/div&gt;
&lt;/div&gt;
              &lt;div class="field--item"&gt;  &lt;div class="paragraph paragraph--type--blog-heading-picture-text paragraph--view-mode--default"&gt;
          
            &lt;div class="field field--name-field-heading field--type-string field--label-hidden field--item"&gt;The results&lt;/div&gt;
      
      &lt;div class="field field--name-field-blog-image field--type-image field--label-hidden field--items"&gt;
              &lt;div class="field--item"&gt;    &lt;img srcset="https://assets.badzilla.co.uk/s3fs-public/styles/max_325x325/public/2018-12/Screenshot%202018-12-15%20at%2015.04.52.png?itok=ZnDNHXFC 325w, https://assets.badzilla.co.uk/s3fs-public/styles/max_650x650/public/2018-12/Screenshot%202018-12-15%20at%2015.04.52.png?itok=w9IqdciG 650w, https://assets.badzilla.co.uk/s3fs-public/styles/max_1300x1300/public/2018-12/Screenshot%202018-12-15%20at%2015.04.52.png?itok=WNHqHJYw 1300w, https://assets.badzilla.co.uk/s3fs-public/styles/max_2600x2600/public/2018-12/Screenshot%202018-12-15%20at%2015.04.52.png?itok=XruPF1MZ 1766w" sizes="(min-width: 1290px) 1290px, 100vw" src="https://assets.badzilla.co.uk/s3fs-public/styles/max_325x325/public/2018-12/Screenshot%202018-12-15%20at%2015.04.52.png?itok=ZnDNHXFC" alt="results" typeof="foaf:Image" class="img-responsive" /&gt;


&lt;/div&gt;
          &lt;/div&gt;
  
            &lt;div class="field field--name-field-blog-text field--type-text-long field--label-hidden field--item"&gt;&lt;p&gt;The script works well on both the Drupal and static sites in sandbox. The screenshot above shows a search on the word &lt;em&gt;nginx&lt;/em&gt;. At the moment I haven't built in a paginator, but that could come along later. &lt;/p&gt;&lt;/div&gt;
      
      &lt;/div&gt;
&lt;/div&gt;
          &lt;/div&gt;
  
      &lt;div class="field field--name-field-blog-youtube field--type-entity-reference-revisions field--label-hidden field--items"&gt;
              &lt;div class="field--item"&gt;  &lt;div class="paragraph paragraph--type--blog-text-youtube paragraph--view-mode--default"&gt;
          
      &lt;/div&gt;
&lt;/div&gt;
          &lt;/div&gt;
  
  &lt;div class="field field--name-field-blog-terms field--type-entity-reference field--label-inline"&gt;
    &lt;div class="field--label"&gt;blog terms&lt;/div&gt;
          &lt;span class="field__items"&gt;
              &lt;span class="field--item"&gt;&lt;a href="http://badzilla.co.uk/static-site" hreflang="en"&gt;Static Site&lt;/a&gt;&lt;/span&gt;
          &lt;span class="field--item"&gt;&lt;a href="http://badzilla.co.uk/drupal" hreflang="en"&gt;Drupal&lt;/a&gt;&lt;/span&gt;
          &lt;span class="field--item"&gt;&lt;a href="http://badzilla.co.uk/drupal8" hreflang="en"&gt;Drupal 8&lt;/a&gt;&lt;/span&gt;
          &lt;span class="field--item"&gt;&lt;a href="http://badzilla.co.uk/js" hreflang="en"&gt;JavaScript&lt;/a&gt;&lt;/span&gt;
              &lt;/span&gt;
      &lt;/div&gt;
</description>
  <pubDate>Sat, 15 Dec 2018 10:19:04 +0000</pubDate>
    <dc:creator>nigel</dc:creator>
    <guid isPermaLink="false">161 at http://badzilla.co.uk</guid>
    </item>

  </channel>
</rss>
