Change /talks to /presentations

This commit is contained in:
Oliver Davies 2024-09-02 18:00:00 +01:00
parent 8158c679fd
commit 37603296f0
91 changed files with 168 additions and 166 deletions

View file

@ -8,13 +8,13 @@ sculpin_content_types:
permalink: /podcast/:basename/ permalink: /podcast/:basename/
posts: posts:
permalink: /blog/:basename/ permalink: /blog/:basename/
talks: presentations:
permalink: /talks/:basename/ permalink: /presentations/:basename/
services: services:
Modules\Experience\TwigExtension\ExperienceTwigExtension: Modules\Experience\TwigExtension\ExperienceTwigExtension:
tags: tags:
- {name: twig.extension} - {name: twig.extension}
Modules\Talk\TwigExtension\TalkTwigExtension: Modules\Presentations\TwigExtension\PresentationTwigExtension:
tags: tags:
- {name: twig.extension} - {name: twig.extension}

View file

@ -35,8 +35,8 @@ menu_links:
url: /press url: /press
- title: Services - title: Services
url: /pricing url: /pricing
- title: Talks and Workshops - title: Presentations
url: /talks url: /presentations
- title: Podcast - title: Podcast
url: /podcast url: /podcast
- title: Daily list - title: Daily list

View file

@ -1,52 +1,52 @@
<?php <?php
namespace Modules\Talk\Tests\TwigExtension; namespace Modules\Presentations\Tests\TwigExtension;
use Dflydev\DotAccessConfiguration\Configuration; use Dflydev\DotAccessConfiguration\Configuration;
use Modules\Talk\TwigExtension\TalkTwigExtension; use Modules\Presentations\TwigExtension\PresentationTwigExtension;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Sculpin\Contrib\ProxySourceCollection\ProxySourceItem; use Sculpin\Contrib\ProxySourceCollection\ProxySourceItem;
class TalkTwigExtensionTest extends TestCase class PresentationTwigExtensionTest extends TestCase
{ {
private TalkTwigExtension $extension; private PresentationTwigExtension $extension;
public function setUp(): void public function setUp(): void
{ {
$this->extension = new TalkTwigExtension(); $this->extension = new PresentationTwigExtension();
} }
public function testNoPastEvents(): void public function testNoPastEvents(): void
{ {
$talk = $this->createTalk( $presentation = $this->createPresentation(
events: [ events: [
['date' => (new \DateTime('+1 days'))->getTimestamp()], ['date' => (new \DateTime('+1 days'))->getTimestamp()],
], ],
); );
$this->assertTalkCount(expectedCount: 0, talks: [$talk]); $this->assertPresentationCount(expectedCount: 0, presentations: [$presentation]);
} }
public function testSinglePastEvent(): void public function testSinglePastEvent(): void
{ {
$talkA = $this->createTalk( $presentationA = $this->createPresentation(
events: [ events: [
['date' => (new \DateTime('+1 days'))->getTimestamp()], ['date' => (new \DateTime('+1 days'))->getTimestamp()],
], ],
); );
$talkB = $this->createTalk( $presentationB = $this->createPresentation(
events: [ events: [
['date' => (new \DateTime('-3 days'))->getTimestamp()], ['date' => (new \DateTime('-3 days'))->getTimestamp()],
], ],
); );
$this->assertTalkCount(expectedCount: 1, talks: [$talkA, $talkB]); $this->assertPresentationCount(expectedCount: 1, presentations: [$presentationA, $presentationB]);
} }
public function testSingleTalkWithMultiplePastEvents(): void public function testSinglePresentationWithMultiplePastEvents(): void
{ {
$talk = $this->createTalk( $presentation = $this->createPresentation(
events: [ events: [
['date' => (new \DateTime('-1 days'))->getTimestamp()], ['date' => (new \DateTime('-1 days'))->getTimestamp()],
['date' => (new \DateTime('-1 week'))->getTimestamp()], ['date' => (new \DateTime('-1 week'))->getTimestamp()],
@ -54,12 +54,12 @@ class TalkTwigExtensionTest extends TestCase
], ],
); );
$this->assertTalkCount(expectedCount: 3, talks: [$talk]); $this->assertPresentationCount(expectedCount: 3, presentations: [$presentation]);
} }
public function testSingleTalkWithMultiplePastAndFutureEvents(): void public function testSinglePresentationWithMultiplePastAndFutureEvents(): void
{ {
$talk = $this->createTalk( $presentation = $this->createPresentation(
events: [ events: [
['date' => (new \DateTime('+1 day'))->getTimestamp()], ['date' => (new \DateTime('+1 day'))->getTimestamp()],
['date' => (new \DateTime('-1 day'))->getTimestamp()], ['date' => (new \DateTime('-1 day'))->getTimestamp()],
@ -69,73 +69,73 @@ class TalkTwigExtensionTest extends TestCase
], ],
); );
$this->assertTalkCount(expectedCount: 3, talks: [$talk]); $this->assertPresentationCount(expectedCount: 3, presentations: [$presentation]);
} }
public function testMultiplePastEvents(): void public function testMultiplePastEvents(): void
{ {
$talkA = $this->createTalk( $presentationA = $this->createPresentation(
events: [ events: [
['date' => (new \DateTime('-1 days'))->getTimestamp()], ['date' => (new \DateTime('-1 days'))->getTimestamp()],
['date' => (new \DateTime('+1 days'))->getTimestamp()], ['date' => (new \DateTime('+1 days'))->getTimestamp()],
], ],
); );
$talkB = $this->createTalk( $presentationB = $this->createPresentation(
events: [ events: [
['date' => (new \DateTime('-3 days'))->getTimestamp()], ['date' => (new \DateTime('-3 days'))->getTimestamp()],
], ],
); );
$this->assertTalkCount(expectedCount: 2, talks: [$talkA, $talkB]); $this->assertPresentationCount(expectedCount: 2, presentations: [$presentationA, $presentationB]);
} }
public function testTheCurrentDayIsNotCounted(): void public function testTheCurrentDayIsNotCounted(): void
{ {
$talkA = $this->createTalk( $presentationA = $this->createPresentation(
events: [ events: [
['date' => (new \DateTime('yesterday'))->getTimestamp()], ['date' => (new \DateTime('yesterday'))->getTimestamp()],
['date' => (new \DateTime('today'))->getTimestamp()], ['date' => (new \DateTime('today'))->getTimestamp()],
], ],
); );
$talkB = $this->createTalk( $presentationB = $this->createPresentation(
events: [ events: [
['date' => (new \DateTime('today'))->getTimestamp()], ['date' => (new \DateTime('today'))->getTimestamp()],
], ],
); );
$talkC = $this->createTalk( $presentationC = $this->createPresentation(
events: [ events: [
['date' => (new \DateTime('yesterday'))->getTimestamp()], ['date' => (new \DateTime('yesterday'))->getTimestamp()],
], ],
); );
$this->assertTalkCount(expectedCount: 2, talks: [$talkA, $talkB, $talkC]); $this->assertPresentationCount(expectedCount: 2, presentations: [$presentationA, $presentationB, $presentationC]);
} }
/** /**
* Assert the extension uses the correct number of talks. * Assert the extension uses the correct number of presentations.
*/ */
private function assertTalkCount(int $expectedCount, array $talks): void private function assertPresentationCount(int $expectedCount, array $presentations): void
{ {
self::assertSame( self::assertSame(
actual: $this->extension->getPastTalkCount($talks), actual: $this->extension->getPresentationCount($presentations),
expected: $expectedCount, expected: $expectedCount,
); );
} }
/** /**
* Create a mock talk with a list of events. * Create a mock presentation with a list of events.
*/ */
private function createTalk(array $events): ProxySourceItem private function createPresentation(array $events): ProxySourceItem
{ {
$configuration = $this->createMock(Configuration::class); $configuration = $this->createMock(Configuration::class);
$configuration->method('get')->with($this->identicalTo('events'))->willReturn($events); $configuration->method('get')->with($this->identicalTo('events'))->willReturn($events);
$talk = $this->createMock(ProxySourceItem::class); $presentation = $this->createMock(ProxySourceItem::class);
$talk->method('data')->willReturn($configuration); $presentation->method('data')->willReturn($configuration);
return $talk; return $presentation;
} }
} }

View file

