Stepping back to move forward with ReactJS

I’ve been using ReactJS as I have been exploring Headless / Decoupled Drupal and have so far found it to be very nice to work with. However, as I am not overly familar with it I’ve found myself looking up lots of things to ensure I’m doing it “the React way”. This has meant I’ve been doing more React learning than I have Drupal learning.

My solution is to go back to an existing Drupal 7 project where I have a custom piece of search functionality and replicate it using JSON feeds provided by Drupal and a ReactJS frontend.

This has been really beneficial in my learning as I have very clea objectivies and expectations. It also means I am only focussed on learning one thing at time so I don’t skip around between documentation and tutorials.

If you ae just starting with ReactJS, or any othe JavaScript famework, and Drupal I would highly reccomend this approach to get a taste of what this decoupled appoach can bring to your skill set.

Headless / Decoupled Drupal 8 First Go

The installation of a minimal Drupal setup is very quick and easy. From there I enabled a few modules and a theme to help me create some data.

  • Modules enabled
  • Field UI
  • Image
  • Views
  • View UI
  • RESTful Web Services

I also installed the Devel module to help with dummy content population of my content type Article.

A common function of a website is to list content in an order, newest items or most relevant, and paginate this list. In Drupal this is commonly done in Views.

I set up my view as follows

  • REST Export
  • URL of /api/articles
  • Display 10 items
  • Show fields

This is great, nice and easy and gives the JSON I want.

Now the questions began.

  • If I can set a URL for this how are the URLs structured for individual nodes
  • If my public facing site is then do I need to access my CMS on a subdomain such as
  • How do I know the URL to paginate the Views output
  • Can it supply a next and previous URL, how about total number of page

There is a great discussion about React in Drupal core on the Lullabot podcast. At 48:58 they talk about the Drupal APIs and specifically Views. The current status is there are some in place but using Views is a workaround at the moment.

As I keep going hopefully some of these questions will be answered, and I’m sure there will be moe posts and more questions.

Testing SSL certificates without a domain name

Recently at Headscape we were setting up a new server ready to launch a redesign of a site. Whilst testing we were accessing the site using the server’s IP address which works fine for checking everything is working, apart from when we needed to install the SSL certificate.

The SSL certificate is based on a domain name so going to an IP address causes the SSL certificate to warn of an insecure connection. Not very helpful when you’re checking to see if everything has been setup correctly.

This is the solution we came up with.

Say our server is on an IP address of 123.456.78.9 and the domain name is

Adding an entry to the hosts file of


will cause the browser to go to the new server when we request

The server will see that the incoming request is for the domain name that matches the SSL certificate and, providing everything has been installed correctly, we will be accessing the site over https.

Drupal Commerce, TeamCity and Git Submodules

At Headscape we use TeamCity as our Continuous Integration server and I recently came across an error when trying to build Drupal Commerce Kickstart.

The main parts of the error message were

Failed to build patch for build... due to error: 'build patch' command failed.

stderr: The repository  has a submodule in the commit '77b28273d1ebb08fd03ee254bbb20b6b476d16ec' at a path 'profiles/commerce_kickstart/libraries/jquery.bxslider', but has no .gitmodules configuration at the root directory

To fix this I needed a list of the submodules which I found using a command given in this Stack Overflow thread

$ git ls-files --stage | grep 160000

This listed the submodules as

160000 49a59494c0769c67a7ed2afe35f096e6d6fc956d 0 profiles/commerce_kickstart/libraries/jquery.bxslider
160000 9b8da2340b87e8dbbb5e7e2563a2ca4bdf09a1b4 0 profiles/commerce_kickstart/libraries/jquery_expander
160000 bd879003043b4a93b78cbd4a582b6e0650900bcb 0 profiles/commerce_kickstart/libraries/jquery_ui_spinner
160000 538237c7c5e95736fc376f4efc3e40f5b98eecc5 0 profiles/commerce_kickstart/libraries/selectnav.js

The next step is to find the remote URL for each of them. After moving into the directory

$ cd profiles/commerce_kickstart/libraries/jquery.bxslider

I then used $ git remote show origin

Which returns Fetch URL:

Each of these needs adding to the .gitmodules file as a submodule so we end up with the .gitmodules file looking like this

[submodule "profiles/commerce_kickstart/libraries/jquery.bxslider"]
path = profiles/commerce_kickstart/libraries/jquery.bxslider
url =

[submodule “profiles/commerce_kickstart/libraries/jquery_expander”]
path = profiles/commerce_kickstart/libraries/jquery_expander
url =

