Blog
I enjoy writing articles and have written a number of them so far during my career, both to document my own learning as well to act as resources for others.
2021
- Survey results from my DrupalCon Europe session (Test Driven Drupal) (22nd January 2021)
- Test Driven Drupal presentation from DrupalCon Europe (12th January 2021)
- Ignoring PHPCS sniffs for PHPUnit tests (4th January 2021)
2020
- Drupal automated testing workshop notes (15th November 2020)
- UIs that I've Rebuilt with Tailwind CSS (2nd November 2020)
- Upgrading the Dransible project to Drupal 9 (5th September 2020)
- Renaming gray to grey in Tailwind CSS (4th September 2020)
- Interview with a Drupal Expert (with Code Enigma) (31st August 2020)
- Creating a custom PHPUnit command for DDEV (28th August 2020)
- Speaking at DrupalCon Europe 2020 (30th July 2020)
- Streaming with Spabby (Gary Hockin) about Drupal (30th July 2020)
- 10 years working full time with Drupal and PHP (19th July 2020)
- Speaking remotely during COVID-19 (7th June 2020)
- Coloured output with PHPUnit and GitHub Actions (29th May 2020)
- Migrating to Drupal 8: Introduction (20th May 2020)
- My first blog post published for Inviqa (29th April 2020)
- Presenting on Tailwind CSS and Ansible at CMS Philly (24th April 2020)
- Test Driven Drupal on Gitstore and Leanpub (22nd April 2020)
- Drupal automated testing: an introduction (21st April 2020)
- Using the pcss extension for PostCSS with Webpack Encore (1st April 2020)
- Running Drupal 8.8 with the Symfony Local Server (9th March 2020)
- Testing Workshop at DrupalCamp London 2020 (5th February 2020)
- Using PSR-4 Autoloading for your Drupal 7 Test Cases (4th February 2020)
2019
- Live Blogging From SymfonyLive London 2019 (13th September 2019)
- Speaking at DrupalCon Amsterdam (25th July 2019)
- Using Transition Class Props in Vue.js (6th June 2019)
- Test Driven Ansible Role Development with Molecule (2nd June 2019)
- Speakers and sessions announced for DrupalCamp Bristol 2019 (31st May 2019)
- Testing Tailwind CSS plugins with Jest (29th April 2019)
- Restructuring my tailwind.js configuration files (8th March 2019)
- Easier Git Repository Cloning with insteadOf (7th March 2019)
2018
- Rebuilding Bartik (Drupal’s Default Theme) with Vue.js and Tailwind CSS - part 2 (27th December 2018)
- Published my first NPM package (16th December 2018)
- Rebuilding Bartik (Drupal’s Default Theme) with Vue.js and Tailwind CSS (20th November 2018)
- DrupalCamp London 2019 - Tickets Available and Call for Sessions (20th November 2018)
- Debugging Drupal Commerce Promotions and Adjustments using Illuminate Collections (Drupal 8) (24th October 2018)
- Quick Project Switching in PhpStorm (4th September 2018)
- Examples of using Laravel Collections in Drupal (23rd August 2018)
- Experimenting with events in Drupal 8 (21st August 2018)
- Null Users and System Users in Drupal (16th August 2018)
- Drupal 8 Commerce: Fixing 'No Such Customer' error on checkout (15th August 2018)
- Croeso PHP South Wales! (1st August 2018)
- How to run Drupal 8 PHPUnit Tests within Docksal from PhpStorm (19th July 2018)
- Drupal Bristol Testing Workshop (28th June 2018)
- How to Use Environment Variables for your Drupal Settings with Docksal (4th June 2018)
- Creating a Custom PHPUnit Command for Docksal (6th May 2018)
- Back to the future with Git’s diff and apply commands (23rd April 2018)
- How to put your PHP application in a subdirectory of another site with Nginx (12th March 2018)
- How to split a new Drupal contrib project from within another repository (10th March 2018)
- Drupal 8.5.0 Released (9th March 2018)
- Tweets from DrupalCamp London (4th March 2018)
- Yay, the Mediacurrent Contrib Half Hour is Back! (2nd March 2018)
- Building the new PHPSW Website (28th February 2018)
- Queuing Private Messages in Drupal 8 (27th February 2018)
- Looking forward to DrupalCamp London (27th February 2018)
- Using Tailwind CSS in your Drupal Theme (5th February 2018)
- DrupalCamp Bristol 2018 Statement (30th January 2018)
2017
- Writing a new Drupal 8 Module using Test Driven Development (TDD) (7th November 2017)
- Publishing Sculpin Sites with GitHub Pages (13th July 2017)
- Introducing the Drupal Meetups Twitterbot (9th June 2017)
- Turning Your Custom Drupal Module into a Feature (20th May 2017)
- DrupalCamp Bristol 2017 - Early Bird Tickets, Call for Sessions, Sponsors (15th May 2017)
- Fixing Drupal SimpleTest issues inside Docker Containers (5th May 2017)
- Nginx Redirects With Query String Arguments (31st January 2017)
- Easier Sculpin Commands with Composer and NPM Scripts (7th January 2017)
2016
- Drupal VM Generator 2.9.1 Released (30th December 2016)
- Building Gmail Filters with PHP (15th July 2016)
- Simplifying Drupal Migrations with xautoload (3rd May 2016)
- Announcing the Drupal VM Generator (15th February 2016)
2015
- Programmatically Load an Entityform in Drupal 7 (22nd December 2015)
- Automating Sculpin Builds with Jenkins CI (21st July 2015)
- Sculpin and Twig Resources (19th July 2015)
- Updating Forked Repositories on GitHub (18th June 2015)
- How to Define a Minimum Drupal Core Version (3rd April 2015)
- 2014 (20th March 2015)
2014
- Include a Local Drupal Settings file for Environment Configuration and Overrides (20th December 2014)
- Include environment-specific settings files on Pantheon (27th November 2014)
- Using Remote Files when Developing Locally with Stage File Proxy Module (20th November 2014)
- Include CSS Fonts by Using a SASS each Loop (18th November 2014)
- Updating Features and Adding Components Using Drush (21st October 2014)
- How to fix Vagrant Loading the Wrong Virtual Machine (6th October 2014)
- git format-patch is your Friend (21st May 2014)
- Thanks (6th May 2014)
- Drupal Association (3rd May 2014)
- DrupalCamp London: What is Git Flow? (3rd March 2014)
- DrupalCamp London 2014 (9th February 2014)
- Some Useful Git Aliases (15th January 2014)
2013
- Download Different Versions of Drupal with Drush (31st December 2013)
- Quickly Apply Patches Using Git and curl or wget (24th December 2013)
- Useful Vagrant Commands (27th November 2013)
- Don't Bootstrap Drupal, Use Drush (19th November 2013)
- Create a Zen Sub-theme Using Drush (6th September 2013)
- Going to DrupalCon (26th July 2013)
- Creating Local and Staging sites with Drupal's Domain Module Enabled (17th July 2013)
- Some useful links for using SimpleTest in Drupal (13th June 2013)
- Display Git Branch or Tag Names in your Bash Prompt (27th April 2013)
- Leaving Nomensa, Joining Precedent (20th April 2013)
- The Quickest way to Install Sublime Text 2 in Ubuntu (2nd March 2013)
- Creating and using custom tokens in Drupal 7 (16th February 2013)
- Checking if a user is logged into Drupal (the right way) (9th January 2013)
2012
- How to use SASS and Compass in Drupal 7 using Sassy (6th December 2012)
- Open Sublime Text 2 from the Mac OS X Command Line (17th November 2012)
- Accessible Bristol site launched (15th November 2012)
- My Sublime Text 2 settings (25th October 2012)
- Reflections on speaking at UnifiedDiff (6th September 2012)
- Display a Custom Menu in a Drupal 7 Theme Template File (18th August 2012)
- Writing an Article for Linux Journal (27th July 2012)
- Install and Configure the Nomensa Accessible Media Player in Drupal (14th July 2012)
- My new Drupal modules (12th July 2012)
- Dividing Drupal's process and preprocess functions into separate files (24th May 2012)
- Forward one domain to another using mod_rewrite and .htaccess (23rd May 2012)
- Checkout a specific revision from SVN from the command line (23rd May 2012)
- How to add a date popup calendar onto a custom form (23rd May 2012)
- Writing a .info file for a Drupal 7 theme (23rd May 2012)
- Prevent Apache from displaying text files within a web browser (23rd May 2012)
- Adding Custom Theme Templates in Drupal 7 (19th April 2012)
- Installing Nagios on CentOS (17th April 2012)
- Create an Omega Subtheme with LESS CSS Preprocessor using Omega Tools and Drush (16th April 2012)
- How to use Authorized Keys to Create a Passwordless SSH Connection (1st February 2012)
- Site Upgraded to Drupal 7 (4th January 2012)
2011
- How to Install and Configure Subversion (SVN) Server on Ubuntu (19th October 2011)
- Create Multigroups in Drupal 7 using Field Collections (28th August 2011)
- Imagefield Import Archive (23rd May 2011)
- Proctors Hosting the next Drupal Meetup (20th May 2011)
- Proctor & Stevenson (31st March 2011)
- Display the Number of Facebook fans in PHP (15th March 2011)
- Easily Embed TypeKit Fonts into your Drupal Website (14th February 2011)
2010
- Use Regular Expressions to Search and Replace in Coda or TextMate (4th November 2010)
- Create a Better Photo Gallery in Drupal - Part 2.1 (22nd October 2010)
- Create a Better Photo Gallery in Drupal - Part 3 (13th October 2010)
- How to Create and Apply Patches (10th October 2010)
- The Inaugural Meetup for the South Wales Drupal User Group (26th September 2010)
- Review of the Image Caption Module (20th August 2010)
- Create a Better Photo Gallery in Drupal - Part 2 (17th August 2010)
- Create a Better Photo Gallery in Drupal - Part 1 (11th August 2010)
- Review of the Admin:hover Module (10th August 2010)
- Review of the Teleport Module (12th July 2010)
- Add a Taxonomy Term to Multiple Nodes Using SQL (7th July 2010)
- Create Virtual Hosts on Mac OS X Using VirtualHostX (2nd July 2010)
- Change the Content Type of Multiple Nodes Using SQL (1st July 2010)
- Create a Flickr Photo Gallery Using Feeds, CCK and Views (28th June 2010)
- 10 Useful Drupal 6 Modules (25th June 2010)
- Create a Block of Social Media Icons using CCK, Views and Nodequeue (23rd June 2010)
- Improve JPG Quality in Imagecache and ImageAPI (2nd June 2010)
- Quickly Import Multiples Images Using the Imagefield_Import Module (29th May 2010)
- Create a Slideshow of Multiple Images Using Fancy Slide (25th May 2010)
- Quickly Create Zen Subthemes Using Zenophile (10th May 2010)
- Conditional Email Addresses in a Webform (6th May 2010)
- Using ImageCache and ImageCrop for my Portfolio (28th April 2010)
- Style Drupal 6's Taxonomy Lists with PHP, CSS and jQuery (5th April 2010)