@ -1,31 +1,31 @@
<?php <?php
namespace Modules\Talk\TwigExtension; namespace Modules\Presentations\TwigExtension;
use Sculpin\Contrib\ProxySourceCollection\ProxySourceItem; use Sculpin\Contrib\ProxySourceCollection\ProxySourceItem;
use Twig\Extension\AbstractExtension; use Twig\Extension\AbstractExtension;
use Twig\TwigFunction; use Twig\TwigFunction;
class TalkTwigExtension extends AbstractExtension class PresentationTwigExtension extends AbstractExtension
{ {
public function getFunctions(): array public function getFunctions(): array
{ {
return [ return [
new TwigFunction('get_past_talk_count', [$this, 'getPastTalkCount']), new TwigFunction('get_presentation_count', [$this, 'getPresentationCount']),
]; ];
} }
public function getName(): string public function getName(): string
{ {
return 'modules.talk'; return 'modules.presentations';
} }
public function getPastTalkCount(array $talks): int public function getPresentationCount(array $presentations): int
{ {
$today = (new \DateTime('today'))->getTimestamp(); $today = (new \DateTime('today'))->getTimestamp();
return collect($talks) return collect($presentations)
->flatMap(fn (ProxySourceItem $talk) => $talk->data()->get('events')) ->flatMap(fn (ProxySourceItem $presentation) => $presentation->data()->get('events'))
->filter( ->filter(
function (array $event) use ($today): bool { function (array $event) use ($today): bool {
assert(array_key_exists(array: $event, key: 'date')); assert(array_key_exists(array: $event, key: 'date'));

View file

@ -21,11 +21,6 @@ RewriteRule ^(.*)index\.html$ /$1 [L,R=301]
ErrorDocument 404 /404/index.html ErrorDocument 404 /404/index.html
# RewriteCond %{REQUEST_URI} !^/archive/?$
# RewriteRule ^archive/(.*)$ /daily/$1 [L,R=301]
RewriteRule ^articles/(.*) /blog/$1 [L,R=301]
Redirect 301 /daily/2024/08/15/docblocks-or-annotations /daily/2024/08/15/docblocks-or-attributes Redirect 301 /daily/2024/08/15/docblocks-or-annotations /daily/2024/08/15/docblocks-or-attributes
Redirect 301 /10-useful-drupal-6-modules-i-use-every-project /blog/10-useful-drupal-6-modules Redirect 301 /10-useful-drupal-6-modules-i-use-every-project /blog/10-useful-drupal-6-modules
Redirect 301 /2010/04/05/styling-drupal-6s-taxonomy-lists-with-php-css-and-jquery /blog/style-drupal-6s-taxonomy-lists-php-css-jquery Redirect 301 /2010/04/05/styling-drupal-6s-taxonomy-lists-with-php-css-and-jquery /blog/style-drupal-6s-taxonomy-lists-php-css-jquery
@ -59,7 +54,7 @@ Redirect 301 /ansible https://galaxy.ansible.com/opdavies
Redirect 301 /ansible-molecule /articles/test-driven-ansible-role-development-molecule Redirect 301 /ansible-molecule /articles/test-driven-ansible-role-development-molecule
Redirect 301 /ansistrano-code https://github.com/opdavies/dransible Redirect 301 /ansistrano-code https://github.com/opdavies/dransible
Redirect 301 /ansistrano-demo https://www.youtube.com/watch?v=PLS4ET7FAcU Redirect 301 /ansistrano-demo https://www.youtube.com/watch?v=PLS4ET7FAcU
Redirect 301 /ansistrano-slides /talks/deploying-php-ansible-ansistrano Redirect 301 /ansistrano-slides /presentations/deploying-php-ansible-ansistrano
Redirect 301 /archive/2022/10/20/run-vs-task-runner /archive/2022/10/19/run-vs-task-runners Redirect 301 /archive/2022/10/20/run-vs-task-runner /archive/2022/10/19/run-vs-task-runners
Redirect 301 /atNOQ https://youtu.be/r41dkD2EOo8 Redirect 301 /atNOQ https://youtu.be/r41dkD2EOo8
Redirect 301 /automatically-updating-talk-created-date https://gist.github.com/opdavies/4e75e1753d8603113f07f8264bb783d6 Redirect 301 /automatically-updating-talk-created-date https://gist.github.com/opdavies/4e75e1753d8603113f07f8264bb783d6
@ -206,7 +201,7 @@ Redirect 301 /blog/drupal-8-commerce-fixing-no-such-customer-error-checkout /blo
Redirect 301 /blog/drupal-8-commerce-fixing-no-such-customer-error-on-checkout /blog/drupal-8-commerce-fixing-no-such-customer-error-checkou Redirect 301 /blog/drupal-8-commerce-fixing-no-such-customer-error-on-checkout /blog/drupal-8-commerce-fixing-no-such-customer-error-checkou
Redirect 301 /blog/drupal-vm-generator-291-released /blog/drupal-vm-generator-updates Redirect 301 /blog/drupal-vm-generator-291-released /blog/drupal-vm-generator-updates
Redirect 301 /blog/drupalcamp-london-2019-tickets /blog/drupalcamp-london-2019-tickets-available-call-sessions Redirect 301 /blog/drupalcamp-london-2019-tickets /blog/drupalcamp-london-2019-tickets-available-call-sessions
Redirect 301 /blog/drush-make-drupalbristol /talks/drush-make-drupalbristol Redirect 301 /blog/drush-make-drupalbristol /presentations/drush-make-drupalbristol
Redirect 301 /blog/easier-git-repository-cloning-with-insteadof /blog/easier-git-repository-cloning-insteadof Redirect 301 /blog/easier-git-repository-cloning-with-insteadof /blog/easier-git-repository-cloning-insteadof
Redirect 301 /blog/easier-sculpin-commands-with-composer-and-npm-scripts /blog/easier-sculpin-commands-composer-npm-scripts Redirect 301 /blog/easier-sculpin-commands-with-composer-and-npm-scripts /blog/easier-sculpin-commands-composer-npm-scripts
Redirect 301 /blog/editing-meetup-videos-kdenlive /blog/editing-meetup-videos-linux-kdenlive Redirect 301 /blog/editing-meetup-videos-kdenlive /blog/editing-meetup-videos-linux-kdenlive
@ -275,7 +270,7 @@ Redirect 301 /code-enigma-interview https://blog.codeenigma.com/interview-with-a
Redirect 301 /consulting / Redirect 301 /consulting /
Redirect 301 /contrib-half-hour https://www.youtube.com/playlist?list=PLu-MxhbnjI9rHroPvZO5LEUhr58Yl0j_F Redirect 301 /contrib-half-hour https://www.youtube.com/playlist?list=PLu-MxhbnjI9rHroPvZO5LEUhr58Yl0j_F
Redirect 301 /cv /cv.txt Redirect 301 /cv /cv.txt
Redirect 301 /d0P5z /talks/drupal-8-php-libraries-drupalorg-api Redirect 301 /d0P5z /presentations/drupal-8-php-libraries-drupalorg-api
Redirect 301 /d7 /drupal7 Redirect 301 /d7 /drupal7
Redirect 301 /dcbristol-cfp https://www.papercall.io/drupalcamp-bristol-2019 Redirect 301 /dcbristol-cfp https://www.papercall.io/drupalcamp-bristol-2019
Redirect 301 /dcbristol17-videos https://www.youtube.com/playlist?list=PLOwPvExSyLLngtd6R4PUD9MCXa6QL_obA Redirect 301 /dcbristol17-videos https://www.youtube.com/playlist?list=PLOwPvExSyLLngtd6R4PUD9MCXa6QL_obA
@ -284,7 +279,7 @@ Redirect 301 /dclondon-sat https://drupalcamp.london/schedule/saturday
Redirect 301 /dclondon-sun https://drupalcamp.london/schedule/sunday Redirect 301 /dclondon-sun https://drupalcamp.london/schedule/sunday
Redirect 301 /dclondon20 /articles/drupalcamp-london-testing-workshop Redirect 301 /dclondon20 /articles/drupalcamp-london-testing-workshop
Redirect 301 /ddev-phpunit-command /blog/creating-custom-phpunit-command-ddev Redirect 301 /ddev-phpunit-command /blog/creating-custom-phpunit-command-ddev
Redirect 301 /deploying-php-ansible /talks/deploying-php-ansible-ansistrano Redirect 301 /deploying-php-ansible /presentations/deploying-php-ansible-ansistrano
Redirect 301 /dks7E https://www.youtube.com/watch?v=PLS4ET7FAcU Redirect 301 /dks7E https://www.youtube.com/watch?v=PLS4ET7FAcU
Redirect 301 /do-library https://github.com/opdavies/drupalorg-api-php Redirect 301 /do-library https://github.com/opdavies/drupalorg-api-php
Redirect 301 /do-projects https://github.com/opdavies/drupal-module-drupalorg-projects Redirect 301 /do-projects https://github.com/opdavies/drupal-module-drupalorg-projects
@ -306,7 +301,7 @@ Redirect 301 /drupal-php-developer /drupal-consultant
Redirect 301 /drupal-php-developer-consultant-uk /drupal-php-developer Redirect 301 /drupal-php-developer-consultant-uk /drupal-php-developer
Redirect 301 /drupal-tailwind-demo https://www.youtube.com/watch?v=1eM-Gw6GI4g Redirect 301 /drupal-tailwind-demo https://www.youtube.com/watch?v=1eM-Gw6GI4g
Redirect 301 /drupal-tailwindcss https://www.drupal.org/project/tailwindcss Redirect 301 /drupal-tailwindcss https://www.drupal.org/project/tailwindcss
Redirect 301 /drupal-vuejs /talks/decoupling-drupal-vuejs/ Redirect 301 /drupal-vuejs /presentations/decoupling-drupal-vuejs
Redirect 301 /drupal7 /drupal-upgrade Redirect 301 /drupal7 /drupal-upgrade
Redirect 301 /drupalcamp-london-2019-tickets /articles/drupalcamp-london-2019-tickets Redirect 301 /drupalcamp-london-2019-tickets /articles/drupalcamp-london-2019-tickets
Redirect 301 /drupalcamp-nyc-training https://www.youtube.com/watch?v=3M9c4UUzKm0 Redirect 301 /drupalcamp-nyc-training https://www.youtube.com/watch?v=3M9c4UUzKm0
@ -318,7 +313,7 @@ Redirect 301 /feed /rss.xml
Redirect 301 /first-drupal-core-issue https://www.drupal.org/project/drupal/issues/753898 Redirect 301 /first-drupal-core-issue https://www.drupal.org/project/drupal/issues/753898
Redirect 301 /first-npm-package https://www.npmjs.com/package/tailwindcss-vuejs Redirect 301 /first-npm-package https://www.npmjs.com/package/tailwindcss-vuejs
Redirect 301 /freeagent https://opdavies.freeagent.com Redirect 301 /freeagent https://opdavies.freeagent.com
Redirect 301 /git-flow /talks/git-flow Redirect 301 /git-flow /presentations/git-flow
Redirect 301 /github-sculpin https://github.com/opdavies?tab=repositories&q=sculpin Redirect 301 /github-sculpin https://github.com/opdavies?tab=repositories&q=sculpin
Redirect 301 /gitlab https://gitlab.com/opdavies Redirect 301 /gitlab https://gitlab.com/opdavies
Redirect 301 /gitstore https://enjoy.gitstore.app/maintainers/opdavies Redirect 301 /gitstore https://enjoy.gitstore.app/maintainers/opdavies
@ -338,7 +333,7 @@ Redirect 301 /oliver-davies-uk-based-drupal-symfony-developer /oliver-davies-uk-
Redirect 301 /pair-programming /pair Redirect 301 /pair-programming /pair
Redirect 301 /pair-with-me /pair Redirect 301 /pair-with-me /pair
Redirect 301 /pairing /pair Redirect 301 /pairing /pair
Redirect 301 /php-ansible /talks/deploying-php-ansible-ansistrano Redirect 301 /php-ansible /presentations/deploying-php-ansible-ansistrano
Redirect 301 /qSHAl /articles/published-my-first-npm-package/ Redirect 301 /qSHAl /articles/published-my-first-npm-package/
Redirect 301 /qT1Rb https://github.com/opdavies/drupal-meetups-twitterbot Redirect 301 /qT1Rb https://github.com/opdavies/drupal-meetups-twitterbot
Redirect 301 /rebuilding-acquia https://rebuilding-acquia.oliverdavies.uk Redirect 301 /rebuilding-acquia https://rebuilding-acquia.oliverdavies.uk
@ -350,9 +345,9 @@ Redirect 301 /rebuilding-symfony https://github.com/opdavies/rebuilding-symfony
Redirect 301 /rk29B https://www.meetup.com/PHP-South-Wales/events/268422525 Redirect 301 /rk29B https://www.meetup.com/PHP-South-Wales/events/268422525
Redirect 301 /roadmap /drupal-upgrade Redirect 301 /roadmap /drupal-upgrade
# Redirect 301 /rss /rss.xml # Redirect 301 /rss /rss.xml
Redirect 301 /rst2pdf /talks/building-presenting-slide-decks-rst2pdf Redirect 301 /rst2pdf /presentations/building-presenting-slide-decks-rst2pdf
Redirect 301 /s9MjJ https://symfonycasts.com/screencast/symfony Redirect 301 /s9MjJ https://symfonycasts.com/screencast/symfony
Redirect 301 /sculpin /talks/building-static-websites-sculpin Redirect 301 /sculpin /presentations/building-static-websites-sculpin
Redirect 301 /sculpin-encore-versioning https://github.com/opdavies/oliverdavies.uk/commit/d192b04aefa6e7a21bfc1f2e0fe0a16111e0e8a2 Redirect 301 /sculpin-encore-versioning https://github.com/opdavies/oliverdavies.uk/commit/d192b04aefa6e7a21bfc1f2e0fe0a16111e0e8a2
Redirect 301 /sites/default/files/images/social-avatar. /images/social-avatar.jpg Redirect 301 /sites/default/files/images/social-avatar. /images/social-avatar.jpg
Redirect 301 /skills https://opdavies-skills-tailwindcss.netlify.com/ Redirect 301 /skills https://opdavies-skills-tailwindcss.netlify.com/
@ -371,69 +366,76 @@ Redirect 301 /symfony https://connect.symfony.com/profile/opdavies
Redirect 301 /symfony-server /articles/running-drupal-with-symfony-local-server Redirect 301 /symfony-server /articles/running-drupal-with-symfony-local-server
Redirect 301 /symfonylive /articles/live-blogging-symfonylive-london Redirect 301 /symfonylive /articles/live-blogging-symfonylive-london
Redirect 301 /symposium https://symposiumapp.com/u/opdavies Redirect 301 /symposium https://symposiumapp.com/u/opdavies
Redirect 301 /tailwind-css-talk /talks/taking-flight-tailwind-css Redirect 301 /tailwind-css-talk /presentations/taking-flight-tailwind-css
Redirect 301 /tailwind-repos https://github.com/opdavies?utf8=%E2%9C%93&tab=repositories&q=tailwindcss Redirect 301 /tailwind-repos https://github.com/opdavies?utf8=%E2%9C%93&tab=repositories&q=tailwindcss
Redirect 301 /tailwind-talk /talks/taking-flight-with-tailwind-css Redirect 301 /tailwind-talk /presentations/taking-flight-with-tailwind-css
Redirect 301 /tailwindcss-demo http://tailwindcss-demo.oliverdavies.uk/ Redirect 301 /tailwindcss-demo http://tailwindcss-demo.oliverdavies.uk/
Redirect 301 /talks /presentations
Redirect 301 /talks-offer-tweet https://twitter.com/opdavies/status/1250870367712935938 Redirect 301 /talks-offer-tweet https://twitter.com/opdavies/status/1250870367712935938
Redirect 301 /talks/2012/09/05/what-is-this-drupal-thing-unified-diff /talks/what-is-this-drupal-thing Redirect 301 /talks/2012/09/05/what-is-this-drupal-thing-unified-diff /presentations/what-is-this-drupal-thing
Redirect 301 /talks/2013/07/10/drupal-ldap-swdug /talks/drupal-ldap Redirect 301 /talks/2013/07/10/drupal-ldap-swdug /presentations/drupal-ldap
Redirect 301 /talks/2014/03/01/git-flow-drupalcamp-london-2014 /talks/git-flow Redirect 301 /talks/2014/03/01/git-flow-drupalcamp-london-2014 /presentations/git-flow
Redirect 301 /talks/2014/07/02/drush-make-drupalbristol-drupal-bristol /talks/drush-make-drupalbristol Redirect 301 /talks/2014/07/02/drush-make-drupalbristol-drupal-bristol /presentations/drush-make-drupalbristol
Redirect 301 /talks/2014/08/19/drupal-association-swdug /talks/drupal-association Redirect 301 /talks/2014/08/19/drupal-association-swdug /presentations/drupal-association
Redirect 301 /talks/2015/01/18/drupalorg-2015-drupalcamp-brighton-2015 /talks/drupalorg-in-2015-whats-coming-next Redirect 301 /talks/2015/01/18/drupalorg-2015-drupalcamp-brighton-2015 /presentations/drupalorg-in-2015-whats-coming-next
Redirect 301 /talks/2015/02/28/drupalorg-2015-drupalcamp-london-2015 /talks/drupalorg-in-2015-whats-coming-next Redirect 301 /talks/2015/02/28/drupalorg-2015-drupalcamp-london-2015 /presentations/drupalorg-in-2015-whats-coming-next
Redirect 301 /talks/2015/04/08/drupal-8-phpsw /talks/drupal-8 Redirect 301 /talks/2015/04/08/drupal-8-phpsw /presentations/drupal-8
Redirect 301 /talks/2015/07/25/test-drive-twig-with-sculpin-drupalcamp-north-2015 /talks/test-drive-twig-with-sculpin Redirect 301 /talks/2015/07/25/test-drive-twig-with-sculpin-drupalcamp-north-2015 /presentations/test-drive-twig-with-sculpin
Redirect 301 /talks/2015/08/25/dancing-for-drupal-umbristol /talks/dancing-for-drupal Redirect 301 /talks/2015/08/25/dancing-for-drupal-umbristol /presentations/dancing-for-drupal
Redirect 301 /talks/2015/10/14/sculpin-phpsw /talks/sculpin Redirect 301 /talks/2015/10/14/sculpin-phpsw /presentations/sculpin
Redirect 301 /talks/2016/03/05/drupal-8-module-development-drupalcamp-london-2016 /talks/getting-started-with-drupal-8-module-development Redirect 301 /talks/2016/03/05/drupal-8-module-development-drupalcamp-london-2016 /presentations/getting-started-with-drupal-8-module-development
Redirect 301 /talks/2016/03/09/drupal-vm-generator-nwdug /talks/drupal-vm-generator Redirect 301 /talks/2016/03/09/drupal-vm-generator-nwdug /presentations/drupal-vm-generator
Redirect 301 /talks/2016/04/02/drupal-vm-generator-drupal-bristol /talks/drupal-vm-generator Redirect 301 /talks/2016/04/02/drupal-vm-generator-drupal-bristol /presentations/drupal-vm-generator
Redirect 301 /talks/2016/06/11/drupal-8-rejoining-the-herd-php-south-coast-2016 /talks/drupal-8-rejoining-the-herd Redirect 301 /talks/2016/06/11/drupal-8-rejoining-the-herd-php-south-coast-2016 /presentations/drupal-8-rejoining-the-herd
Redirect 301 /talks/2016/07/23/drupal-vm-meet-symfony-console-drupalcamp-bristol-2016 /talks/drupal-vm-meet-symfony-console Redirect 301 /talks/2016/07/23/drupal-vm-meet-symfony-console-drupalcamp-bristol-2016 /presentations/drupal-vm-meet-symfony-console
Redirect 301 /talks/2016/11/09/drupal-development-with-composer-phpsw /talks/drupal-development-with-composer Redirect 301 /talks/2016/11/09/drupal-development-with-composer-phpsw /presentations/drupal-development-with-composer
Redirect 301 /talks/2016/11/17/goodbye-drush-make-hello-composer-drupal-bristol /talks/goodbye-drush-make-hello-composer Redirect 301 /talks/2016/11/17/goodbye-drush-make-hello-composer-drupal-bristol /presentations/goodbye-drush-make-hello-composer
Redirect 301 /talks/2017/01/18/getting-your-data-into-drupal-8-drupal-bristol /talks/getting-your-data-into-drupal-8 Redirect 301 /talks/2017/01/18/getting-your-data-into-drupal-8-drupal-bristol /presentations/getting-your-data-into-drupal-8
Redirect 301 /talks/2017/03/04/getting-your-data-into-drupal-8-drupalcamp-london-2017 /talks/getting-your-data-into-drupal-8 Redirect 301 /talks/2017/03/04/getting-your-data-into-drupal-8-drupalcamp-london-2017 /presentations/getting-your-data-into-drupal-8
Redirect 301 /talks/ansible-ansistrano https://www.oliverdavies.uk/talks/deploying-php-ansible-ansistrano Redirect 301 /talks/ansible-ansistrano https://www.oliverdavies.uk/presentations/deploying-php-ansible-ansistrano
Redirect 301 /talks/archive /talks Redirect 301 /talks/archive /presentations
Redirect 301 /talks/deploying-php-applications-fabric /talks/deploying-php-fabric Redirect 301 /talks/deploying-php-applications-fabric /presentations/deploying-php-fabric
Redirect 301 /talks/deploying-php-applications-with-fabric /talks/deploying-php-fabric Redirect 301 /talks/deploying-php-applications-with-fabric /presentations/deploying-php-fabric
Redirect 301 /talks/drupal-vm-generator-2 /talks/drupal-vm-generator Redirect 301 /talks/drupal-vm-generator-2 /presentations/drupal-vm-generator
Redirect 301 /talks/drupalorg-2015-2 /talks/drupalorg-2015 Redirect 301 /talks/drupalorg-2015-2 /presentations/drupalorg-2015
Redirect 301 /talks/drupalorg-in-2015-whats-coming-next /talks/drupalorg-2015 Redirect 301 /talks/drupalorg-in-2015-whats-coming-next /presentations/drupalorg-2015
Redirect 301 /talks/getting-started-with-drupal-8-module-development /drupal-8-module-development Redirect 301 /talks/getting-started-with-drupal-8-module-development /drupal-8-module-development
Redirect 301 /talks/having-fun-drupal-8-php-libraries-drupalorg-api /talks/drupal-8-php-libraries-drupalorg-api Redirect 301 /talks/having-fun-drupal-8-php-libraries-drupalorg-api /presentations/drupal-8-php-libraries-drupalorg-api
Redirect 301 /talks/never-commit-master-introduction-git-flow /talks/git-flow Redirect 301 /talks/never-commit-master-introduction-git-flow /presentations/git-flow
Redirect 301 /talks/sculpin /talks/building-static-websites-sculpin Redirect 301 /talks/sculpin /presentations/building-static-websites-sculpin
Redirect 301 /talks/tailwind /talks/taking-flight-with-tailwind-css/ Redirect 301 /talks/tailwind /presentations/taking-flight-with-tailwind-css/
Redirect 301 /talks/taking-flight-tailwind-css /talks/taking-flight-with-tailwind-css Redirect 301 /talks/taking-flight-tailwind-css /presentations/taking-flight-with-tailwind-css
Redirect 301 /talks/using-laravel-collections-outside-laravel /talks/using-illuminate-collections-outside-laravel Redirect 301 /talks/using-laravel-collections-outside-laravel /presentations/using-illuminate-collections-outside-laravel
Redirect 301 /talks/working-workspace /talks/working-with-workspace Redirect 301 /talks/working-workspace /presentations/working-with-workspace
Redirect 301 /tdd-blog https://github.com/opdavies/drupal-module-tdd-blog Redirect 301 /tdd-blog https://github.com/opdavies/drupal-module-tdd-blog
Redirect 301 /tdd-test-driven-drupal /talks/tdd-test-driven-drupal/ Redirect 301 /tdd-test-driven-drupal /presentations/tdd-test-driven-drupal/
Redirect 301 /team-coaching / Redirect 301 /team-coaching /
Redirect 301 /test-driven-drupal-book /test-driven-drupal Redirect 301 /test-driven-drupal-book /test-driven-drupal
Redirect 301 /testing-drupal https://www.oliverdavies.uk/talks/tdd-test-driven-drupal Redirect 301 /testing-drupal /presentations/tdd-test-driven-drupal
Redirect 301 /testing-drupal-intro https://inviqa.com/blog/drupal-automated-testing-introduction Redirect 301 /testing-drupal-intro https://inviqa.com/blog/drupal-automated-testing-introduction
Redirect 301 /testing-tailwind-plugins /articles/testing-tailwindcss-plugins-with-jest Redirect 301 /testing-tailwind-plugins /articles/testing-tailwindcss-plugins-with-jest
Redirect 301 /testing-workshop https://github.com/opdavies/workshop-drupal-automated-testing Redirect 301 /testing-workshop https://github.com/opdavies/workshop-drupal-automated-testing
Redirect 301 /testing-workshop-code https://github.com/opdavies/workshop-drupal-automated-testing-code Redirect 301 /testing-workshop-code https://github.com/opdavies/workshop-drupal-automated-testing-code
Redirect 301 /todoist-filters https://gist.github.com/opdavies/6709fbdac5c3babbd94137bcc8b8e3c2 Redirect 301 /todoist-filters https://gist.github.com/opdavies/6709fbdac5c3babbd94137bcc8b8e3c2
Redirect 301 /twitter-tweaks https://github.com/opdavies/chrome-extension-twitter-tweaks Redirect 301 /twitter-tweaks https://github.com/opdavies/chrome-extension-twitter-tweaks
Redirect 301 /upgrading-to-drupal-9 /talks/upgrading-your-site-drupal-9 Redirect 301 /upgrading-to-drupal-9 /presentations/upgrading-your-site-drupal-9
Redirect 301 /uxbjV https://www.drupal.org/project/copyright_block Redirect 301 /uxbjV https://www.drupal.org/project/copyright_block
Redirect 301 /vyTEF https://www.npmjs.com/package/tailwindcss-vuejs Redirect 301 /vyTEF https://www.npmjs.com/package/tailwindcss-vuejs
Redirect 301 /webpack-encore-pcss-regex https://regexr.com/51iaf Redirect 301 /webpack-encore-pcss-regex https://regexr.com/51iaf
Redirect 301 /wordcamp-bristol-tailwindcss https://2019.bristol.wordcamp.org/session/taking-flight-with-tailwind-css Redirect 301 /wordcamp-bristol-tailwindcss https://2019.bristol.wordcamp.org/session/taking-flight-with-tailwind-css
Redirect 301 /wordpress-tailwind https://github.com/opdavies/wordcamp-bristol-2019 Redirect 301 /wordpress-tailwind https://github.com/opdavies/wordcamp-bristol-2019
Redirect 301 /work /drupal-php-developer Redirect 301 /work /drupal-php-developer
Redirect 301 /working-with-workspace /talks/working-with-workspace Redirect 301 /working-with-workspace /presentations/working-with-workspace
Redirect 301 /workshop-drupal-testing https://github.com/opdavies/workshop-drupal-automated-testing Redirect 301 /workshop-drupal-testing https://github.com/opdavies/workshop-drupal-automated-testing
Redirect 301 /workspace-demo https://github.com/opdavies/working-with-workspace-demo Redirect 301 /workspace-demo https://github.com/opdavies/working-with-workspace-demo
Redirect 301 /wp-tailwind https://wp-tailwind.oliverdavies.uk Redirect 301 /wp-tailwind https://wp-tailwind.oliverdavies.uk
Redirect 301 /wp-tailwind-repo https://github.com/opdavies/wordcamp-bristol-2019 Redirect 301 /wp-tailwind-repo https://github.com/opdavies/wordcamp-bristol-2019
Redirect 301 /wp-tailwind-starter https://github.com/opdavies/wordpress-tailwindcss-startker-kit Redirect 301 /wp-tailwind-starter https://github.com/opdavies/wordpress-tailwindcss-startker-kit
Redirect 301 /wp-tailwind-static https://wp-tailwind.oliverdavies.uk Redirect 301 /wp-tailwind-static https://wp-tailwind.oliverdavies.uk
Redirect 301 /yXhoS /talks/things-you-should-know-about-php Redirect 301 /yXhoS /presentations/things-you-should-know-about-php
# RewriteCond %{REQUEST_URI} !^/archive/?$
# RewriteRule ^archive/(.*)$ /daily/$1 [L,R=301]
RewriteRule ^articles/(.*) /blog/$1 [L,R=301]
RewriteRule ^talks/(.*) /presentations/$1 [L,R=301]

View file

@ -33,4 +33,4 @@ I also worked on an event booking and management website, where we had code resp
The great thing about testing is that it gives you confidence that everything still works how you expect - not only when you wrote the code, but also in the future. The great thing about testing is that it gives you confidence that everything still works how you expect - not only when you wrote the code, but also in the future.
I've talked about this, and how to get started with automated testing in Drupal, in a presentation called [TDD - Test-Driven Drupal]({{site.url}}/talks/tdd-test-driven-drupal). If you want to find out more, the slides and a video recording are embedded there. I've talked about this, and how to get started with automated testing in Drupal, in a presentation called [TDD - Test-Driven Drupal]({{site.url}}/presentations/tdd-test-driven-drupal). If you want to find out more, the slides and a video recording are embedded there.

View file

@ -35,7 +35,7 @@ Makefiles work well, but I don't use the full functionality that they offer, suc
In the example, to pass arguments to the `drush` command, I'd have to type `ARGS="cache:rebuild" make drush` for them to get added and the command to work as expected. In the example, to pass arguments to the `drush` command, I'd have to type `ARGS="cache:rebuild" make drush` for them to get added and the command to work as expected.
An agency that I worked for created and open-sourced their own Makefile-like tool, written in PHP and built on Symfony Console. I gave a talk on it called [Working with Workspace]({{site.url}}/talks/working-with-workspace) and used it on some of my own personal and client projects. An agency that I worked for created and open-sourced their own Makefile-like tool, written in PHP and built on Symfony Console. I gave a talk on it called [Working with Workspace]({{site.url}}/presentations/working-with-workspace) and used it on some of my own personal and client projects.
## What I'm using now ## What I'm using now

View file

@ -21,4 +21,4 @@ There may be other constraints like budgets or deadlines to consider - maybe som
There are situations though where a tool may be the best choice even though it's not the ideal fit based purely on the technical requirements. Maybe the client is already familiar with publishing content in Drupal, or an in-house development team is used to working with a certain tool or language. In that case, those things should be considered too. There are situations though where a tool may be the best choice even though it's not the ideal fit based purely on the technical requirements. Maybe the client is already familiar with publishing content in Drupal, or an in-house development team is used to working with a certain tool or language. In that case, those things should be considered too.
Also, for me, having a chance to evaluate other technologies and explore what's happening outside of the Drupal ecosystem is a good opportunity. A lot of what I've learned about automated testing, for example, is from the wider PHP and JavaScript communities, as well as tools like [Tailwind CSS]({{site.url}}/talks/taking-flight-with-tailwind-css) and [Illuminate Collections]({{site.url}}//talks/using-illuminate-collections-outside-laravel) that I've been able to bring back into my other Drupal projects. Also, for me, having a chance to evaluate other technologies and explore what's happening outside of the Drupal ecosystem is a good opportunity. A lot of what I've learned about automated testing, for example, is from the wider PHP and JavaScript communities, as well as tools like [Tailwind CSS]({{site.url}}/presentations/taking-flight-with-tailwind-css) and [Illuminate Collections]({{site.url}}//presentations/using-illuminate-collections-outside-laravel) that I've been able to bring back into my other Drupal projects.

View file

@ -23,7 +23,7 @@ I started to use Tachyons on some personal and client projects as a layer on oth
I was working in this way on a project when I released that I could use Tailwind for all of the styling instead of just adding small sprinklings of utilities here and there. I refactored everything and removed the other framework that I'd been using - leaving just Tailwind CSS. I was working in this way on a project when I released that I could use Tailwind for all of the styling instead of just adding small sprinklings of utilities here and there. I refactored everything and removed the other framework that I'd been using - leaving just Tailwind CSS.
With the exception of some legacy projects, now I use Tailwind CSS exclusively and have used it for a number of projects. I've given lunch and learn sessions to teams that I've worked on, [presented a Tailwind CSS talk]({{site.url}}/talks/taking-flight-tailwind-css) at a number of PHP, Drupal, WordPress, and JavaScript events, and maintain [a starter-kit theme](https://www.drupal.org/project/tailwindcss) for using Tailwind in custom Drupal themes. With the exception of some legacy projects, now I use Tailwind CSS exclusively and have used it for a number of projects. I've given lunch and learn sessions to teams that I've worked on, [presented a Tailwind CSS talk]({{site.url}}/presentations/taking-flight-tailwind-css) at a number of PHP, Drupal, WordPress, and JavaScript events, and maintain [a starter-kit theme](https://www.drupal.org/project/tailwindcss) for using Tailwind in custom Drupal themes.
I've also rebuilt a [number of existing sites]({{site.url}}/blog/uis-ive-rebuilt-tailwind-css) as examples and written some [Tailwind CSS related blog posts]({{site.url}}/blog/tags/tailwind-css). I've also rebuilt a [number of existing sites]({{site.url}}/blog/uis-ive-rebuilt-tailwind-css) as examples and written some [Tailwind CSS related blog posts]({{site.url}}/blog/tags/tailwind-css).

View file

@ -27,7 +27,7 @@ You can use it within a playbook, and you'll be prompted to re-enter the passwor
Rather than a single string, you could have a file of variables that you want to encrypt. You can do this by running `ansible-vault encrypt vault.yml` and include it as before. Again, you'll be prompted by Ansible so that it can decrypt and use the values. Rather than a single string, you could have a file of variables that you want to encrypt. You can do this by running `ansible-vault encrypt vault.yml` and include it as before. Again, you'll be prompted by Ansible so that it can decrypt and use the values.
For an example of how I'm using Ansible Vault, see [the Dransible repository](https://github.com/opdavies/dransible/tree/986ba5097d62ff4cd0e637d40181bab2c4417f2e/tools/ansible) on GitHub or my [ Deploying PHP applications with Ansible, Ansible Vault and Ansistrano]({{site.url}}/talks/deploying-php-ansible-ansistrano) talk. For an example of how I'm using Ansible Vault, see [the Dransible repository](https://github.com/opdavies/dransible/tree/986ba5097d62ff4cd0e637d40181bab2c4417f2e/tools/ansible) on GitHub or my [ Deploying PHP applications with Ansible, Ansible Vault and Ansistrano]({{site.url}}/presentations/deploying-php-ansible-ansistrano) talk.
--- ---

View file

@ -64,4 +64,4 @@ public function the_admin_page_is_accessible_by_admin_users() {
} }
``` ```
Hopefully, this shows how quickly you can get tests running for a Drupal module. If you'd like to see more, the slides and video recording of my [Test-Driven Drupal talk]({{site.url}}/talks/tdd-test-driven-drupal) are online. Hopefully, this shows how quickly you can get tests running for a Drupal module. If you'd like to see more, the slides and video recording of my [Test-Driven Drupal talk]({{site.url}}/presentations/tdd-test-driven-drupal) are online.

View file

@ -23,6 +23,6 @@ There are other advantages too - clients or product owners are generally happier
If you're familiar with the DevOps Research and Assessment (DORA) team, three of their key metrics are deployment frequency, lead time for changes, and time to restore service. All of these are improved by small and frequent releases. If you're familiar with the DevOps Research and Assessment (DORA) team, three of their key metrics are deployment frequency, lead time for changes, and time to restore service. All of these are improved by small and frequent releases.
In my [Deployments with Ansible and Ansistrano talk](https://www.oliverdavies.uk/talks/deploying-php-ansible-ansistrano), I mention that there is a separate rollback role, but I don't think that I've ever used it. In my [Deployments with Ansible and Ansistrano talk](https://www.oliverdavies.uk/presentations/deploying-php-ansible-ansistrano), I mention that there is a separate rollback role, but I don't think that I've ever used it.
Because I'm deploying small changes often, it's usually much easier to fix forward than it is to rollback, and knowing this makes me a lot less anxious when deploying changes. Because I'm deploying small changes often, it's usually much easier to fix forward than it is to rollback, and knowing this makes me a lot less anxious when deploying changes.

View file

@ -8,7 +8,7 @@ permalink: >-
Im happy to have had a conference talk proposal accepted for what will be my first in-person conference since DrupalCamp London in February 2020. Im happy to have had a conference talk proposal accepted for what will be my first in-person conference since DrupalCamp London in February 2020.
Ill be giving my "[Taking Flight with Tailwind CSS](https://www.oliverdavies.uk/talks/taking-flight-with-tailwind-css)" talk for the first time since February 2021, and in front of an in-person audience since June 2019. Ill be giving my "[Taking Flight with Tailwind CSS](https://www.oliverdavies.uk/presentations/taking-flight-with-tailwind-css)" talk for the first time since February 2021, and in front of an in-person audience since June 2019.
The talk itself will need some updating. The last time I gave it, Tailwind CSS was on version 2.0.3. Its now on version 3.2.2 and includes features like the just-in-time engine, arbitrary values and variants, container queries, and a load of new utility classes. The talk itself will need some updating. The last time I gave it, Tailwind CSS was on version 2.0.3. Its now on version 3.2.2 and includes features like the just-in-time engine, arbitrary values and variants, container queries, and a load of new utility classes.

View file

@ -14,7 +14,7 @@ After reading this, my question is, "Should you, or do you need to, create branc
These days, I use trunk-based development as much as possible, so I hardly ever create new branches, whether working on a project myself or with a team. These days, I use trunk-based development as much as possible, so I hardly ever create new branches, whether working on a project myself or with a team.
[I used to use Git Flow](https://www.oliverdavies.uk/talks/git-flow) and create branches for every new feature and bug fix, but I remember, whilst demonstrating two work-in-progress features to a client, switching between the different branches caused my local site to break. Whilst it wasnt a major issue, it wouldn't have seemed professional. [I used to use Git Flow](https://www.oliverdavies.uk/presentations/git-flow) and create branches for every new feature and bug fix, but I remember, whilst demonstrating two work-in-progress features to a client, switching between the different branches caused my local site to break. Whilst it wasnt a major issue, it wouldn't have seemed professional.
In a team environment, feature branches are intended to keep different changes and different people's work separate. In a team environment, feature branches are intended to keep different changes and different people's work separate.

View file

@ -12,12 +12,12 @@ I had some early presents this month and have been accepted to present talks at
## PHP Stoke ## PHP Stoke
The first PHP Stoke meetup will be held at Genr8 Smithfield Works on the 12th of January. I'll be presenting "[Things you should know about PHP](https://www.oliverdavies.uk/talks/things-you-should-know-about-php)". It'll be great to be the first speaker at this new meetup. The first PHP Stoke meetup will be held at Genr8 Smithfield Works on the 12th of January. I'll be presenting "[Things you should know about PHP](https://www.oliverdavies.uk/presentations/things-you-should-know-about-php)". It'll be great to be the first speaker at this new meetup.
## nor(DEV):con ## nor(DEV):con
The Norfolk Developers conference is in Norwich on the 23rd and 24th of February. The Norfolk Developers conference is in Norwich on the 23rd and 24th of February.
I'll be presenting "[Taking Flight about Tailwind CSS](https://www.oliverdavies.uk/talks/taking-flight-with-tailwind-css)". It's been a while since I last gave this talk so I'm looking forward to updating it with the latest changes and new features in Tailwind CSS. I'll be presenting "[Taking Flight about Tailwind CSS](https://www.oliverdavies.uk/presentations/taking-flight-with-tailwind-css)". It's been a while since I last gave this talk so I'm looking forward to updating it with the latest changes and new features in Tailwind CSS.
It'll be great to be speaking at these events and hopefully others in 2023. It'll be great to be speaking at these events and hopefully others in 2023.

View file

@ -13,8 +13,8 @@ I took a bit of time off from these emails whilst I was preparing for the first
It was a great event with around 35 attendees and two other speakers as well as myself. It was a great event with around 35 attendees and two other speakers as well as myself.
The [latest version of my slides are online](https://www.oliverdavies.uk/talks/things-you-should-know-about-php) as well [some updated resources](https://www.oliverdavies.uk/things-about-php). The [latest version of my slides are online](https://www.oliverdavies.uk/presentations/things-you-should-know-about-php) as well [some updated resources](https://www.oliverdavies.uk/things-about-php).
My next talk will be at the Norfolk Developers conference next month where I'll be presenting an updated version of [Taking Flight with Tailwind CSS](https://www.oliverdavies.uk/talks/taking-flight-with-tailwind-css). My next talk will be at the Norfolk Developers conference next month where I'll be presenting an updated version of [Taking Flight with Tailwind CSS](https://www.oliverdavies.uk/presentations/taking-flight-with-tailwind-css).
If you have a topic idea for a talk or would like me to speak at your meetup or conference, please get in touch. If you have a topic idea for a talk or would like me to speak at your meetup or conference, please get in touch.

View file

@ -8,7 +8,7 @@ tags:
- php - php
--- ---
The talk that I gave last week at PHP Stoke was [Things to know about PHP](https://www.oliverdavies.uk/talks/things-you-should-know-about-php) - a talk that I was originally asked to give at the Swansea Software Development Meetup (SSDC) in January 2019, and this was the second time that I've been asked to give this talk at a PHP meetup. The talk that I gave last week at PHP Stoke was [Things to know about PHP](https://www.oliverdavies.uk/presentations/things-you-should-know-about-php) - a talk that I was originally asked to give at the Swansea Software Development Meetup (SSDC) in January 2019, and this was the second time that I've been asked to give this talk at a PHP meetup.
Originally to give a group of various Software Developers an introduction to PHP, I didn't want the talk to be focused just on the language itself and be a walkthough the PHP manual. Originally to give a group of various Software Developers an introduction to PHP, I didn't want the talk to be focused just on the language itself and be a walkthough the PHP manual.

View file

@ -16,7 +16,7 @@ Last month, I started my first Drupal 10 project for a client.
I'm proud that over a year of that time was spent working for the Drupal Association where I improved the Drupal.org websites and resolved issues that would have blocked the Drupal 8 release in 2015. I'm proud that over a year of that time was spent working for the Drupal Association where I improved the Drupal.org websites and resolved issues that would have blocked the Drupal 8 release in 2015.
I'm also happy to have [presented talks and workshops](https://www.oliverdavies.uk/talks) at events like DrupalCamps, Drupal Developer Days and twice at DrupalCon. I've also organised Drupal events such as the Drupal Bristol meetup and DrupalCamp Bristol conference. I'm also happy to have [presented talks and workshops](https://www.oliverdavies.uk/presentations) at events like DrupalCamps, Drupal Developer Days and twice at DrupalCon. I've also organised Drupal events such as the Drupal Bristol meetup and DrupalCamp Bristol conference.
I've had opportunities to contribute to open-source by having patches committed to Drupal core and maintaining modules and themes like [Override Node Options](https://www.drupal.org/project/override_node_options) and the [Tailwind CSS starter kit](https://www.drupal.org/project/tailwindcss). I've also mentored and helped others to get their first commits to Drupal core and open-source. I've had opportunities to contribute to open-source by having patches committed to Drupal core and maintaining modules and themes like [Override Node Options](https://www.drupal.org/project/override_node_options) and the [Tailwind CSS starter kit](https://www.drupal.org/project/tailwindcss). I've also mentored and helped others to get their first commits to Drupal core and open-source.

View file

@ -9,7 +9,7 @@ tags:
- tailwind-css - tailwind-css
--- ---
Previously when I gave my [Taking Flight with Tailwind CSS](https://www.oliverdavies.uk/talks/taking-flight-with-tailwind-css) talk, I created examples that relate to the event such as something related to that technology or event. Previously when I gave my [Taking Flight with Tailwind CSS](https://www.oliverdavies.uk/presentations/taking-flight-with-tailwind-css) talk, I created examples that relate to the event such as something related to that technology or event.
The nor(DEV):con website already uses Tailwind CSS so I've been looking for other examples and have started to build some of the [Bootstrap CSS components](https://getbootstrap.com/docs/4.0/examples) with Tailwind CSS. The nor(DEV):con website already uses Tailwind CSS so I've been looking for other examples and have started to build some of the [Bootstrap CSS components](https://getbootstrap.com/docs/4.0/examples) with Tailwind CSS.

View file

@ -10,7 +10,7 @@ I'm always working on various personal and client projects, and they contain a l
The majority of those files are the same with some slight configuration for each project - such as whether it uses `web` or `docroot`, or which paths are checked with static analysis or for coding standards issues. The majority of those files are the same with some slight configuration for each project - such as whether it uses `web` or `docroot`, or which paths are checked with static analysis or for coding standards issues.
I've given a talk called [Working with Workspace](https://www.oliverdavies.uk/talks/working-with-workspace) - a tool that we used at an agency I worked at. It had two functions - to execute project tasks and to generate configuration files from templates. I've given a talk called [Working with Workspace](https://www.oliverdavies.uk/presentations/working-with-workspace) - a tool that we used at an agency I worked at. It had two functions - to execute project tasks and to generate configuration files from templates.
I use a `justfile` to execute tasks and commands but needed to write my own tool to generate the configuration files. I use a `justfile` to execute tasks and commands but needed to write my own tool to generate the configuration files.

View file

@ -9,7 +9,7 @@ tags:
- open-source - open-source
--- ---
Note: The numbers within this post are taken from my [Test-Driven Drupal talk](https://www.oliverdavies.uk/talks/tdd-test-driven-drupal), in which I also talk about this. Note: The numbers within this post are taken from my [Test-Driven Drupal talk](https://www.oliverdavies.uk/presentations/tdd-test-driven-drupal), in which I also talk about this.
My first commit to the 7.x-1.x branch of the Override Node Options module was in March 2012. According to Drupal.org, the module was used on 9,212 websites then. My first commit to the 7.x-1.x branch of the Override Node Options module was in March 2012. According to Drupal.org, the module was used on 9,212 websites then.

View file

@ -24,5 +24,5 @@ If you have any questions, hit reply and let me know!
[commerce_example]: https://github.com/opdavies/docker-example-drupal-commerce-kickstart [commerce_example]: https://github.com/opdavies/docker-example-drupal-commerce-kickstart
[example]: https://github.com/opdavies/docker-example-drupal [example]: https://github.com/opdavies/docker-example-drupal
[slides]: https://www.oliverdavies.uk/talks/building-build-configs [slides]: https://www.oliverdavies.uk/presentations/building-build-configs
[video]: https://www.oliverdavies.uk/build-configs [video]: https://www.oliverdavies.uk/build-configs

View file

@ -48,5 +48,5 @@ It's quicker to create and onboard projects using existing configurations instea
If you want to see an example, [watch this video][video] where I set up a new Drupal 10 project from nothing to running website in less than a minute. If you want to see an example, [watch this video][video] where I set up a new Drupal 10 project from nothing to running website in less than a minute.
[build configs]: https://www.oliverdavies.uk/build-configs [build configs]: https://www.oliverdavies.uk/build-configs
[talk]: https://www.oliverdavies.uk/talks/building-build-configs [talk]: https://www.oliverdavies.uk/presentations/building-build-configs
[video]: https://www.youtube.com/watch?v=LkhsdmxReUc [video]: https://www.youtube.com/watch?v=LkhsdmxReUc

View file

@ -30,4 +30,4 @@ Register now to find out when the email course is live, or [read the first lesso
[atdc]: {{site.url}}/atdc [atdc]: {{site.url}}/atdc
[first lesson]: {{site.url}}/archive/2023/12/25/zero-to-test [first lesson]: {{site.url}}/archive/2023/12/25/zero-to-test
[working without workspace talk]: {{site.url}}/talks/working-without-workspace [working without workspace talk]: {{site.url}}/presentations/working-without-workspace

View file

@ -28,4 +28,4 @@ If you use it and don't like it, don't continue and return to what you did befor
Whether you keep it or not, you better understand what you're evaluating and not dismiss it out of hand. Whether you keep it or not, you better understand what you're evaluating and not dismiss it out of hand.
[talk]: {{site.url}}/talks/taking-flight-with-tailwind-css [talk]: {{site.url}}/presentations/taking-flight-with-tailwind-css

View file

@ -15,7 +15,7 @@ Here is some code from my website:
![A screenshot of the code that calculates the number of talks I've given.]({{site.url}}/assets/images/talk-count-code.png) ![A screenshot of the code that calculates the number of talks I've given.]({{site.url}}/assets/images/talk-count-code.png)
If you want, you can also [view it on GitHub](https://raw.githubusercontent.com/opdavies/oliverdavies.uk/main/source/_pages/talks.md). If you want, you can also [view it on GitHub](https://raw.githubusercontent.com/opdavies/oliverdavies.uk/main/source/_pages/presentations.md).
It is business logic responsible for counting the number of talks I've given at different events so I can display it on my Talks page. It is business logic responsible for counting the number of talks I've given at different events so I can display it on my Talks page.

View file

@ -21,7 +21,7 @@ It's one of my most popular talks and, during COVID lockdowns, I also gave a wor
If this helps anyone on their Tailwind CSS learning journey, please reply and let me know! If this helps anyone on their Tailwind CSS learning journey, please reply and let me know!
[recording]: https://www.youtube.com/watch?v=phFDKF-9j0Y [recording]: https://www.youtube.com/watch?v=phFDKF-9j0Y
[talk]: {{site.url}}/talks/taking-flight-with-tailwind-css [talk]: {{site.url}}/presentations/taking-flight-with-tailwind-css
{% endblock %} {% endblock %}
{% block cta %} {% block cta %}

View file

@ -20,5 +20,5 @@ If you'd like a sneak peek of the demo site I'm building, [it's on GitHub][repo]
[event]: https://www.meetup.com/php-sw/events/298880313 [event]: https://www.meetup.com/php-sw/events/298880313
[repo]: https://github.com/opdavies/phpsw-sculpin-demo [repo]: https://github.com/opdavies/phpsw-sculpin-demo
[talk]: {{site.url}}/talks/test-drive-twig-with-sculpin [talk]: {{site.url}}/presentations/test-drive-twig-with-sculpin
[tweet]: https://twitter.com/opdavies/status/1754629305575874738 [tweet]: https://twitter.com/opdavies/status/1754629305575874738

View file

@ -42,4 +42,4 @@ I don't need to think about whether this branch is a feature or a hotfix, and I'
Do what works best for you and your team, but don't adopt something because it's the "standard" approach. Do what works best for you and your team, but don't adopt something because it's the "standard" approach.
[talk]: {{site.url}}/talks/git-flow [talk]: {{site.url}}/presentations/git-flow

View file

@ -26,5 +26,5 @@ You can [watch the full stream][video] on YouTube now. I'll split it into sectio
I won't post a link to every video here, so please subscribe to my YouTube channel to be notified when I go live next. I won't post a link to every video here, so please subscribe to my YouTube channel to be notified when I go live next.
[build configs]: {{site.url}}/build-configs [build configs]: {{site.url}}/build-configs
[talk]: {{site.url}}/talks/building-build-configs [talk]: {{site.url}}/presentations/building-build-configs
[video]: https://www.youtube.com/watch?v=Wlkcf1PLWN8 [video]: https://www.youtube.com/watch?v=Wlkcf1PLWN8

View file

@ -18,5 +18,5 @@ In the talk, I explain what Sculpin is and how it works before a live demo where
If you have any feedback or questions, reply to this email and let me know. If you have any feedback or questions, reply to this email and let me know.
[talk]: {{site.url}}/talks/building-static-websites-sculpin [talk]: {{site.url}}/presentations/building-static-websites-sculpin
[video]: https://youtu.be/axy6ltc9meA?si=FtR4DZ5BVi_Se60J [video]: https://youtu.be/axy6ltc9meA?si=FtR4DZ5BVi_Se60J

View file

@ -28,4 +28,4 @@ Ansible is a great tool for this type of task and, just because it's a tool I ha
It's still in my toolkit, just in case I need it. It's still in my toolkit, just in case I need it.
[commit]: https://github.com/opdavies/oliverdavies.uk/commit/cd6575c6fcc091a0b7c98b6985b3a92b85e279e3 [commit]: https://github.com/opdavies/oliverdavies.uk/commit/cd6575c6fcc091a0b7c98b6985b3a92b85e279e3
[talk]: {{site.url}}/talks/deploying-php-ansible-ansistrano [talk]: {{site.url}}/presentations/deploying-php-ansible-ansistrano

View file

@ -19,5 +19,5 @@ We discussed his experience with coding bootcamps, getting into the software ind
It will be released soon on [the Beyond Blocks podcast page][1]. It will be released soon on [the Beyond Blocks podcast page][1].
[0]: {{site.url}}/talks/communities-contribution [0]: {{site.url}}/presentations/communities-contribution
[1]: {{site.url}}/podcast [1]: {{site.url}}/podcast

View file

@ -60,4 +60,4 @@ If I tried searching for `.sidebar-wrapper` or `.sidebar-wrapper a:hover`, they
It's taken me a while to get back into this way of working with CSS, but it does remind me [why I prefer to use utility styles][talk] for my own projects. It's taken me a while to get back into this way of working with CSS, but it does remind me [why I prefer to use utility styles][talk] for my own projects.
[nesting]: {{site.url}}/daily/2024/07/08/back-to-sass-and-traditional-css [nesting]: {{site.url}}/daily/2024/07/08/back-to-sass-and-traditional-css
[talk]: {{site.url}}/talks/taking-flight-with-tailwind-css [talk]: {{site.url}}/presentations/taking-flight-with-tailwind-css

View file

@ -46,6 +46,6 @@ Similar to feature flags, this is temporary code that will later be removed when
In the future, I can refactor the internal logic to use a different approach and when I'm ready, eventually remove the compatibility layer and tag a new major version with the breaking changes. In the future, I can refactor the internal logic to use a different approach and when I'm ready, eventually remove the compatibility layer and tag a new major version with the breaking changes.
[0]: {{site.url}}/talks/building-build-configs [0]: {{site.url}}/presentations/building-build-configs
[1]: {{site.url}}/talks/working-with-workspace [1]: {{site.url}}/presentations/working-with-workspace
[2]: https://github.com/ALT-F4-LLC/build-configs [2]: https://github.com/ALT-F4-LLC/build-configs

View file

@ -32,7 +32,7 @@ Similar to [why I use Linux][4], I believe in owning your own content rather tha
And I learned something new about Git at the same time. And I learned something new about Git at the same time.
[0]: {{site.url}}/talks/test-drive-twig-with-sculpin [0]: {{site.url}}/presentations/test-drive-twig-with-sculpin
[1]: https://git-scm.com/docs/git-merge#Documentation/git-merge.txt---allow-unrelated-histories [1]: https://git-scm.com/docs/git-merge#Documentation/git-merge.txt---allow-unrelated-histories
[3]: https://github.com/opdavies/oliverdavies.uk [3]: https://github.com/opdavies/oliverdavies.uk
[4]: {{site.url}}/daily/2024/07/31/why-i-use-linux [4]: {{site.url}}/daily/2024/07/31/why-i-use-linux

View file

@ -24,4 +24,4 @@ There is no styling yet, as I wanted to focus on deploying the MVP version, but
At the moment, I'm focusing on writing as often as possible for this email list and in my new Zettelkasten. At the moment, I'm focusing on writing as often as possible for this email list and in my new Zettelkasten.
[0]: https://zet.oliverdavies.uk [0]: https://zet.oliverdavies.uk
[1]: {{site.url}}/talks/building-static-websites-sculpin [1]: {{site.url}}/presentations/building-static-websites-sculpin

View file

@ -22,7 +22,7 @@ I have some things I want to make sure I mention, so expect a note in my Zettlek
If you're interested, [here's the demo website][2] I did for PHP South West, [along with the code on GitHub][3]. If you're interested, [here's the demo website][2] I did for PHP South West, [along with the code on GitHub][3].
[0]: {{site.url}}/talks/building-static-websites-sculpin [0]: {{site.url}}/presentations/building-static-websites-sculpin
[1]: https://zet.oliverdavies.uk [1]: https://zet.oliverdavies.uk
[2]: https://phpsw-sculpin-demo.oliverdavies.uk [2]: https://phpsw-sculpin-demo.oliverdavies.uk
[3]: https://github.com/opdavies/phpsw-sculpin-demo [3]: https://github.com/opdavies/phpsw-sculpin-demo

View file

@ -8,7 +8,7 @@
</div> </div>
<div class="{{ site.prose_classes }}"> <div class="{{ site.prose_classes }}">
<p>I'm an Acquia-certified Drupal Triple Expert with {{ get_years_of_experience() }} years of experience, an open-source software maintainer and Drupal core contributor, <a href="/talks">public speaker</a>, <a href="{{ site.youtube.channel.url }}/streams">live streamer</a>, and host of the <a href="/podcast">Beyond Blocks podcast</a>.</p> <p>I'm an Acquia-certified Drupal Triple Expert with {{ get_years_of_experience() }} years of experience, an open-source software maintainer and Drupal core contributor, <a href="/presentations">public speaker</a>, <a href="{{ site.youtube.channel.url }}/streams">live streamer</a>, and host of the <a href="/podcast">Beyond Blocks podcast</a>.</p>
</div> </div>
</div> </div>
</div> </div>

View file

@ -3,15 +3,15 @@
{% block content_wrapper %} {% block content_wrapper %}
{{ parent() }} {{ parent() }}
{% include 'talk/slides' with { {% include 'presentation/slides' with {
speakerdeck: page.speakerdeck, speakerdeck: page.speakerdeck,
} %} } %}
{% include 'talk/video' with { {% include 'presentation/video' with {
video: page.video, video: page.video,
} %} } %}
{% include 'talk/events' with { {% include 'presentation/events' with {
events: page.events, events: page.events,
} %} } %}
{% endblock %} {% endblock %}

View file

@ -6,7 +6,7 @@ title: Page not found
Perhaps you were looking for one of these pages: Perhaps you were looking for one of these pages:
- [Products and services](/pricing) - [Products and services](/pricing)
- [Public speaking and workshops](/talks) - [Public speaking and workshops](/presentations)
- [My daily email list](/daily) - [My daily email list](/daily)
- [The Beyond Blocks podcast](/podcast) - [The Beyond Blocks podcast](/podcast)

@ -1 +1 @@
Subproject commit 646df70626c07503d7ab7e90c8d257c63fb1e5b7 Subproject commit f31e5c4364890b2a31b3acd961f78565ad822de9

View file

@ -9,7 +9,7 @@ title: Hi, PHP Oxford!
{% block content %} {% block content %}
Thanks for attending my talk on [Build Configs](/build-configs). Thanks for attending my talk on [Build Configs](/build-configs).
[These are the slides](/talks/building-build-configs) I presented and the example video: [These are the slides](/presentations/building-build-configs) I presented and the example video:
{% include 'youtube-video' with { id: 'LkhsdmxReUc'} %} {% include 'youtube-video' with { id: 'LkhsdmxReUc'} %}
@ -21,7 +21,7 @@ If you have any further questions, let me know.
[Get in touch](/contact) if you're interested in using Build Configs-based managed configuration files in your projects (I offer one-off implementations or ongoing updates via a subscription), you need an in-house tool built for your team, or if we can [work together another way](/pricing). [Get in touch](/contact) if you're interested in using Build Configs-based managed configuration files in your projects (I offer one-off implementations or ongoing updates via a subscription), you need an in-house tool built for your team, or if we can [work together another way](/pricing).
If you liked the talk, or [any of my others](/talks), I can also present talks and run workshops for companies. If you liked the talk, or [any of my others](/presentations), I can also present talks and run workshops for companies.
## While you're here ## While you're here

View file

@ -28,8 +28,8 @@ All emails are sent from my personal email address, so you can press reply and c
[consulting]: /consulting [consulting]: /consulting
[course]: /atdc [course]: /atdc
[email list]: /daily [email list]: /daily
[tailwind css]: /talks/taking-flight-with-tailwind-css [tailwind css]: /presentations/taking-flight-with-tailwind-css
[test driven drupal]: /talks/tdd-test-driven-drupal [test driven drupal]: /presentations/tdd-test-driven-drupal
[workshop]: /archive/2024/01/22/tailwind-css-workshop-recording [workshop]: /archive/2024/01/22/tailwind-css-workshop-recording
{% endblock %} {% endblock %}

View file

@ -9,7 +9,7 @@ title: PHP Berkshire
{% block content %} {% block content %}
Thank you for attending my Sculpin talk at PHP Berkshire. Thank you for attending my Sculpin talk at PHP Berkshire.
[The slides and a previous recording](/talks/building-static-websites-sculpin) are on the talk page. [The slides and a previous recording](/presentations/building-static-websites-sculpin) are on the talk page.
To see an example of a Sculpin project, you can see [the source code for this website](https://github.com/opdavies/oliverdavies.uk), [my Zettlekasten](https://github.com/opdavies/zet.oliverdavies.uk) or [my demo for PHP South West](https://github.com/opdavies/phpsw-sculpin-demo). To see an example of a Sculpin project, you can see [the source code for this website](https://github.com/opdavies/oliverdavies.uk), [my Zettlekasten](https://github.com/opdavies/zet.oliverdavies.uk) or [my demo for PHP South West](https://github.com/opdavies/phpsw-sculpin-demo).

View file

@ -0,0 +1,18 @@
---
title: Presentations
use: [presentations]
---
Since September 2012, I have given {{ get_presentation_count(data.presentations) }} public talks and workshops at various conferences and meetups, in-person and remotely, on topics including PHP, Drupal, automated testing, Git, CSS, and systems administration.
{% for talk in data.presentations|sort((a, b) => a.events|last.date|date('U') > b.events|last.date|date('U') ? -1 : 1) %}
<article>
<div class="not-prose">
<h2 class="text-xl font-bold">
<a class="font-bold text-blue-primary dark:text-blue-400" href="{{ talk.url|trim('/', 'right') }}">{{ talk.title }}</a>
</h2>
</div>
<p>{{ talk.description }}</p>
</article>
{% endfor %}

View file

@ -1,18 +0,0 @@
---
title: Talks and Workshops
use: [talks]
---
Since September 2012, I have given {{ get_past_talk_count(data.talks) }} public presentations and workshops at various conferences and meetups, in-person and remotely, on topics including PHP, Drupal, automated testing, Git, CSS, and systems administration.
{% for talk in data.talks|sort((a, b) => a.events|last.date|date('U') > b.events|last.date|date('U') ? -1 : 1) %}
<article>
<div class="not-prose">
<h2 class="text-xl font-bold">
<a class="font-bold text-blue-primary dark:text-blue-400" href="{{ talk.url|trim('/', 'right') }}">{{ talk.title }}</a>
</h2>
</div>
<p>{{ talk.description }}</p>
</article>
{% endfor %}

View file

@ -70,7 +70,7 @@ that weve written on my work project over the last few months.
I didnt record this workshop, but I have exported the slides and embedded them I didnt record this workshop, but I have exported the slides and embedded them
below: below:
{% include 'talk/slides' with { {% include 'presentation/slides' with {
speakerdeck: { speakerdeck: {
id: '2679401cb2ad421789d372cb8d38e368', id: '2679401cb2ad421789d372cb8d38e368',
ratio: '1.77777777777778', ratio: '1.77777777777778',

View file

@ -13,7 +13,7 @@ tweets: true
Here are my slides from my "What is Git Flow?" session at Here are my slides from my "What is Git Flow?" session at
[DrupalCamp London](http://2014.drupalcamplondon.co.uk). [DrupalCamp London](http://2014.drupalcamplondon.co.uk).
{% include 'talk/slides' with { speakerdeck: { {% include 'presentation/slides' with { speakerdeck: {
data_id: '201559e0f103013198dd5a5f6f23ab67' } data_id: '201559e0f103013198dd5a5f6f23ab67' }
} only %} } only %}

View file

@ -52,4 +52,4 @@ This session will cover various topics including:
[4]: https://laravel.com/docs/collections [4]: https://laravel.com/docs/collections
[5]: https://github.com/opdavies/drupal-module-drupalorg-project-statistics [5]: https://github.com/opdavies/drupal-module-drupalorg-project-statistics
[6]: https://github.com/opdavies/drupal-module-drupalversary [6]: https://github.com/opdavies/drupal-module-drupalversary
[7]: /talks/using-laravel-collections-outside-laravel/ [7]: /presentations/using-laravel-collections-outside-laravel/