[submodule “profiles/commerce_kickstart/libraries/jquery_ui_spinner”]
path = profiles/commerce_kickstart/libraries/jquery_ui_spinner
url =

[submodule “profiles/commerce_kickstart/libraries/selectnav.js”]
path = profiles/commerce_kickstart/libraries/selectnav.js
url =

Once this file has been committed TeamCity was able to complete the build.

Enjoying getting it wrong

This post also appears on the Headscape site as part of our blog.

During my teens and twenties I spent a lot of time skateboarding. It’s quite a unique sport in the way it influences your life as a whole. For example, you begin to look at architecture in a new creative way. You also fall over, a lot.

In fact you get really good at falling over: jump down ten steps roll across the concrete, hop up and do it again. You actually spend a lot of time “failing” and it doesn’t bother you. You learn that failure is part of the learning process and something that you should not be afraid of.

Over time the feeling of failure decreases and you’ll gain confidence in the knowledge that you know how to deal with problems.

This attitude can be taken into every aspect of your life and especially something as dynamic as web development. Why not try writing a little app in a new language? If it doesn’t work out it’s not a big deal. What did you learn from it? Did you not enjoy using the new language or was it just not a good fit for what you were trying to do?

Maybe to start with you could try using a new JavaScript library to see how you fair. Then progress to trying harder things. You might fail at them first go, maybe even second, but don’t let it phase you.

Over time the feeling of failure decreases and you’ll gain confidence in the knowledge that you know how to deal with problems. This could even be a huge advantage if a critical problem occurs on a live server for example. If you’ve been playing around and breaking things locally you’ll be calmer and more methodical when fixing critical issues.

When learning tricks on my skateboard I would always start off on the safe flat ground. Once I’d become comfortable I’d try the trick down a curb, adding a bit of risk but knowing it wouldn’t be too catastrophic if I didn’t land it. Then finally, once I’d got very comfortable, I would try it down a set of steps… more risk and more reward. You can carry this analogy into your work by trying out your new idea on a personal project, then maybe on a friend or colleague’s project and finally unleash it on that million dollar website and revel in the excitement!

So next time you think you may fall over, go with it, learn to roll out of it and pop back up and try again. You may even find you start to enjoy it.

Codeception Database Helper

I’ve been using Codeception for some acceptance testing recently. The project has a large database and using the standard Codeception database module that rebuilds the entire DB from an SQL dump was too slow.

All I needed to do was run a few queries to put some tables into a known state. I made a helper module that will run all .sql files in a directory.

I’ve put the DbHelper on Github and hopefully it will be useful for others.

Guesting on Modules Unraveled Podcast

At Headscape we were recently contacted by Brian Lewis from Modules Unraveled Podcast to see if we would like to appear on the show to discuss our use of Drupal.

It was really great to have a chat with Brian and there were a few questions sent in by Twitter users who were watching the live stream.

You can listen to episode 90 on the Modules Unraveled website.

Moving on from the MBA to Headscape

I have been working for The Marine Biological Association for close to five years now but the time has come to move on. I’m very proud to say I will be working for Headscape where I’m sure I will learn lots and continue to progress as a developer.

In the five years since I started the web and my skills have progressed exponentially. It’s been fun and nostalgic to talk about the early days and see how far the sites and applications have come since I began working with the MBA.

As with all good work places it’s not only the work but the people who make it special and I made some excellent friendships that I’m sure will continue.

I’m certain that this will continue to be the case in my new endeavors with Headscape.

Smashing Node.JS Review

The short review would be “what a brilliant book”.

I had tinkered with Node.js before but in a bit of an  unstructured fashion. Reading the table of contents had me impressed then seeing the price for the Kindle version confirmed the deal. There is a lot of information here for very little money, around £7.50.

The book begins with an introduction to Node and setting it up. There are also some details about the difference between browser JavaScript and some APIs used by node.

We then move onto using Node for a command line app and then communicating over HTTP. With the slid foundations set the third section introduces some modules that will help us build actual websites.

The fourth section enhances the web apps ideas by introducing different databases, not just by name but by structure. Including MySQL and NoSQL such as MongoDB.

The final section shows how we can really use the code once use everywhere philosophy by allowing JS written for Node to also be executed in the browser. Then finally a chapter on testing to ensure our apps will behave as expected.

The book introduces the code in easy to understand segments and then often refactors this further into the chapter. This gave the examples a “real world” feel and helped show some best practices and why they should be used in that way.

There are also some nice interactions with other APIs such as the classic example of Twitter as well as Grooveshark.

If you are interested in getting started with Node.js or have just begun your learning and are seeking a more structured learning format I highly recommend  Smashing Node.js.