09 Jul 2026
Drupal.org aggregator
Talking Drupal: TD Cafe #018 - Drupal Site Templates
Join Martin, Andy and Mike as they discuss what Drupal site templates are and how they differ from Drupal's traditionally bare-bones starting point, aiming to reduce setup effort and total cost of ownership while making Drupal competitive again for small nonprofits and smaller sites. They compare building templates versus client sites, covering the evolution from early Layout Builder/Recipes work to today's simpler packaging via a Drush site:export workflow, plus tooling like DripYard Recipe Builder for extracting reusable "recipe" parts.
For show notes visit: https://www.talkingDrupal.com/cafe018
Topics Martin Anderson-Clutz
Based in London, Ontario, Martin transitioned from graphic design to web development, ultimately specializing in Drupal in 2005. Currently working as a Product Marketing Manager at Acquia, he is Triple Certified in Drupal and UX-certified by the world-renowned Nielsen Norman Group. His key contributions include: As a speaker & writer, presenting at Drupalcamps and Drupalcons, and a published blogger across multiple platforms, including the Acquia Dev Portal and opensource.com; as a podcast host, participating in the Talking Drupal podcast, including as the "Module of the Week" correspondent; and as an open source maintainer, developing and maintaining popular Drupal contrib modules and recipes, including Smart Date and Fullcalendar.
Andy Giles
Andy is a Drupal back-end developer. In 2012, he founded Blue Oak Interactive, a development and consulting agency focused on complex Drupal site builds, particularly in e-commerce. In 2025, he partnered with Mike Herchel to launch Dripyard, a premium Drupal theme designed to reduce the cost of ownership and enhance the developer experience for modern Drupal projects.
Mike Herchel
Mike is a founder & developer at Dripyard, and is a longtime contributor to Drupal. He has played a key role in modernizing Drupal's frontend architecture, performance, and accessibility, and is known for helping bring Drupal's component-driven development into mainstream use. Mike has delivered projects for organizations including IBM, the U.S. Small Business Administration, and the U.S. court system. He is a frequent speaker on performance, accessibility, and modern frontend practices.
- What Are Site Templates
- Drupal CMS Template Picker
- Why Templates Matter
- Building Templates Workflow
- Recipes And Custom Tooling
- Canvas And Theme Strategy
- React Components And AI
- Drupal 11.4 Compatibility
- Canvas Patterns Explained
- Pricing Adoption And AI
- AI In Their Workflow
- Internal Templates And Wrap Up
Guests
Martin Anderson-Clutz - mandclu.com mandclu
Andy Giles - andyg5000 Dripyard
Mike Herchel - mherchel Dripyard
09 Jul 2026 4:01am GMT
08 Jul 2026
Drupal.org aggregator
Aten Design Group: Using AI to Moderate Content in an Existing Drupal Workflow
Using AI to Moderate Content in an Existing Drupal Workflow Joel Steidl Drupal
A New Solution to An Old Problem
Content moderation is a data processing problem. For large sites with many content contributors, moderators can get bogged down catching obvious content policy violations without having time to do real editorial work.
Meanwhile, AI is great at fast, consistent classification of text, which is exactly the kind of work that can clog an editorial queue. It's not a replacement for human judgment: it makes mistakes, it can be gamed, and it lacks context. But as a first-pass filter, AI can meaningfully shrink the noise that reaches a human reviewer.
This post walks through adding that type of AI content filter to an existing Drupal workflow using contrib modules and no custom code.
Implementing the Solution
Modules
The full solution uses zero custom code. Here are the key contrib modules:
- drupal/ai - Provider-agnostic AI framework
- drupal/ai_provider_openai - OpenAI integration for
drupal/ai - drupal/ai_integration_eca - ECA action plugins for AI operations, including a dedicated Moderation action
- drupal/key - Secure API key storage via environment variable
- drupal/eca - Event-Condition-Action automation engine
The Basic Setup
The assumption is that a site already has a working Content Moderation workflow. The AI gate slots in between author submission and the editor queue:
[Before] Draft → Needs Review → Published [After] Draft → Needs Review → [AI gate] → AI Review Passed → Published ↘ Rejected
To support this, the workflow needs two new states (AI Review Passed, Rejected) and two new transitions (AI Approve, AI Reject). Those transitions should not be granted to any UI role as they're triggered only by ECA.
The five modules listed above need to be installed, an AI provider configured with a securely stored API key, and the updated workflow applied to the relevant content type.

The ECA Model
This is the core of the implementation.
Create a new ECA model at Admin → Configuration → ECA. The model has five nodes:
1. Event - Workflow: state transition Fires when an article transitions to needs_review.
2. Action - Token: set value Stores [entity:body:value] into a token named moderation_input. This uses ECA's token replacement, which resolves field values correctly at runtime. (A note on this: the more obvious Get field value action returns null for body fields in practice - token replacement is the right approach here.)
3. Action - Moderation (from AI Integration for ECA) Calls the AI provider's moderation operation. Set model to openai / omni-moderation-latest, token input to moderation_input, and token result to ai_result. The result token exposes [ai_result:flagged] (1 or 0) and [ai_result:information] (per-category scores).
4. Action - Workflow: transition (condition: [ai_result:flagged] = 1) Transitions to rejected. Revision log: AI moderation: content flagged.
5. Action - Workflow: transition (condition: [ai_result:flagged] = 1, negated) Transitions to ai_review_passed. Revision log: AI moderation: content passed initial screening.
The conditions use ECA's built-in Compare two scalar values plugin. Steps 4 and 5 share the same condition - one negated, one not.


Testing
Submitting a benign article routes it to ai_review_passed with the pass log entry. Submitting content that violates the violence policy routes it to rejected with the flagged log entry. Both transitions appear in the node's revision history with the AI-stamped message.

Going Further
Custom Moderation Prompts
The OpenAI Moderation API uses fixed categories. If your policy doesn't map to them cleanly - community guidelines, brand safety rules, domain-specific restrictions - you can replace the Moderation action with a Chat action and a configurable system prompt. The rest of the ECA model stays the same.
With a Chat action returning structured JSON (response_format: json_object), you define exactly what the AI evaluates and how it reports back. The downstream ECA conditions check the response token the same way. This makes the screening logic editable in the UI without a code change or redeploy.
Giving Authors a Path Forward
A bare rejection with no context isn't great author experience. ECA can handle the follow-on steps too. On the rejection branch, you can chain additional actions before or after the transition: send the author an email using [ai_result:information] to surface which categories were flagged, set a message on the form, or move the node to a Needs Revision state rather than a hard Rejected - giving authors the ability to edit and resubmit rather than starting over.
You could also model a full revision loop: Rejected → Needs Revision → Needs Review (with the AI check firing again on resubmit). Whether that's appropriate depends on your content volume and how much trust you extend to repeat offenders, but the workflow and ECA config support it without any custom code.
Closing Notes
The drupal/ai_integration_eca module is what makes this approach work cleanly. Without it, inserting AI into an ECA model would require a custom action plugin. With it, the entire integration is UI-configurable and exportable as config.
A few things worth knowing before you build on this:
- The
ai_ecasubmodule insidedrupal/aiis deprecated as of 1.x. Usedrupal/ai_integration_eca(a separate package) instead. drupal/ai_integration_ecais still at RC as of this writing - worth checking for a stable release before going to production.
08 Jul 2026 10:16pm GMT
DDEV Blog: TYPO3 Projects on Coder.ddev.com

coder.ddev.com gives you a full DDEV environment in the cloud, no local Docker required. This is a quick look at using it for a TYPO3 project with the freeform template.
For general background on coder.ddev.com, including access requirements and the other available templates, see the announcement post.
Watch the Video
What You'll See
- How to get access to coder.ddev.com
- Creating a coder.ddev.com workspace with the freeform template
- Cloning the rfay/typo3demo project and running
ddev coder-setup+ddev start - Fixing a
trustedHostsPatternerror withddev restartafter Composer brings in the rest of the code - The working site and TYPO3 backend on the workspace's
*.coder.ddev.comsubdomain - Two ways to share it: natively with other coder.ddev.com users, or publicly with
ddev share
Steps
- Get access to coder.ddev.com either via your organization having "partner" status with DDEV Foundation or by asking for access.
- Log in to coder.ddev.com with GitHub and create a workspace using the freeform template. The project name you choose matters, since coder.ddev.com uses it to set up proxying.
- Open a terminal in the workspace (web terminal, VS Code Web, or SSH via the
coderCLI) and clone your TYPO3 project. - Run
ddev coder-setuponce in the project directory, thenddev start. If the project has apost-startComposer install hook, like rfay/typo3demo, it'll finish setting itself up automatically. - If
ddev launchshows a trusted-host error, it's because Composer brought in the rest of the code after the firstddev startalready generatedadditional.php. Runddev restartto regenerate it, then reload.
Sharing What You Built
The workspace can be shared with other coder.ddev.com users directly, without any extra setup.
It can also be shared with ddev share, since rfay/typo3demo uses a relative base (/camino) instead of a hardcoded URL. Projects that do hardcode a full URL in base need the pre-share/post-share hook fix described in Sharing Your TYPO3 Project with ddev share.
Learn More
- Introducing coder.ddev.com: DDEV in the Cloud
- github.com/ddev/coder-ddev - templates and source for the freeform, drupal-core, and drupal-contrib templates
- DDEV TYPO3 quickstart
If you have questions, reach out in any of the support channels.
Follow our blog, Bluesky, LinkedIn, Mastodon, and join us on Discord. Sign up for the monthly newsletter.
This article was edited and refined with assistance from Claude Code.
08 Jul 2026 9:55pm GMT
05 Jul 2026
Symfony Blog
A Week of Symfony #1018 (June 29 – July 5, 2026)
This week, Symfony released Twig 3.28.0, with improvements to macros and the sandbox. In addition, we published a case study on using Symfony in the industrial sector. Lastly, we proposed a redesign of the exception page for Symfony applications. Symfony…
05 Jul 2026 7:18am GMT
03 Jul 2026
Symfony Blog
Twig 3.28.0 released
Twig 3.28.0 is out. This release sharpens error reporting with column numbers, brings back dynamic macro calls through the dot operator, and continues to polish the sandbox with less runtime overhead and finer-grained allow-listing. As usual, it also ships…
03 Jul 2026 8:52pm GMT
02 Jul 2026
Symfony Blog
Case Study: Driving Green Innovation: How Symfony Empowered Veolia’s Digital Shift in Industrial Waste Management
When dealing with over 10 million tons of hazardous waste every year, IT operational efficiency is a prerquisite and a critical environmental and public health responsibility As the European leader in treating hazardous industrial waste and restoring…
02 Jul 2026 12:30pm GMT
01 Apr 2004
Planet PHP
ezSystems are classy folks

Last week I helped the folks at ezSystems debug some APC problems they were having. The problems ended up being a 64bit architecture problem (they have uber-fast Opterons) and the bug is now fixed in 2.0.3.
Today I received Python & XML from them (off my Amazon wishlist). Thanks guys!
On a side note, my wishlist seems borked. The list I get when I search on my email address or name is not the same one I can edit when I log into the site.
01 Apr 2004 6:53pm GMT
PHP april fools...
1st of April 2004 get's to it's end and I guess it's time, to summarize the recent April fools a bit. Not that I think anyone in the world believes in them, but some were quite funny:
1. Changes to case sensitivity in PHP.
Alan Knowles announced that PHP will change to the studlyCase API and therefor will get everything broken by changing established functions.
2. IBM takes over Zend.
Myself hacked a little article about IBM taking over Zend to make PHP a compete of Java.
3. The first PHP virus has been seen.
Wasn't there one last year, too?
4. PHP has been overtaken by Micro$oft.
Mhhh... a little bit unreliable, if they had been taken over by IBM this morning... Maybe one should first look, what others wrote...
5. And finally, PHP4 and 5 showed their real faces...
Take a look at a phpinfo() output!
I guess I missed some, so feel free to comment on this entry, if you found another!
01 Apr 2004 5:49pm GMT
PHP Virus Attacking Web Hosts
Symantec have a report of the virus here. I've yet to see any of the PHP news sites picking up on it but, using a virtual host account, managed to deliberately expose some PHP scripts to it. From examining the infected scripts, what's disturbing is once infected, every tim...
01 Apr 2004 12:19pm GMT