<?xml version="1.0" encoding="utf-8" standalone="no"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0" xml:base="https://www.drupaleasy.com/">
  <channel>
    <title>DrupalEasy Tutorials, News, Quicktips, Video, and Podcasts.</title>
    <link>https://www.drupaleasy.com/</link>
    <description>DrupalEasy develops and executes high quality Drupal projects and comprehensive education and training programs. Our catalog of expert-instructor-led training curriculum includes the first publicly available, licensed Drupal career training programs in the world, as well as workshops and programs that all include our signature rich menu of follow-on learning resources. Our training efforts, community involvement, and consulting all integrate Drupal best practices and promote Drupal talent development around the world to help build the community and create new wealth-building skills for people with the requisite drive and abilities.</description>
    <language>en</language>
    
    <itunes:explicit>no</itunes:explicit><itunes:image href="http://drupaleasy.com/sites/all/themes/blueprint/drupaleasy_logo_100.png"/><itunes:keywords>drupal,development,php,cms,framework,content,nodes,howto,tutorial,screencast,video,audio,cck,views,panels,blocks,taxonomy,tips</itunes:keywords><itunes:summary>If you need a publishing system for an online newspaper, a podcast, a community, a social network, or just a webpage for your business, we think there's no better system to get you up and running than Drupal.</itunes:summary><itunes:subtitle>To teach and spread Drupal to all creatures great and small.</itunes:subtitle><itunes:category text="Technology"><itunes:category text="Software How-To"/></itunes:category><itunes:author>Michael Anello</itunes:author><itunes:owner><itunes:email>drupaleasy@gmail.com</itunes:email><itunes:name>Michael Anello</itunes:name></itunes:owner><item>
  <title>The challenges of launching the Drupal IXP program at this moment in time</title>
  <link>https://www.drupaleasy.com/blogs/ultimike/2025/06/challenges-launching-drupal-ixp-program-moment-time</link>
  <description>
&lt;p&gt;The &lt;a href="https://drupal.org/ixp"&gt;Drupal IXP&lt;/a&gt; program officially launched a couple of months ago, marking a significant step in our community's effort to build future talent. Modeled after traditional apprenticeship approaches (with the Drupal-y twist of 250 &lt;a href="https://www.drupal.org/drupalorg/docs/marketplace/contribution-credit-weight-and-impact-on-ranking to hiring organizations"&gt;contribution credits&lt;/a&gt;,) the program aims to connect newcomers at the beginning of their Drupal journey with organizations willing to hire and mentor them. While the initiative is poised to address a critical talent gap, its launch occurs during a challenging period for the Drupal community, prompting a reflection on the timing and rationale.&lt;/p&gt;&lt;h2&gt;A challenge, and an opportunity&lt;/h2&gt;&lt;p&gt;The primary challenge is the current landscape where many experienced Drupal developers are suddenly seeking employment. It is not unreasonable to assume that some percentage of these people will find non-Drupal jobs. Combine this potentiality with the fact that the Drupal developer community is getting older and that fewer and fewer new Drupal developers have been joining us suggests a long-term need for new talent. The single goal of the IXP program is to cultivate new Drupal developers so that we can maintain a community hearty enough to carry Drupal Core and Drupal CMS into the future.&lt;/p&gt;&lt;p&gt;Despite the external market conditions, the decision to launch the IXP program now was driven by the significant volunteer effort and organizational support from the &lt;a href="https://www.drupal.org/association/"&gt;Drupal Association&lt;/a&gt;. It just didn't make sense to not launch the program with the pending need so great, and while it had momentum. The program has reached a stage where it is ready to provide tangible opportunities for newcomers and benefits for participating organizations.&lt;/p&gt;&lt;h2&gt;Advantages for new developers and businesses&lt;/h2&gt;&lt;p&gt;The IXP program focuses on individuals with less than three months of paid Drupal experience, specifically targeting that crucial transition point between learning and professional practice to bridge the gap between learning Drupal and securing the first professional role. It serves as a structured pathway and a "safe learning environment" to help new developers navigate this complexity and build their skills under the guidance of experienced mentors. By providing paid experience in real-life use cases with structured mentorship (at least one hour of mentorship for every ten hours worked,) the program directly addresses the difficulty newcomers face in gaining practical experience.&lt;/p&gt;&lt;p&gt;IXP developers are expected to have knowledge about Drupal (either gained on their own or via courses like &lt;a href="https://drupaleasy.com/dco"&gt;Drupal Career Online&lt;/a&gt; or &lt;a href="https://drupaleasy.com/pmd"&gt;Professional Module Development&lt;/a&gt;) - the program isn't asking hiring organizations to provide basic Drupal knowledge.&lt;/p&gt;&lt;p&gt;For businesses, hiring new Drupal developers through the IXP program presents potential advantages including the fact that they are not entering the workforce with the same level of expertise or salary expectations as seasoned developers. The program allows organizations to shape talent according to their specific practices and needs, &lt;strong&gt;representing a strategic investment in future talent&lt;/strong&gt;. IXPs gain paid work experience and build a portfolio, while organizations benefit from fresh perspectives and enthusiasm.&lt;/p&gt;&lt;p&gt;IXPs can also be a low-cost way for organizations to invest in learning about and leveraging new developments in the Drupal community, including &lt;a href="https://new.drupal.org/drupal-cms"&gt;Drupal CMS&lt;/a&gt; as well as &lt;a href="https://drupal.org/project/ai"&gt;Drupal AI modules&lt;/a&gt; and techniques. Other potential tasks that IXPs can perform for hiring organizations include Drupal core and module updates, Drupal site-building, and quality assurance. These tasks can be foundational for various projects, including those potentially for smaller clients.&lt;/p&gt;&lt;h2&gt;Make the choice&lt;/h2&gt;&lt;p&gt;Yes, launching the Drupal IXP program now comes at a time with challenges. However, we really can’t afford putting off such a sound solution to address the long-term health of the community by creating structured pathways for new talent. Supported by a dedicated community of volunteers as well as the Drupal Association, we reached a point where launching was the necessary step to start building the future talent pipeline, offering paid experience and mentorship to new developers while rewarding organizations for their investment in the ecosystem.&lt;/p&gt;&lt;p&gt;If you're a hiring organization and want to get involved, &lt;a href="https://www.drupal.org/ixp/ixp-for-organizations"&gt;start here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;em&gt;AI was used for the initial outline of this blog post.&lt;/em&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
  <pubDate>Mon, 09 Jun 2025 06:27:20 -0400</pubDate>
    
    <guid isPermaLink="false">1136 at http://drupaleasy.com</guid>
    <dc:creator>drupaleasy@gmail.com (Michael Anello)</dc:creator></item>
<item>
  <title>Drupal Back-to-Basics - looking for a leader</title>
  <link>https://www.drupaleasy.com/blogs/ultimike/2025/05/drupal-back-basics-looking-leader</link>
  <description>
&lt;p&gt;In early April, 2025, I was a guest on the &lt;a href="https://talkingdrupal.com/496"&gt;Talking Drupal podcast&lt;/a&gt; discussing &lt;em&gt;Back-to-Basics&lt;/em&gt;, an idea I had to get &lt;strong&gt;more beginner-level presentations at Drupal events&lt;/strong&gt; as a way to better support (and retain) our newer community members. As I am currently a bit overcommitted, this, regretfully, is not something that I have the bandwidth to lead.&lt;/p&gt;&lt;p&gt;I do feel that the idea, and getting it up and running as soon as possible, is a good one that can contribute greatly as one solution to the declining pool of Drupal developers that will sustain us into the future. So, here is my call: I am looking for someone inspired by the growing need to attract and retain Drupal newbies who is interested in taking the lead with the idea, adding their flair, and moving it forward.&lt;/p&gt;&lt;p&gt;As an incentive, know that I've talked with plenty of people who are willing to help, including the folks from the &lt;a href="https://www.drupal.org/project/open_university"&gt;Drupal Open University Community Initiative&lt;/a&gt;. In addition, I'm more than willing to provide assistance, make introductions, and help where I am able to ensure success.&amp;nbsp;&lt;/p&gt;&lt;h2&gt;Genesis&lt;/h2&gt;&lt;p&gt;The idea for &lt;em&gt;Back-to-Basics&lt;/em&gt; came from one of our &lt;a href="https://www.drupaleasy.com/dco"&gt;Drupal Career Online&lt;/a&gt; alum during our &lt;a href="https://www.drupaleasy.com/academy/learning-community"&gt;weekly office hours&lt;/a&gt;. It was shortly after &lt;a href="https://www.fldrupal.camp/"&gt;Florida DrupalCamp 2025&lt;/a&gt; that the alum asked me if "there were any good Views-related sessions" from the event that they could watch. The answer was "no," unfortunately, and over the next few days this bugged me more-and-more. How are we expected to grow the community with new developers and contributors if our events offer little-to-nothing for them?&lt;/p&gt;&lt;h2&gt;Goal&lt;/h2&gt;&lt;p&gt;The goal of Back-to-Basics is to make it easy for Drupal event organizers to include solid beginner content for their new-to-Drupal attendees. The strategy makes available 6-8 Drupal pre-prepped event presentations that can be delivered by a vetted pool of experienced Drupal presenters. The presentations will be readily available to any Drupal event organizers along with the names of willing presenters.&amp;nbsp;&lt;/p&gt;&lt;h2&gt;A sustainable solution&lt;/h2&gt;&lt;p&gt;As a developer of curriculum, I know how challenging and time-consuming it can be to not only develop, but also (and, perhaps, more importantly) maintain training materials. Creating, maintaining and then donating 6-8 45-minute Drupal event presentations is a big ask. However, It also occurred to me that finding 6-8 Drupal trainers and organizations who would be willing to create and/or donate &lt;strong&gt;and maintain&lt;/strong&gt; a 45-minute presentation in exchange for some promotion makes a bit more sense. This was quickly validated by the first 4 trainers that I spoke with.&lt;/p&gt;&lt;p&gt;The final element is ensuring that the actual presentations serve to not just educate, but inspire. It is critical then, that every presentation should be delivered by &lt;strong&gt;the best presenters available at each event&lt;/strong&gt;. As the old adage says, we have only one chance to make a first impression. The most experienced Drupal developers and presenters providing beginner content is the kind of impression we want to make to newer Drupalists whom we want to get excited about Drupal. It just feels right. Again, this idea was validated by every single one of the experienced presenters I approached.&amp;nbsp;&lt;/p&gt;&lt;h2&gt;Challenges&lt;/h2&gt;&lt;p&gt;I have identified two main challenges that will need to be overcome:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Available presentation slots at Drupal events.&lt;/strong&gt; Not many Drupal events have the luxury of open rooms or slots in their schedule. Putting some priority on these beginner sessions would need to be part of the event planners’ insights in that it would not only be in our community's long-term interest, but contribute to growth of their event in the future, if they made room for beginner content.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Presenter/session selection.&lt;/strong&gt; Presenters who participate in the &lt;em&gt;Back-to-Basics&lt;/em&gt; program (or develop their own) shouldn't be penalized for presenting beginner-level content when it comes to session selection. If the maintainer of a core subsystem wants to present beginner-level content, that shouldn't count against them if they are proposing an advanced session as well, in the normal flow of session selection for the same event.&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;Is building &lt;em&gt;Back-to-Basics&lt;/em&gt; your bailiwick?&lt;/h2&gt;&lt;p&gt;If you are inspired, and considering making a go of leading the charge on this, I am sure you have some ideas on how to proceed. &amp;nbsp;Some fuel for thought; here are the basics of what I envision you'll need to do:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Reach out to Drupal trainers to confirm their participation. (I can help with that!)&lt;/li&gt;&lt;li&gt;Determine the list of 6-8 beginner-level topics that should be covered (the Open Curriculum folks can help with this!)&lt;/li&gt;&lt;li&gt;Develop guidelines for presentation slide decks, including promotion guidelines and common slides.&lt;/li&gt;&lt;li&gt;Figure out where the presentations will be stored.&lt;/li&gt;&lt;li&gt;Develop the list of Back-to-Basics presenters.&lt;/li&gt;&lt;li&gt;Develop an informal written agreement with trainers for presentation maintenance.&lt;/li&gt;&lt;li&gt;Work with the Drupal Event Organizers working group to help spread the word.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;I'm sure you have more ideas to enhance the program, (like nifty t-shirts) and there will surely be some additional tasks as well, but I think this list covers the big ones.&lt;/p&gt;&lt;p&gt;Finally, know that I envision my role as that of a mentor for whoever decides to take this on. I'll be more than happy to provide guidance, answer questions, and make introductions.&lt;/p&gt;&lt;p&gt;Interested? Have questions? Connect with me (ultimike) on the Drupal Slack workspace or use &lt;a href="https://www.drupaleasy.com/contact-us"&gt;our contact form&lt;/a&gt;.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
  <pubDate>Tue, 27 May 2025 13:39:09 -0400</pubDate>
    
    <guid isPermaLink="false">1132 at http://drupaleasy.com</guid>
    <dc:creator>drupaleasy@gmail.com (Michael Anello)</dc:creator></item>
<item>
  <title>Choosing the right modern Drupal Bootstrap base theme</title>
  <link>https://www.drupaleasy.com/blogs/ultimike/2025/05/choosing-right-modern-drupal-bootstrap-base-theme</link>
  <description>
&lt;p&gt;&lt;strong&gt;A high-level comparison of some of the most-widely used Bootstrap framework-focused base themes, including feedback from some of their maintainers.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;With &lt;a href="https://www.drupal.org/project/project_theme?f%5B44%5D=&amp;amp;f%5B46%5D=&amp;amp;f%5B47%5D=sm_core_compatibility%3A10&amp;amp;f%5B48%5D=sm_field_project_type%3Afull&amp;amp;f%5B49%5D=&amp;amp;f%5B50%5D=&amp;amp;text=bootstrap&amp;amp;solrsort=score+desc&amp;amp;op=Search"&gt;more than 150 Bootstrap compatible Drupal 10 contributed themes on Drupal.org&lt;/a&gt;, selecting the best Bootstrap-powered base theme for you, your development team, and your project can sometimes come down to a superficial popularity contest. The lack of a clear comparison between the most widely-used and/or most well-known options is frustrating.&lt;/p&gt;&lt;p&gt;Rather than attempting the futile task of comparing all 150+ themes, based on my experience and conversations, I have selected the six (of what I consider to be) leading Bootstrap 5 compatible base themes for this task.&lt;/p&gt;&lt;p&gt;As someone who is not a dedicated front-end or theme developer, but is somewhat comfortable with the Bootstrap framework, I've used several of the options included in this comparison. This very site uses the &lt;a href="https://drupal.org/project/bootstrap"&gt;Bootstrap&lt;/a&gt; base theme, our DrupalEasy Academy curriculum site and the &lt;a href="https://drupaleasy.com/dco"&gt;Drupal Career Online&lt;/a&gt; theming lessons uses &lt;a href="https://drupal.org/project/bootstrap_barrio"&gt;Bootstrap Barrio&lt;/a&gt;, and our Single Directory Component workshop utilizes &lt;a href="https://drupal.org/project/radix"&gt;Radix&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Despite my experience with several of the Bootstrap 5-powered base themes, I still didn't have a clear understanding of which one I should use or recommend based on different projects and teams. Gaining clarity in this area is the goal of this blog post.&lt;/p&gt;&lt;p&gt;In addition to my own experiences and research, I also contacted the most active maintainer(s) of each base theme and asked each to provide some feedback about their projects.&lt;/p&gt;&lt;p&gt;The base themes I decided to compare in this blog post were based on previous experiences, usage numbers on drupal.org and comments on a social media post about this topic that I posted in early April, 2025.&lt;/p&gt;&lt;p&gt;&lt;em&gt;*Note: It is not lost on me the potential confusion between the three base themes with "Bootstrap" in their name!&amp;nbsp;&lt;/em&gt;&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Name&lt;/th&gt;&lt;th&gt;Latest release&lt;/th&gt;&lt;th&gt;Usage&lt;/th&gt;&lt;th&gt;Commits*&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="https://drupal.org/project/artisan"&gt;Artisan&lt;/a&gt;&lt;/td&gt;&lt;td&gt;2.0.0-alpha2 released 7 May 2025&lt;/td&gt;&lt;td&gt;196&lt;/td&gt;&lt;td&gt;36&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="https://drupal.org/project/bootstrap"&gt;Bootstrap&lt;/a&gt;&lt;/td&gt;&lt;td&gt;5.0.1 released 16 September 2024&lt;/td&gt;&lt;td&gt;98,505&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="https://www.drupal.org/project/bootstrap5"&gt;Bootstrap 5&lt;/a&gt;&lt;/td&gt;&lt;td&gt;4.0.3 released 7 August 2024&lt;/td&gt;&lt;td&gt;19,504&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="https://drupal.org/project/bootstrap_barrio"&gt;Bootstrap Barrio&lt;/a&gt;&lt;/td&gt;&lt;td&gt;5.5.19 released 6 December 2024&lt;/td&gt;&lt;td&gt;39,844&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="https://drupal.org/project/radix"&gt;Radix&lt;/a&gt;&lt;/td&gt;&lt;td&gt;6.0.1 released 18 January 2025&lt;/td&gt;&lt;td&gt;8,682&lt;/td&gt;&lt;td&gt;38&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="https://drupal.org/project/ui_suite_bootstrap"&gt;UI Suite Bootstrap&lt;/a&gt;&lt;/td&gt;&lt;td&gt;5.1.0-beta1 released 9 April 2025&lt;/td&gt;&lt;td&gt;259&lt;/td&gt;&lt;td&gt;35&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;em&gt;*Commits on current release branch in 2025&lt;/em&gt;&lt;/p&gt;&lt;p&gt;From the data above, it is clear to see that &lt;em&gt;Bootstrap&lt;/em&gt; has (by far) the most usage, half have had a release in the last six months (November 2024 - April 2025,) with the other half having no commits on the listed branch in 2025 yet.&lt;/p&gt;&lt;h2&gt;Front-end tools&lt;/h2&gt;&lt;p&gt;One of the first things I do when evaluating a base theme is to take a look at how they handle CSS compiling. Generally, this falls into one of three categories:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;no built-in support (meaning the base theme is primarily designed for CSS, not Sass)&lt;/li&gt;&lt;li&gt;Sass files provided along with CSS compilation tools (usually in the form of a package.json file)&lt;/li&gt;&lt;li&gt;Sass files provided, but un-opinionated about compiling CSS (meaning it is up the developer)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Note: a developer or team's front-end tool chain can take many different forms, so this section is mostly geared towards folks not comfortable setting up their own toolchain.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;For our contenders, here's what I found:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Artisan: recommended subtheme includes Sass files and package.json featuring Laravel Mix.&lt;/li&gt;&lt;li&gt;Bootstrap: provides both a CSS-only subtheme and a Sass-based subtheme that includes a package.json featuring Gulp.&lt;/li&gt;&lt;li&gt;Bootstrap 5: recommended subtheme includes Sass files and a package.json file.&lt;/li&gt;&lt;li&gt;Bootstrap Barrio: provides both a CSS-only subtheme and a Sass-based subtheme that includes a package.json featuring Gulp.&lt;/li&gt;&lt;li&gt;Radix: recommended subtheme includes Sass files and package.json featuring Laravel Mix and BiomeJS&lt;/li&gt;&lt;li&gt;UI Suite Bootstrap: recommended subtheme includes Sass files&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Single directory components&lt;/h2&gt;&lt;p&gt;With the Drupal community's love affair with single directory components (SDCs) not looking to wane anytime soon, it is becoming more-and-more common for base themes to include a useful set of components that can be utilized.&lt;/p&gt;&lt;p&gt;Ideally, (IMHO) SDCs should be entirely self-contained, not relying on libraries or Sass source files that don't reside in the SDC. Unfortunately, this is not always possible, but it is something that I definitely consider when doing my evaluation. Here's how our contenders incorporate SDCs:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Artisan: includes components both in base theme and recommended subtheme&lt;/li&gt;&lt;li&gt;Bootstrap: includes components in base theme&lt;/li&gt;&lt;li&gt;Bootstrap 5: no components included&lt;/li&gt;&lt;li&gt;Bootstrap Barrio: includes components in base theme&lt;/li&gt;&lt;li&gt;Radix: includes components in base theme&lt;/li&gt;&lt;li&gt;UI Suite Bootstrap: includes components in base theme&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Drupal's &lt;em&gt;Appearance&lt;/em&gt; theme settings&lt;/h2&gt;&lt;p&gt;I honestly didn't consider this aspect until one of the base theme maintainers I interviewed mentioned it. Some base themes expose a lot of configuration options through Drupal's &lt;em&gt;Appearance&lt;/em&gt; admin UI settings pages and some do not. Different theme developers might have different preferences - often those newer to theme development (or those for whom it is not a full-time job) prefer more configuration options exposed in the Drupal admin UI.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Artisan: Many configuration options including colors, fonts and column widths. Many configurations utilize CSS variables.&lt;/li&gt;&lt;li&gt;Bootstrap: Some configuration options including Color module and Bootswatch integration.&lt;/li&gt;&lt;li&gt;Bootstrap 5: Few configuration options.&lt;/li&gt;&lt;li&gt;Bootstrap Barrio: Many configuration options including Bootstrap grid classes.&lt;/li&gt;&lt;li&gt;Radix: Very few configuration options.&lt;/li&gt;&lt;li&gt;UI Suite Bootstrap: Very few configuration options.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Documentation&lt;/h2&gt;&lt;p&gt;For base themes, I find that a little bit of documentation goes a long way. I don't expect base theme contributors to document every single possible use case, but I do hope that enough documentation exists for a developer to understand the theme's pros and cons and provide enough step-by-step instructions to demonstrate (with examples) best practices when building out a subtheme.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Artisan: Limited to project page and project README file.&lt;/li&gt;&lt;li&gt;Bootstrap: &lt;a href="https://www.drupal.org/docs/extending-drupal/themes/contributed-themes/bootstrap"&gt;Drupal.org doc pages&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Bootstrap 5: Limited to project page and project README file.&lt;/li&gt;&lt;li&gt;Bootstrap Barrio: Many links from project page, but not all are up-to-date&lt;/li&gt;&lt;li&gt;Radix: &lt;a href="https://radix.trydrupal.com/"&gt;Dedicated documentation site&lt;/a&gt;&lt;/li&gt;&lt;li&gt;UI Suite Bootstrap: Limited to project page and project README file.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;What do the maintainers say?&lt;/h2&gt;&lt;p&gt;About half-way through my research for this blog post, I realized that without direct experience with all of them (which I do not have,) it would be best if I gave each project's maintainers a chance to provide some feedback.&lt;/p&gt;&lt;p&gt;I contacted the most active maintainer(s) for each project (based on number of commits over the past six months) and asked them the same three questions:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;What are the advantages of (your base theme) over other modern Drupal Bootstrap-based base themes?&lt;/li&gt;&lt;li&gt;What are the disadvantages?&lt;/li&gt;&lt;li&gt;Is your base theme designed for a particular level of front-end developer (beginner, intermediate, advanced?)&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;em&gt;I considered asking an additional question about how well positioned each base theme is for integration with &lt;/em&gt;&lt;a href="https://drupal.org/project/experience_builder"&gt;&lt;em&gt;Experience Builder&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, but I decided against it as we're still at least 5 months away from its initial release and didn't think it was an entirely fair question.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;I received responses from maintainers of Bootstrap, Bootstrap Barrio, Radix, and UI Suite Bootstrap, and have included summaries of each of their responses here.&lt;/p&gt;&lt;h3&gt;Artisan&lt;/h3&gt;&lt;p&gt;Unfortunately, the maintainer didn't respond to my message.&lt;/p&gt;&lt;h3&gt;Bootstrap and Bootstrap Barrio&lt;/h3&gt;&lt;p&gt;Alberto Siles (&lt;a href="https://drupal.org/u/hatuhay"&gt;hatuhay on drupal.org&lt;/a&gt;) is one of the maintainers of both Bootstrap and Bootstrap Barrio. He mentioned that he took over maintenance of Bootstrap after it was abandoned - originally only to provide updates to it, "but now it depends on the community if they embrace the new code or not." He will continue to maintain both base themes (wow!) and improvements to each will depend on feedback (and help) he receives in each issue queue.&lt;/p&gt;&lt;p&gt;About Bootstrap Barrio's advantages, he wrote, "Long term stability, proven code, but mostly, the theme is designed in a way that makes it easy to upgrade in both Bootstrap and Drupal major versions seamlessly. Now, the code is constantly updated for both Drupal and Bootstrap enhancements, this is also a modern theme in every aspect."&lt;/p&gt;&lt;p&gt;He also mentioned that Bootstrap Barrio is designed for developers of all skill levels, as it is the "subtheme that discriminates. The basic subtheme will let you work with predefined color pallets, Google fonts and other backend configuration and some css, while the Sass version will setup, in minutes, a custom compiled version of Bootstrap."&lt;/p&gt;&lt;h3&gt;Bootstrap 5&lt;/h3&gt;&lt;p&gt;Vladimir Roudakov (&lt;a href="https://www.drupal.org/u/vladimiraus"&gt;vladimiraus on drupal.org&lt;/a&gt;) replied, "Janna (&lt;a href="https://www.drupal.org/u/jannakha"&gt;jannakha on drupal.org&lt;/a&gt;) and I created the Bootstrap 4 and consequently Bootstrap 5 themes as simple, non-prescriptive, and very flexible Bootstrap themes. At the time, 2020-2021, there were no lightweight Bootstrap-based themes, and the original Bootstrap theme was heavily outdated."&lt;/p&gt;&lt;p&gt;He also mentioned that this base theme is geared towards intermediate-level developers and requires "minor tweaking for Sass setup."&lt;/p&gt;&lt;h3&gt;Radix&lt;/h3&gt;&lt;p&gt;Sohail Lajevardi (&lt;a href="https://drupal.org/u/doxigo"&gt;doxigo on drupal.org&lt;/a&gt;) said that some of Radix's advantages include being one of the first Drupal base themes to include SDCs, the use of modern front-end tools (including &lt;a href="https://laravel-mix.com/"&gt;Laravel Mix&lt;/a&gt; and &lt;a href="https://biomejs.dev/"&gt;BiomeJS&lt;/a&gt;), its own command-line utility, very good &lt;a href="https://radix.trydrupal.com/"&gt;documentation&lt;/a&gt; (including &lt;a href="https://youtu.be/iza3wrDVlQI"&gt;YouTube videos&lt;/a&gt;), and an effort to minimize Drupal-isms.&lt;/p&gt;&lt;p&gt;Interestingly, he also mentioned that, "I always considered Radix to be a theme and not a configuration vehicle, so we do everything where it needs to be, in the theme. No configuration mix up." I found this an especially interesting contrast to several of the other contenders, notably Bootstrap Barrio and Artisan, both of which utilize a good number of configuration options in Drupal's Appearance settings.&lt;/p&gt;&lt;p&gt;He did mention a disadvantage being "Not easy to understand all the tools and bells of the theme for a newcomer." But he did reiterate Radix's documentation being a solution for this - especially for those new to it.&amp;nbsp;&lt;/p&gt;&lt;h3&gt;UI Suite Bootstrap&lt;/h3&gt;&lt;p&gt;This base theme is a bit of an outlier, as it is very closely tied to the &lt;a href="https://drupal.org/project/ui_suite"&gt;UI Suite&lt;/a&gt; project. I don't have a good handle on how likely it would be for a team to decide to use this base theme if they aren't UI Suite module users as well.&lt;/p&gt;&lt;p&gt;Florent Torregrosa (&lt;a href="https://drupal.org/u/grimreaper"&gt;grimreaper on drupal.org&lt;/a&gt;) stressed that this project is a "production ready, design-system-oriented-first theme." He went on to say that together with UI Suite, the base theme provides "tools to allow site builders to configure how they want the design system artifacts (components, styles, Icons, CSS variables, etc.) to fit their business needs. And so we have nothing hardcoded for specific content types or other content entities, bundles, or fields."&lt;/p&gt;&lt;p&gt;Michael Fanini (&lt;a href="https://drupal.org/u/g4mbini"&gt;g4mbini on drupal.org&lt;/a&gt;) added that it "packages in one place all Bootstrap specification &amp;amp; designs artifacts (components, style utilities, icons, forms, …) with modern tools from core (SDC, Icon API)" and together with other UI Suite modules provides a no/low-code method for Site-builders to connect Drupal fields to Bootstrap components.&lt;/p&gt;&lt;p&gt;In fact, as I've learned more and more about the UI Suite eco-system of projects, the more it is evident that one of its primary goals is to make it as "design-system-oriented" as possible, as well as prioritize no/low code field-to-component mapping. Much of this means that rather than the Drupal developers providing the Drupal-y templates to the non-Drupal-y front-end developers, it is the front-end developers who provide the components to the Drupal developers to wire to Drupal entities, bundles, and fields. The UI Suite ecosystem maintainers refer to this concept as "inverting the workflow."&lt;/p&gt;&lt;p&gt;As for disadvantages, he notes that its current dependencies on other UI Suite ecosystem modules is less-than-ideal, but as each of the dependencies are at different stages of being added to Drupal core, this is likely a short-term issue.&amp;nbsp;&lt;/p&gt;&lt;h2&gt;Conclusions?&lt;/h2&gt;&lt;p&gt;Ugh - I figured I'd have to write this section, even though I knew it would not be possible to have a single "I recommend using base theme X" statement. Instead, here's my one-line opinion for each:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Artisan&lt;/strong&gt;: With so many configuration options, this &lt;strong&gt;might be the best option for beginners or lower-budget sites&lt;/strong&gt;. It is, however, not used by very many sites (yet?) and the documentation could be better.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Bootstrap&lt;/strong&gt;: Nothing compelling over any of the other contenders.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Bootstrap 5&lt;/strong&gt;: Less prescriptive than Bootstrap Barrio - could be a solid choice for more intermediate-level theme developers.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Bootstrap Barrio&lt;/strong&gt;: A &lt;strong&gt;comfortable and solid choice&lt;/strong&gt; for me, despite a few annoyances (probably due to the fact that I currently use this project the most.) But, moving forward, I'd like to see this base theme leading the way into a no-Sass future. (One that utilizes PostCSS instead, perhaps?)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Radix&lt;/strong&gt;: I'm a sucker for &lt;strong&gt;good documentation&lt;/strong&gt; and do appreciate the opinionated nature of Radix minimizing the configuration options. I like the fact that it is SDC-forward and will definitely consider using this for my next custom theme project.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;UI Suite Bootstrap&lt;/strong&gt;: A &lt;strong&gt;very compelling&lt;/strong&gt; option for those projects that are design-system first. The close ties to the UI Suite of modules could complicate things though. Finally, it's installation requires a few more manual steps than the other contenders.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;AI was used in the authoring of this blog post for the social media share image.&lt;/em&gt;&lt;/p&gt;</description>
  <pubDate>Wed, 07 May 2025 15:18:05 -0400</pubDate>
    
    <guid isPermaLink="false">1131 at http://drupaleasy.com</guid>
    <dc:creator>drupaleasy@gmail.com (Michael Anello)</dc:creator></item>
<item>
  <title>Drupal development using Visual Studio Code connected directly to DDEV's web container</title>
  <link>https://www.drupaleasy.com/blogs/ultimike/2025/04/drupal-development-using-visual-studio-code-connected-directly-ddevs-web</link>
  <description>
&lt;p&gt;As part of &lt;a href="https://drupaleasy.com/pmd"&gt;DrupalEasy's Professional Module Development (PMD) course&lt;/a&gt;, I teach students how to configure an efficient development environment using either &lt;a href="https://ddev.com/"&gt;DDEV&lt;/a&gt; or &lt;a href="https://lando.dev/"&gt;Lando&lt;/a&gt; combined with either &lt;a href="https://www.jetbrains.com/phpstorm/"&gt;PhpStorm&lt;/a&gt; or &lt;a href="https://code.visualstudio.com/"&gt;Visual Studio Code&lt;/a&gt;. We go rather deep into this topic, often devoting 4-5 hours of class time in getting everyone set up.&amp;nbsp;&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/logo-druapleasy-pmd-green-550.png" data-entity-uuid="7169d17d-df06-496d-9a7e-f133e27113a7" data-entity-type="file" alt="DrupalEasy's Professional Module Development course logo" width="550" height="220" loading="lazy"&gt;&lt;p&gt;As the material is part of our proprietary curriculum for which our clients/students pay tuition , I've been reluctant to share it directly: However, over the past couple of years, the DDEV + Visual Studio Code combination has been more and more common in Drupal development and I've been persuaded to share a summary of my recommended setup.&amp;nbsp;&lt;/p&gt;&lt;p&gt;(I have also, for quite some time, been providing a summary of this material in &lt;a href="https://www.drupal.tv/videos?combine=maximizing+visual+studio+code"&gt;various free Drupal camp workshops as well as Drupal camp presentations&lt;/a&gt;.)&amp;nbsp;&lt;/p&gt;&lt;p&gt;The goal of this blog post is to guide you through maximizing your Drupal development environment by integrating Visual Studio Code with DDEV by connecting it directly to the DDEV web container's filesystem.&amp;nbsp;&lt;/p&gt;&lt;p&gt;While this is not the most common method of using Visual Studio Code with DDEV, I have found (and many of our PMD students agree) that this provides the easiest access to full IDE integration with tools like PhpStan and phpcs (among others.)&lt;/p&gt;&lt;p&gt;&lt;em&gt;Much of the content in this document is also valid for other Docker-based local development environments (including Lando, &lt;/em&gt;&lt;a href="https://docksal.io/"&gt;&lt;em&gt;Docksal&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, custom &lt;/em&gt;&lt;a href="https://www.docker.com/"&gt;&lt;em&gt;Docker&lt;/em&gt;&lt;/a&gt;&lt;em&gt;). The main differences are related to directory paths.&lt;/em&gt;&lt;/p&gt;&lt;h2&gt;Prerequisites&lt;/h2&gt;&lt;p&gt;Before you can fully leverage the information in this document, be sure that:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;You are comfortable using DDEV on a daily basis.&lt;/li&gt;&lt;li&gt;Your Drupal project includes the core development dependencies (via &lt;a href="https://packagist.org/packages/drupal/core-dev)."&gt;https://packagist.org/packages/drupal/core-dev).&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Your project is configured to run phpcs, phpcbf, phpstan, and phpunit from the command line within the DDEV web container, including all relevant configuration files.&lt;/li&gt;&lt;li&gt;Finally, it is strongly recommended to use a settings.local.php file for your local development environment (&lt;a href="https://www.drupaleasy.com/blogs/ultimike/2024/02/why-you-should-care-about-using-settingslocalphp"&gt;here's why!&lt;/a&gt;)&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Unleashing the power of remote development&lt;/h2&gt;&lt;p&gt;A key aspect of this setup is leveraging Visual Studio Code's Remote Explorer and Dev Containers extensions. The general idea is to connect Visual Studio Code directly to your project's code base within the DDEV web container instead of accessing the files on your host operating system.&lt;/p&gt;&lt;p&gt;The primary advantage of this approach is that it allows other Visual Studio Code extensions to easily access and execute command-line tools that reside within the container. For instance, extensions for code quality like &lt;em&gt;phpcs&lt;/em&gt; and &lt;em&gt;PhpStan&lt;/em&gt;, which are typically installed within your Drupal project via the &lt;em&gt;drupal/core-dev&lt;/em&gt; dependencies, can be directly invoked by Visual Studio Code without requiring complex configurations or path mappings to your host system's executables. This ensures that the code quality checks are performed using the exact tools and versions defined in your project's container.&lt;/p&gt;&lt;h2&gt;Essential Visual Studio Code extensions&lt;/h2&gt;&lt;p&gt;To achieve this integration as well as provide an efficient Drupal development environment, the following Visual Studio Code extensions are recommended:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Remote explorer: &lt;a href="https://marketplace.visualstudio.com/items/?itemName=ms-vscode.remote-explorer"&gt;ms-vscode.remote-explorer&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Dev Containers: &lt;a href="https://marketplace.visualstudio.com/items/?itemName=ms-vscode-remote.remote-containers"&gt;ms-vscode-remote.remote-containers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;PHP Debug: &lt;a href="https://marketplace.visualstudio.com/items/?itemName=xdebug.php-debug"&gt;xdebug.php-debug&lt;/a&gt;&lt;/li&gt;&lt;li&gt;PHP DocBlocker: &lt;a href="https://marketplace.visualstudio.com/items/?itemName=neilbrayfield.php-docblocker"&gt;neilbrayfield.php-docblocker&lt;/a&gt;&lt;/li&gt;&lt;li&gt;PHP Intelephense: &lt;a href="https://marketplace.visualstudio.com/items/?itemName=bmewburn.vscode-intelephense-client"&gt;bmewburn.vscode-intelephense-client&lt;/a&gt;&lt;/li&gt;&lt;li&gt;PHP Sniffer &amp;amp; Beautifier: &lt;a href="https://marketplace.visualstudio.com/items/?itemName=ValeryanM.vscode-phpsab"&gt;ValeryanM.vscode-phpsab&lt;/a&gt;&lt;/li&gt;&lt;li&gt;phpstan: &lt;a href="https://marketplace.visualstudio.com/items/?itemName=SanderRonde.phpstan-vscode"&gt;SanderRonde.phpstan-vscode&lt;/a&gt;&lt;/li&gt;&lt;li&gt;PHPUnit: &lt;a href="https://marketplace.visualstudio.com/items/?itemName=emallin.phpunit"&gt;emallin.phpunit&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Drupal Smart Snippets: &lt;a href="https://marketplace.visualstudio.com/items/?itemName=andrewdavidblum.drupal-smart-snippets"&gt;andrewdavidblum.drupal-smart-snippets&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Twig Language 2: &lt;a href="https://marketplace.visualstudio.com/items/?itemName=mblode.twig-language-2"&gt;mblode.twig-language-2&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Note that when using this technique, the excellent &lt;a href="https://marketplace.visualstudio.com/items/?itemName=biati.ddev-manager"&gt;DDEV Manager extension&lt;/a&gt; is not used as it normally operates from the host OS, and not inside the DDEV web container.&lt;/p&gt;&lt;h2&gt;Making the connection&lt;/h2&gt;&lt;p&gt;The key to making all this work is having Visual Studio Code connect directly to the project files in the DDEV &lt;em&gt;web&lt;/em&gt; container and not in the host operating system. To do so, after launching Visual Studio Code, click on the &lt;em&gt;Remote Explorer&lt;/em&gt; icon in the sidebar, then select &lt;em&gt;Dev Containers&lt;/em&gt; from the select list, then select the web container for your project.&amp;nbsp;&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/make-the-connection.png" data-entity-uuid="49ca3d7c-7616-4de5-8852-b640cfcdec6d" data-entity-type="file" alt="Screenshot showing Remote Explorer and Dev Containers extensions in use." width="600" height="510" loading="lazy"&gt;&lt;p&gt;Once connected, click the &lt;em&gt;Extensions&lt;/em&gt; icon in the sidebar, and install in the container any of the extensions listed above that require it (not all extensions need to be installed in the container.)&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/install-extensions.png" data-entity-uuid="b36922d2-dbe9-4a42-94ae-75f7b91f9e7b" data-entity-type="file" alt="Screenshot of VSCode interface showing the buttons to install extensions in the container." width="600" height="379" loading="lazy"&gt;&lt;p&gt;Finally, click the Explorer icon in the sidebar and navigate to the project root - usually &lt;em&gt;/var/www/html&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;At this point, while Visual Studio Code is running in your host OS, it only "sees" the DDEV &lt;em&gt;web&lt;/em&gt; container. Which means that when you open the Visual Studio Code Terminal, you are executing commands in the DDEV web container by default.&amp;nbsp;&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/terminal.png" data-entity-uuid="ebd49864-79aa-4b91-9bd9-802beece5cda" data-entity-type="file" alt="Screenshot of VSCode terminal connected directly to the DDEV web container." width="600" height="174" loading="lazy"&gt;&lt;p&gt;From this command line, Drush, Composer, Git, npm, and other installed binaries can be run directly - without the need to prepend them with &lt;em&gt;ddev&lt;/em&gt; or &lt;em&gt;ddev exec&lt;/em&gt; (&lt;em&gt;ddev .&lt;/em&gt;)&lt;/p&gt;&lt;h2&gt;Understanding Visual Studio Code settings&lt;/h2&gt;&lt;p&gt;In order to configure everything effectively, it is important to understand that Visual Studio Code supports two types of settings:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;User settings: These are global settings that apply to all your Visual Studio Code projects unless overridden by workspace settings.&lt;/li&gt;&lt;li&gt;Workspace settings: These settings are specific to a particular project and will override any conflicting user settings. These settings are typically stored in a &lt;em&gt;.vscode/settings.json&lt;/em&gt; file within your project's root directory.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Recommended workspace settings&lt;/h2&gt;&lt;p&gt;Here is the recommended &lt;em&gt;.vscode/settings.json&lt;/em&gt; configuration for DDEV in your project root. Note that if you already have settings in this file, you'll likely want to combine what is provided below with your current settings.&lt;/p&gt;&lt;pre&gt;&lt;code class="language-javascript"&gt;{
   /* DDEV web container */
   
   /* PHP Intelephense */
   "intelephense.environment.phpVersion": "8.3",
   
   /* PHP Linting */
   "php.validate.executablePath": "/usr/bin/php",
   
   /* PHP Sniffer &amp;amp; Beautifier */
   "phpsab.executablePathCS": "/var/www/html/vendor/bin/phpcs",
   "phpsab.executablePathCBF": "/var/www/html/vendor/bin/phpcbf",
   "phpsab.standard": "/var/www/html/phpcs.xml",
   "phpsab.snifferEnable": true,
   "phpsab.fixerEnable": true,
   "phpsab.snifferMode": "onType",
   "phpsab.debug": false,
   "phpsab.fixerArguments": [],
   
   /* phpstan */
   "phpstan.enabled": true,
   "phpstan.showProgress": true,
   "phpstan.binPath": "/var/www/html/vendor/bin/phpstan",
   "phpstan.configFile": "/var/www/html/phpstan.neon"
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Some notes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;intelephense.environment.phpVersion&lt;/em&gt;: Specifies the PHP version used in the DDEV container, aiding PHP Intelephense with accurate code intelligence.&lt;/li&gt;&lt;li&gt;&lt;em&gt;php.validate.executablePath&lt;/em&gt;: Defines the path to the PHP executable within the DDEV container, used for basic PHP linting.&lt;/li&gt;&lt;li&gt;&lt;em&gt;phpsab.executablePathCS&lt;/em&gt; and&lt;em&gt; phpsab.executablePathCBF&lt;/em&gt;: Point to the &lt;em&gt;phpcs&lt;/em&gt; and &lt;em&gt;phpcbf&lt;/em&gt; executables within the DDEV container's vendor directory, used by the PHP Sniffer &amp;amp; Beautifier extension for code standard checking and fixing.&lt;/li&gt;&lt;li&gt;&lt;em&gt;phpsab.standard&lt;/em&gt;: Specifies the path to your project's PHPCS ruleset file (e.g., phpcs.xml) within the DDEV container.&lt;/li&gt;&lt;li&gt;&lt;em&gt;phpsab.snifferEnable&lt;/em&gt;, &lt;em&gt;phpsab.fixerEnable&lt;/em&gt;, &lt;em&gt;phpsab.snifferMode&lt;/em&gt;, &lt;em&gt;phpsab.debug&lt;/em&gt;, &lt;em&gt;phpsab.fixerArguments&lt;/em&gt;: Configuration options for the PHP Sniffer &amp;amp; Beautifier extension, controlling its behavior for real-time code analysis and formatting.&lt;/li&gt;&lt;li&gt;&lt;em&gt;phpstan.enabled&lt;/em&gt;,&lt;em&gt; phpstan.showProgress&lt;/em&gt;, &lt;em&gt;phpstan.binPath&lt;/em&gt;, &lt;em&gt;phpstan.configFile&lt;/em&gt;: Settings for the &lt;em&gt;phpstan&lt;/em&gt; extension, specifying whether it's enabled, whether to show progress, and the paths to the &lt;em&gt;phpstan&lt;/em&gt; executable and configuration file within the DDEV container.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Recommended user settings&lt;/h2&gt;&lt;p&gt;For some of the previously mentioned extensions, there are some user-level settings you might want to merge into your existing Visual Code Studio User settings.&amp;nbsp;&lt;/p&gt;&lt;p&gt;To ensure the PHP Sniffer &amp;amp; Beautifier is the default formatter for PHP files, add the following:&lt;/p&gt;&lt;pre&gt;&lt;code class="language-javascript"&gt;"[php]": {
   "editor.defaultFormatter": "valeryanm.vscode-phpsab"
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To prioritize Drupal Smart Snippets for code completion suggestions, add the following:&lt;/p&gt;&lt;pre&gt;&lt;code class="language-javascript"&gt;"editor.snippetSuggestions": "top"&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To ensure PHP Intelephense uses the correct Drupal document root for code intelligence, add the following (this assumes your docroot is &lt;em&gt;web&lt;/em&gt;):&lt;/p&gt;&lt;pre&gt;&lt;code class="language-javascript"&gt;"intelephense.environment.documentRoot": "web/index.php"&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Summary&lt;/h2&gt;&lt;p&gt;By following these recommendations and configuring your Visual Studio Code environment as described above, you can significantly enhance your Drupal development efficiency by taking full advantage of your local development environment's capabilities directly within Visual Studio Code.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Thanks to &lt;/em&gt;&lt;a href="https://www.linkedin.com/in/randyfay/"&gt;&lt;em&gt;Randy Fay&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and &lt;/em&gt;&lt;a href="https://github.com/stasadev"&gt;&lt;em&gt;Stas Zhuk&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &amp;nbsp;(DDEV maintainers) for reviewing this blog post prior to publication.&amp;nbsp;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;AI was used to create the initial outline for this blog post using DrupalEasy's Professional Module Development curriculum as the source material. We support &lt;/em&gt;&lt;a href="https://www.drupal.org/project/content/issues/3475624"&gt;&lt;em&gt;AI disclosure statements&lt;/em&gt;&lt;/a&gt;&lt;em&gt; on all content that is posted to Drupal Planet. &amp;nbsp;&lt;/em&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
  <pubDate>Tue, 29 Apr 2025 14:17:12 -0400</pubDate>
    
    <guid isPermaLink="false">1130 at http://drupaleasy.com</guid>
    <dc:creator>drupaleasy@gmail.com (Michael Anello)</dc:creator></item>
<item>
  <title>The new IXP program: Ushering in needed fresh Drupal talent with bona fide incentives for employers</title>
  <link>https://www.drupaleasy.com/blogs/ultimike/2025/04/new-ixp-program-ushering-needed-fresh-drupal-talent-bona-fide-incentives</link>
  <description>
&lt;p&gt;&lt;strong&gt;Organizations can now be rewarded with Drupal contribution credits (among other enticements) for hiring new, inexperienced (IXP) Drupal developers.&lt;/strong&gt;&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/drupal-ixp-site.png" data-entity-uuid="5cbed725-95db-40cf-8832-184e449215ae" data-entity-type="file" alt="Screenshot of drupal-ipx.site home page." width="600" height="401" loading="lazy"&gt;&lt;p&gt;After many months (years?) of planning, the Drupal IXP program is open and accepting applications for hiring organizations. From now forward, any participating organization that hires a new Drupal developer (with less than 3 months of paid experience) can earn 250 contribution credits upon successful program completion.&lt;/p&gt;&lt;p&gt;I'm super proud to have been working with &lt;a href="https://www.drupal.org/u/camoa"&gt;Carlos&lt;/a&gt; and &lt;a href="https://www.drupal.org/u/ana-laura-coto"&gt;Anilu&lt;/a&gt; (&lt;a href="https://adrupalcouple.us/"&gt;A Drupal couple&lt;/a&gt;) and a number of other volunteers on this effort and am really happy to see it launched.&lt;/p&gt;&lt;h2&gt;Why?&lt;/h2&gt;&lt;p&gt;&lt;a href="https://www.drupaleasy.com/blogs/gwendolyn/2024/10/who-will-move-drupal-forward"&gt;The Drupal developer community is getting older&lt;/a&gt;. With modern Drupal being more challenging to learn for new developers (especially compared with Drupal 7), fewer and fewer new Drupal developers have been joining our ranks. In order to survive, we need to build up the pipeline of new, fresh-minded, Drupal talent.&lt;/p&gt;&lt;h2&gt;How does the program work?&lt;/h2&gt;&lt;p&gt;Interested organizations can apply to participate at &lt;a href="https://drupal-ixp.site/"&gt;Drupal-IXP.site&lt;/a&gt;. After a quick manual review, accepted organizations will be provided with a coupon code to post an IXP position on &lt;a href="https://jobs.drupal.org/"&gt;jobs.drupal.org&lt;/a&gt; for free.&lt;/p&gt;&lt;p&gt;We have worked with the &lt;a href="https://www.drupal.org/association"&gt;Drupal Association&lt;/a&gt; on creating a dedicated area for IXP positions on &lt;a href="https://jobs.drupal.org/ixp-developer-hub"&gt;jobs.drupal.org&lt;/a&gt;.&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/jobs-drupal-org-ixp.png" data-entity-uuid="bb38fba3-0e66-44eb-836e-b63a78a0ba36" data-entity-type="file" alt="Screenshot of jobs.drupal.org IXP developer hub." width="600" height="288" loading="lazy"&gt;&lt;p&gt;Interested IXP developers apply for positions, and upon an offer from one of the participating organizations, both parties notify the Drupal-IXP site that the engagement has begun.&lt;/p&gt;&lt;p&gt;Both the IXP developer and hiring organization are required to submit periodic reports to Drupal-IXP to ensure all program requirements are being met (including a minimum number of mentoring hours.)&lt;/p&gt;&lt;p&gt;Once the minimum program length has been met (160 hours of paid work,) the hiring organization is eligible to receive 250 contribution credits upon a final review by IXP program volunteers.&amp;nbsp;&lt;/p&gt;&lt;h2&gt;What types of tasks are IXP developers suited for?&lt;/h2&gt;&lt;p&gt;Keeping in mind that individual IXP’s will have diverse backgrounds, and, based on research we've done, IXP developers may be well-suited for tasks like:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Drupal core and module updates&lt;/li&gt;&lt;li&gt;Drupal site-building&lt;/li&gt;&lt;li&gt;Quality assurance&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Depending on the non-Drupal background, IXPs might also be well-positioned to take on more complex or specific tasks.&lt;/p&gt;&lt;p&gt;We realize that the more guidance we can provide hiring organizations, the more successful this program will be; so we’ve started a &lt;a href="https://www.drupal.org/node/3516295"&gt;Best practices for hiring organizations&lt;/a&gt; document and plan on collecting data from more organizations to help provide additional information (and case studies) to help with the IXP hiring process.&lt;/p&gt;&lt;h2&gt;What are the program requirements?&lt;/h2&gt;&lt;p&gt;The complete Drupal IXP requirements for interested parties are available at &lt;a href="https://www.drupal.org/ixp"&gt;https://www.drupal.org/ixp&lt;/a&gt;&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/drupal-org-ixp.png" data-entity-uuid="31481e9f-14ba-4a39-8731-f1612cc9a997" data-entity-type="file" alt="drupal.org IXP home page." width="600" height="315" loading="lazy"&gt;&lt;p&gt;The &lt;a href="https://www.drupal.org/ixp/ixp-for-new-developers"&gt;IXP for new developers&lt;/a&gt; page details the minimum recommended skills level (although hiring organizations are welcome to hire at any skill level) as long as the IXP developers being hired have less than 3 months of paid experience.&lt;/p&gt;&lt;p&gt;The &lt;a href="https://www.drupal.org/ixp/ixp-for-organizations"&gt;IXP for organizations&lt;/a&gt; page details mandatory program requirements including, but not limited to, at least 160 hours of paid work and a minimum of 1 hour of mentoring for every 10 hours of work.&lt;/p&gt;&lt;h2&gt;Moving forward&lt;/h2&gt;&lt;p&gt;This is only the beginning of the Drupal IXP program. We are looking forward to learning valuable lessons along the way, and fully expect the program to evolve as more and more organizations get involved.&lt;/p&gt;&lt;p&gt;Have questions? Fee free to use our &lt;a href="https://www.drupaleasy.com/contact-us"&gt;Contact&lt;/a&gt; page or ping us in &lt;a href="https://drupal.slack.com/archives/C06198DKQ15"&gt;#ixp-fellowship channel of the Drupal Slack workspace&lt;/a&gt;. &amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
  <pubDate>Thu, 24 Apr 2025 10:51:38 -0400</pubDate>
    
    <guid isPermaLink="false">1127 at http://drupaleasy.com</guid>
    <dc:creator>drupaleasy@gmail.com (Michael Anello)</dc:creator></item>
<item>
  <title>DrupalCon Atlanta 2025 sessions not to be missed - according to me (ultimike)</title>
  <link>https://www.drupaleasy.com/blogs/ultimike/2025/03/drupalcon-atlanta-2025-sessions-not-be-missed-according-me-ultimike</link>
  <description>
&lt;p dir="ltr"&gt;&lt;span&gt;As part of &lt;/span&gt;&lt;a href="https://www.drupaleasy.com/academy/learning-community"&gt;&lt;span&gt;weekly office hours for DrupalEasy students and alumni&lt;/span&gt;&lt;/a&gt;&lt;span&gt;, I am often asked to suggest sessions at upcoming Drupal events that I think are worthwhile. During one our our most recent DrupalEasy Office Hours, I was again asked to run down the list of my picks from all the sessions at &lt;/span&gt;&lt;a href="https://events.drupal.org/atlanta2025"&gt;&lt;span&gt;DrupalCon Atlanta 2025&lt;/span&gt;&lt;/a&gt;&lt;span&gt;, and afterward I thought that it might make a fun blog post.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Of course, I can't in good conscience suggest that my picks are the best for anyone else to attend among the ginormous volume of sessions available. I can share only sessions that interest me. My selection of sessions have been made, with the only criteria being my logical or illogical and sometimes silly reason to listen to them. It is not a list of sessions targeted at beginners, project managers, those just getting into module or theme development or that I specifically recommend for those attending their first or even their twenty-first DrupalCon.&amp;nbsp; (Although many of the sessions may be interesting to all of those folks.)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;It is rather a simple (but not short) list of sessions that I will either watch in-person (not likely) or watch a recording of in the coming weeks (most likely.) It doesn't include keynotes (sorry, &lt;/span&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/keynote-driesnote"&gt;&lt;span&gt;Dries&lt;/span&gt;&lt;/a&gt;&lt;span&gt;), summits, the 10-minute mini sessions held in the expo hall, or anything other than standard 50-minute sessions. I won't even mention the session I'm co-presenting &lt;/span&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/ixp-fellowship-using-contribution-credits-encourage-organizations-hire-new"&gt;&#128521;&lt;/a&gt;.&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;So here goes; in chronological order, the list of sessions I am attending, and why:&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;Tuesday sessions&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/4-big-ideas-ux-and-content-strategy"&gt;&lt;span&gt;4 Big Ideas in UX and Content Strategy&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - I am always up for any session presented by Suzanne Dergacheva - one of Drupal's clearest thinkers and best presenters.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/documentation-initiatives-starshot-and-drupalorg"&gt;&lt;span&gt;Documentation Initiatives for Starshot and Drupal.org&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - I don't contribute a whole lot to documentation, but Joe Shindelar knows his stuff and always presents well. I'm sure I'll pick up a nugget or two of useful information from this session.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/meet-ai-automators-power-everything-drupal-cms-ckeditor-ai-agents-no-code"&gt;&lt;span&gt;Meet the AI Automators that power everything in Drupal CMS - CKEditor, AI Agents, no code required!&amp;nbsp;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&amp;nbsp;- I have no doubt that this session will have more information about AI that will fit in my brain in a single sitting. Marcus is one of the leading minds behind Drupal's AI stuff. This is definitely one to watch later, rather than see in person (I need a pause button so I can take notes for this session.)&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/recipes-its-about-time"&gt;&lt;span&gt;Recipes: It's About Time!&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - I'm a big fan of recipes, and I'll watch anything Martin presents. No-brainer for me.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/future-drupal-theming-ai-experience-builder-and-beyond"&gt;&lt;span&gt;The Future of Drupal Theming: AI, Experience Builder, and Beyond&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - I admit that I'm mainly anticipating the sophomoric humor Mike Herchel can't help to weave into his sessions &#128515;, but I guarantee that I'll learn a bunch from his deeply Floridian (in only the best ways) brain.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/ai-new-ui-how-we-are-building-ai-drupal-cms"&gt;&lt;span&gt;AI is the new UI - how we are building AI into Drupal CMS&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - Jamie is another of the leaders of Drupal's AI efforts and is a fantastic presenter and I always learn something from his presentations.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/creating-composer-aware-modules-drupal-cores-new-package-manager-module"&gt;&lt;span&gt;Creating Composer aware modules with Drupal core's new Package Manager module&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - Ted is a good friend, so I have to include this on my list or he won't let me pet his dog anymore.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/design-systems-drupal-way"&gt;&lt;span&gt;Design systems, the Drupal way&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - I am not a designer, nor am I familiar with the speaker, but I am interested in how design workflows will flow into Drupal in the future, so I'll be checking this session out.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/security-team-panel"&gt;&lt;span&gt;Security team panel&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - I always watch security team presentations from DrupalCon events. Not planning on stopping now.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/drupal-association-public-board-meeting"&gt;&lt;span&gt;Drupal Association Public Board Meeting&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - I'm a bit of a Drupal governance nerd, I never miss one of these.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/drupal-next-gen-navigation-enhanced-admin-ui-and-better-ux"&gt;&lt;span&gt;Drupal Next-Gen Navigation: Enhanced Admin UI and better UX&amp;nbsp;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&amp;nbsp;- Cristina is a fantastic speaker (I don't know Pablo); I don't miss too many of her sessions. Plus, I think the new Drupal core Navigation module is cool and I want to see what's next.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/drupal-recipes-initiative-update"&gt;&lt;span&gt;Drupal Recipes Initiative Update&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - Jim Birch is among the best Drupal presenters around (nobody tell him I said that, we need to keep him humble.) Plus, it's recipes (see above.)&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/drupal-workspaces-revolutionizing-content-staging-and-workflows"&gt;&lt;span&gt;Drupal Workspaces: Revolutionizing Content Staging and Workflows&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - I don't use Workspaces, but the presenter's name is Matt Danger, so how can I not give this one a listen?&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/experience-builder-coming-are-you-ready"&gt;&lt;span&gt;Experience Builder is coming. Are you ready?&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - it's about Experience Builder by one of the leaders of the project. It's not hyperbole to say that this project is one of, if not, the most important projects in the Drupal community.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/mixing-schemaorg-blueprints-module-drupal-recipe-bake-sweet-content-model"&gt;&lt;span&gt;Mixing the Schema.org Blueprints module into a Drupal Recipe to bake a sweet content model&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - Jacob is an A+ presenter and I'm a big fan of Schema.org Blueprints module.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/working-ai-agents-drupal-cms-create-your-own-agents-and-ai-powered-migration"&gt;&lt;span&gt;Working with the AI Agents in Drupal CMS - Create your own agents and AI powered migration&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - more AI content with a solid presenter who knows his stuff.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/accessible-slideshows-button-button-whos-got-button"&gt;&lt;span&gt;Accessible Slideshows - Button, button, who's got the button?&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - I'm not sure why this is, but if I don't include this in my list, I'll have to buy AmyJune a drink.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/building-better-authoring-experience"&gt;&lt;span&gt;Building A Better Authoring Experience&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - I'll watch anything Greg Dunlap presents. Clear, concise, knowledgeable, A+ communicator.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;Wednesday sessions&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/drupal-cms-now-and-beyond"&gt;&lt;span&gt;Drupal CMS now and beyond&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - A topic I care about by two of its leaders? Easy decision.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/drupal-cms-golden-standard-privacy-and-data-protection"&gt;&lt;span&gt;Drupal CMS: Golden standard for privacy and data protection&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - Jurgen is quickly becoming another presenter that I'll watch present on almost any topic.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/figma-function-bridging-design-and-development-storybook-drupal"&gt;&lt;span&gt;From Figma to Function: Bridging Design and Development with Storybook &amp;amp; Drupal&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - I am not familiar with either of the presenters, but this is a topic I'm interested in (especially any SDC angles.)&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/paragraphs-and-single-directory-components-dynamic-duo"&gt;&lt;span&gt;Paragraphs and Single Directory Components: A dynamic duo&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - again, I'm not familiar with the presenters, but SDC…and, as you may have figured out, I do spend a lot of time with presenters I know and love, so a good reason to experience some others.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/future-drupal-core-age-drupal-cms"&gt;&lt;span&gt;The future of Drupal core in the age of Drupal CMS&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - it's Gábor talking about the future! I'm in.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/neurodivergency-superpower-how-diverse-teams-function-better"&gt;&lt;span&gt;The Neurodivergency SuperPower - How Diverse Teams Function Better&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - Matthew presented this (or something similar) at Florida DrupalCamp&amp;nbsp;&lt;/span&gt;&lt;a href="https://www.fldrupal.camp/"&gt;&lt;span&gt;https://www.fldrupal.camp/&lt;/span&gt;&lt;/a&gt;&lt;span&gt; a couple of months ago and people were raving about it.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/driesnote-followup-discussion"&gt;&lt;span&gt;Driesnote Followup Discussion&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - Dries talking about Drupal is almost always interesting to me.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/drupalcon-game"&gt;&lt;span&gt;DrupalCon as a Game&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - Ryan Price is one of my original Drupal friends and I didn't realize he was presenting until a few days ago. Gotta check this one out.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/supply-chain-security-drupal-and-composer"&gt;&lt;span&gt;Supply Chain Security in Drupal and Composer&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - this will be a deep dive by some really smart people. I'll be doing my best to follow along.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/what-do-marketers-really-want-unpacking-user-research-drupal-cms"&gt;&lt;span&gt;What Do Marketers Really Want? Unpacking the User Research for Drupal CMS&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - another session that Suzanne is involved with. Can't not watch.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/creating-opportunities-internships-drupal-careers"&gt;&lt;span&gt;Creating Opportunities: From Internships to Drupal Careers&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - a topic near-and-dear to my heart co-presented by an alum of our Drupal Career Online course that I teach. (I'm not crying, you're crying! &#128557;)&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/drupal-commerces-starshot-roadmap"&gt;&lt;span&gt;Drupal Commerce's Starshot Roadmap&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - I don't use Drupal Commerce all that often, but Ryan Szrama is another top-notch Drupal presenter and I tend not to miss his presentations.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/end-end-collaboration-drupal-edittogether"&gt;&lt;span&gt;End-to-end collaboration in Drupal with EditTogether&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - this is a fantastic project from a fantastic group of human beings, presented by fantastic presenters. Fantastic&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/following-drupal-core-development-it-possible-understand-every-added-change"&gt;&lt;span&gt;Following Drupal core development: Is it possible to understand every added change?&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - the answer is "no", but I still might watch this one.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/community-initiative-drupal-cms-track-dashboard-module"&gt;&lt;span&gt;From Community Initiative to a Drupal CMS Track: the Dashboard Module&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - Matthew Tift is a fantastic speaker - any presentation he's involved with is going to be solid.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/planning-takeover-success-story-implementing-storybook-drupal-10-and-layout"&gt;&lt;span&gt;Planning a Takeover: A Success Story in Implementing Storybook, Drupal 10, and Layout Builder&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - this checks several boxes for me: design workflow and a solid speaker (Mike Miles.) I'm hoping there will be some SDC in this one as well.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/distributions-are-dead-long-live-distributions-drupal-cms-story"&gt;&lt;span&gt;Distributions are dead, long live distributions: a Drupal CMS story&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - two fun speakers and a topic involving the "d" word? Should be fun.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/drupalorg-engineering-panel"&gt;&lt;span&gt;Drupal.org Engineering Panel&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - I never miss one of these - always good info, especially if you're a project maintainer.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/best-and-worst-themes-modules-widgets-extensions-and-ai-tools-ada-compliance"&gt;&lt;span&gt;The Best (and Worst) Themes, Modules, Widgets, Extensions, and AI tools for ADA Compliance&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - I like opinions and I hope Alyssa Panetta doesn't hold back on the "worst."&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://events.drupal.org/atlanta2025/session/what-wordpress-conflict-means-open-source-businesses"&gt;&lt;span&gt;What the WordPress Conflict Means for Open Source Businesses&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - George DeMet is a friend and who doesn't love a little bit of schadenfreude?&lt;/span&gt;&lt;/p&gt;</description>
  <pubDate>Sat, 22 Mar 2025 19:47:02 -0400</pubDate>
    
    <guid isPermaLink="false">1126 at http://drupaleasy.com</guid>
    <dc:creator>drupaleasy@gmail.com (Michael Anello)</dc:creator></item>
<item>
  <title>No, not "Claro", but "Klaro" (Cookie &amp; Consent Management)</title>
  <link>https://www.drupaleasy.com/blogs/ultimike/2024/12/no-not-claro-klaro-cookie-consent-management</link>
  <description>
&lt;p dir="ltr"&gt;&lt;span&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/klaro-logo.png" data-entity-uuid="61e3243b-4e5f-477f-9431-a71274fbf8d6" data-entity-type="file" alt="Klaro logo" width="155" height="94" class="align-right" loading="lazy"&gt;In our previous &lt;/span&gt;&lt;a href="https://www.drupaleasy.com/blogs/ultimike/2024/12/inside-drupal-cms"&gt;&lt;span&gt;Inside Drupal CMS blog post&lt;/span&gt;&lt;/a&gt;&lt;span&gt;, we mentioned that the &lt;/span&gt;&lt;a href="https://www.drupal.org/project/klaro"&gt;&lt;span&gt;Klaro Cookie &amp;amp; Consent Management module&lt;/span&gt;&lt;/a&gt;&lt;span&gt; was being used for privacy functionality.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;What exactly is "privacy functionality" and how does Klaro help with it? That's the question that this article aims to answer.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr"&gt;The absolute basics&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;The Drupal Klaro module implements the open-source &lt;/span&gt;&lt;a href="https://github.com/klaro-org/klaro-js"&gt;&lt;span&gt;Klaro Privacy Manager Javascript library&lt;/span&gt;&lt;/a&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;The library provides web sites an easy way to be transparent about the third-party applications on the site, as well as provide a mechanism for users to opt-in or -out of said services.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;It is designed to help sites be compliant with privacy standards including &lt;/span&gt;&lt;a href="https://gdpr.eu/"&gt;&lt;span&gt;GDPR&lt;/span&gt;&lt;/a&gt;&lt;span&gt; and &lt;/span&gt;&lt;a href="https://en.wikipedia.org/wiki/EPrivacy_Directive"&gt;&lt;span&gt;ePrivacy&lt;/span&gt;&lt;/a&gt;&lt;span&gt;.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;The module's documentation provides this easy-to-understand list of the main three objectives of the module:&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;span&gt;User's data is not passed on to third parties without consent.&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Tracking only takes place after consent.&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;No changes are made to the browser (cookies, local storage, session storage) without consent.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p dir="ltr"&gt;&lt;em&gt;It should be noted that if you are using the &lt;/em&gt;&lt;a href="https://www.drupal.org/project/eu_cookie_compliance/"&gt;&lt;em&gt;EU Cookie Compliance module&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, the maintainers of that module suggest that you switch to Klaro, as their development efforts will focus on maintaining a stable release of EU Cookie Compliance while encouraging modern Drupal sites to switch to Klaro.&lt;/em&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;em&gt;It should also be noted that Klaro provides a &lt;/em&gt;&lt;a href="https://www.klaro.org/"&gt;&lt;em&gt;paid version at Klaro.org&lt;/em&gt;&lt;/a&gt;&lt;em&gt; that includes "additional server-side functionality."&lt;/em&gt;&lt;/p&gt;&lt;h2 dir="ltr"&gt;Installation&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;The Klaro module can be installed and enabled using standard Drupal best practices (Composer, Drush.) The Klaro module does not contain any submodules.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;One interesting bit is that the module has a dependency on the &lt;/span&gt;&lt;a href="https://www.drupal.org/project/klaro_js"&gt;&lt;span&gt;Klaro JS module&lt;/span&gt;&lt;/a&gt;&lt;span&gt;. This is of Composer type&amp;nbsp;&lt;/span&gt;&lt;em&gt;drupal-library&lt;/em&gt;&lt;span&gt;, which means it will be automatically installed by Composer in your site's libraries/ directory (assuming that your composer/installers Composer plugin configuration includes a mapping for&amp;nbsp;&lt;/span&gt;&lt;em&gt;drupal-library&lt;/em&gt;&lt;span&gt;.) This library contains the files from the Javascript library that are necessary for the Klaro Drupal module.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;The &lt;/span&gt;&lt;a href="https://www.drupal.org/docs/extending-drupal/contributed-modules/contributed-module-documentation/klaro-cookie-consent-management"&gt;&lt;span&gt;module's documentation on drupal.org&lt;/span&gt;&lt;/a&gt;&lt;span&gt; is better than most contributed modules, and goes into a reasonable amount of detail for each of the available configuration options. For this article, I'll focus on some of the highlights.&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr"&gt;The&amp;nbsp;&lt;em&gt;real&lt;/em&gt; installation&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;strong&gt;In order for the Klaro Javascript library to do its thing, third-party HTML script tags must be slightly modified with different attributes.&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Luckily, the Klaro Drupal module provides an&amp;nbsp;&lt;/span&gt;&lt;em&gt;Automatic Attribution&lt;/em&gt;&lt;span&gt; Drupal Javascript behavior that attempts to automatically update third-party script tag attributes. Script libraries added via Drupal libraries, page attachments, and preprocess fields should work out-of-the-box. The module also includes experimental support for processing the final HTML of each page request for any third-party script tags that don't fall into one of the standard categories (iframe tags added directly to body fields, for example.)&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;As an example, here's a script tag from DrupalEasy.com before using Klaro:&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class="language-html"&gt;&amp;lt;script async="" src="https://www.googletagmanager.com/gtag/js?id=G-WYJ99ZQTFR"&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Here's the same tag after Klaro is installed and configured:&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class="language-html"&gt;&amp;lt;script async="" data-src="https://www.googletagmanager.com/gtag/js?id=G-WYJ99ZQTFR" type="text/plain" data-type="text/javascript" data-name="unknown_app"&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p dir="ltr"&gt;&lt;span&gt;By modifying all of a page's third-party script tags, their loading can be controlled by Klaro's consent dialog. This is the basic functionality that the module provides.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;It is also important to note that this&amp;nbsp;&lt;/span&gt;&lt;em&gt;Automatic Attribution&lt;/em&gt;&lt;span&gt; functionality has some configuration options - on DrupalEasy.com, we needed to enable all options, including the experimental&amp;nbsp;&lt;/span&gt;&lt;em&gt;Process final HTML&lt;/em&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/automatic-attribution-config.png" data-entity-uuid="f2747b22-2dbe-47c3-ad01-f672d275e22d" data-entity-type="file" alt="Klaro library settings screenshot." width="600" height="469" class="align-center" loading="lazy"&gt;&lt;p dir="ltr"&gt;&lt;span&gt;But, there's a&amp;nbsp;&lt;/span&gt;&lt;strong&gt;big caveat&lt;/strong&gt;&lt;span&gt; - you might have some third-party script tags on your site that Klaro's&amp;nbsp;&lt;/span&gt;&lt;em&gt;Automatic Attribution&lt;/em&gt;&lt;span&gt; doesn't catch; and this could leave your site always loading those third-party javascript files despite what Klaro is telling you. To help find any of these missed tags, the module provides a handy&amp;nbsp;&lt;/span&gt;&lt;em&gt;Log unknown resources&lt;/em&gt;&lt;span&gt; option - I found this extremely useful when configuring the module.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;On DrupalEasy.com, for example, we use analytics from &lt;/span&gt;&lt;a href="https://www.adroll.com/"&gt;&lt;span&gt;AdRoll&lt;/span&gt;&lt;/a&gt;&lt;span&gt; and marketing automation from &lt;/span&gt;&lt;a href="https://www.mautic.org/"&gt;&lt;span&gt;Mautic&lt;/span&gt;&lt;/a&gt;&lt;span&gt; and neither of these were automatically picked up by Klaro due to their implementation details.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;For both, we had to manually adjust the way their script tags were written - see details about how Mautic's code was modified in &lt;/span&gt;&lt;a href="https://www.drupal.org/project/mautic/issues/3495062"&gt;&lt;span&gt;this issue&lt;/span&gt;&lt;/a&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr"&gt;Basic configuration&lt;/h2&gt;&lt;p&gt;&lt;span&gt;Once the module is installed, the next step is to manage permissions for the module. Most sites will want to configure the module so that all users, including anonymous and authenticated ones are presented with the Klaro UI via the&lt;/span&gt;&lt;em&gt; Use Klaro UI&lt;/em&gt;&lt;span&gt; permission.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/permissions.png" data-entity-uuid="1e6e8afa-2224-4083-92f5-6b757f9d9020" data-entity-type="file" alt="Klaro permissions screenshot." width="600" height="324" class="align-center" loading="lazy"&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Its main configuration page, via&amp;nbsp;&lt;/span&gt;&lt;em&gt;Configuration | User interface | Klaro!&lt;/em&gt;&lt;span&gt; (/admin/config/user-interface/klaro) contains a slightly-intimidating number of configuration options spread across six vertical tabs.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Perhaps the most important is the&amp;nbsp;&lt;/span&gt;&lt;em&gt;Klaro! dialog mode&lt;/em&gt;&lt;span&gt; - four options are presented:&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Silent (no dialog, only modify attribute and block sources) - in this mode there is no "global" dialog box to decline/accept/customize consent, and all third-party sources are blocked. Instead, there are individual&amp;nbsp;&lt;/span&gt;&lt;em&gt;accept&lt;/em&gt;&lt;span&gt; links inline for 3rd-party content (from YouTube, for example.) This is the default setting that is currently used in&amp;nbsp;&lt;/span&gt;&lt;em&gt;Drupal CMS&lt;/em&gt;&lt;span&gt;.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;p&gt;&lt;span&gt;Notice dialog - displays a dialog asking the user to decline/accept/customize third-party cookie data.&amp;nbsp;&lt;/span&gt;&lt;em&gt;This is the option currently being used on DrupalEasy.com.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/dialog.png" data-entity-uuid="1d0ea6dc-d5f1-4ee6-a84e-585cb89e2a25" data-entity-type="file" alt="Notice dialog screenshot." width="600" height="206" loading="lazy"&gt;&lt;/p&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Notice dialog as modal - displays a modal dialog asking the user to decline/accept/customize third-party cookie data.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;p&gt;&lt;span&gt;Consent dialog modal - displays the&amp;nbsp;&lt;/span&gt;&lt;em&gt;Customize&lt;/em&gt;&lt;span&gt; version of the modal dialog.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/customize-modal.png" data-entity-uuid="b2e3c319-2a34-4ae3-8b13-f10b2d58c389" data-entity-type="file" alt="Consent dialog screenshot." width="600" height="574" loading="lazy"&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Other functionality available on the default&amp;nbsp;&lt;/span&gt;&lt;em&gt;General&lt;/em&gt;&lt;span&gt; vertical tab include options for various buttons and availability of the consent dialog.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Additional configuration options allow you to customize the styling of the Klaro dialog boxes as well as controlling the Klaro cookie data and some advanced options.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr"&gt;Final thoughts&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;As of the publishing of this article, the most recent version of the Klaro module is a release candidate, but based on the issue queue, it seems that work is actively moving toward a full release in the near future.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;I can't overstate how much I appreciate that it is built on a well-supported open-source library that appears to have the momentum and financial backing to keep it updated.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;After spending a few hours with the module, I recognize the value of how it works and have a good deal of confidence that it is working correctly.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Thank you to Jürgen Haas (&lt;/em&gt;&lt;a href="https://www.drupal.org/u/jurgenhaas"&gt;&lt;em&gt;jurgenhaas&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,) contributor to the Klaro Cookie &amp;amp; Consent Management module and Drupal CMS Privacy track lead, for reviewing this article prior to publication.&amp;nbsp;&lt;/em&gt;&lt;/p&gt;</description>
  <pubDate>Mon, 30 Dec 2024 07:00:00 -0500</pubDate>
    
    <guid isPermaLink="false">1125 at http://drupaleasy.com</guid>
    <dc:creator>drupaleasy@gmail.com (Michael Anello)</dc:creator></item>
<item>
  <title>Inside Drupal CMS</title>
  <link>https://www.drupaleasy.com/blogs/ultimike/2024/12/inside-drupal-cms</link>
  <description>
&lt;p dir="ltr"&gt;&lt;span&gt;There's been more than a few articles written over the past year about the promise of&amp;nbsp;&lt;/span&gt;&lt;a href="https://new.drupal.org/drupal-cms"&gt;&lt;span&gt;Drupal CMS&lt;/span&gt;&lt;/a&gt;&lt;span&gt;, but not a whole lot of articles about what Drupal CMS will specifically include. This article will attempt to fill in the gaps, by providing a bit of a high-level synopsis of what the 1.0 version of Drupal CMS will currently include. It is meant to provide an overview of most of the specific modules, information architecture, and functionality that you can expect out-of-the-box.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;em&gt;Note: This article is based on a pre-release version of Drupal CMS from December 8, 2024. Drupal CMS 1.0 is scheduled to be released on January 15, 2025.&lt;/em&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Before we get started, it is important to set expectations for the initial version, as it will not include everything that many folks may be expecting. The best-of-breed&amp;nbsp;&lt;/span&gt;&lt;a href="https://www.drupal.org/project/experience_builder"&gt;&lt;span&gt;Experience Builder&lt;/span&gt;&lt;/a&gt;&lt;span&gt; and perhaps some additional in-browser styling functionality will come in a future release. It might be best to think of the 1.0 release as a next-generation, community-supported "distribution" that is well on its way to meeting the needs of no-code site-builders.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;em&gt;I hesitated to use the word "distribution" because of its previous history in the Drupal community. I'm open to suggestions as to what we call something that includes Drupal core and a collection of recipes.&lt;/em&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;All of the contrib modules I mention in this article are included with Drupal CMS. There are no additional downloads or command line commands that need to be run in order to utilize any of the functionality mentioned in this article.&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr"&gt;Recipes all the way down&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Drupal CMS is a collection of recipes that build on each other as well as on Drupal core. While there is a custom profile (more on that in a bit,) it doesn't include any contrib modules or configuration since&amp;nbsp;&lt;/span&gt;&lt;strong&gt;everything&lt;/strong&gt;&lt;span&gt; is in the various recipes that come with Drupal CMS.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;There are (&lt;/span&gt;&lt;a href="https://www.drupal.org/project/distributions_recipes/issues/3421666"&gt;&lt;span&gt;tentatively&lt;/span&gt;&lt;/a&gt;&lt;span&gt;) three types of recipes:&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Foundational&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Kit&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Site&lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;p dir="ltr"&gt;&lt;span&gt;The recipes discussed below generally are of type&amp;nbsp;&lt;/span&gt;&lt;em&gt;Site&lt;/em&gt;&lt;span&gt;, but most include recipes of type&amp;nbsp;&lt;/span&gt;&lt;em&gt;Foundational&lt;/em&gt;&lt;span&gt; and&amp;nbsp;&lt;/span&gt;&lt;em&gt;Kit&lt;/em&gt;&lt;span&gt; as dependencies.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr"&gt;Drupal CMS Installer&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;The installer for Drupal CMS is quite different from previous Drupal installation profiles as one of its main goals is to provide users the ability to select zero or more optional recipes to be applied and streamline some of the other normal installation steps (setting the site name and root admin user account.)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Currently, the installer exposes six&amp;nbsp;&lt;/span&gt;&lt;em&gt;Site&lt;/em&gt;&lt;span&gt; recipes that can be applied during site installation:&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Blog&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Case studies&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Events&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;News&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Person profiles&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Projects&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;figure role="group" class="align-center"&gt;
&lt;img alt="Drupal CMS installer recipe selection screen" data-entity-type="file" data-entity-uuid="375fbdbd-e095-4cc0-bd6d-6b2f6bf65290" height="668" src="https://www.drupaleasy.com/sites/default/files/inline-images/installer-recipes.png" width="1376" loading="lazy"&gt;
&lt;figcaption&gt;Drupal CMS installer recipe selection screen&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;If not applied during the installation process, recipes can be applied to a site at a later time either via&amp;nbsp;&lt;/span&gt;&lt;a href="https://www.drupal.org/project/project_browser/"&gt;&lt;span&gt;Project Browser&lt;/span&gt;&lt;/a&gt;&lt;span&gt; or the command line.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr"&gt;Installing recipes after site installation&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;As alluded to, Project Browser comes with Drupal CMS. If one of the recipes mentioned in the previous section are not applied during site installation, they can be applied via Project Browser at any time afterward. In addition, there are several other recipes included with Drupal CMS that are not available during site installation:&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Forms&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;SEO tools&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Accessibility tools&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;figure role="group" class="align-center"&gt;
&lt;img alt="Partial display of recipes in Project Browser" data-entity-type="file" data-entity-uuid="a54533e9-f971-463a-a424-01601c9a5fed" height="1554" src="https://www.drupaleasy.com/sites/default/files/inline-images/project-browser-recipes.png" width="1424" loading="lazy"&gt;
&lt;figcaption&gt;Partial display of recipes in Project Browser&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;There are also several other&amp;nbsp;&lt;/span&gt;&lt;em&gt;Site&lt;/em&gt;&lt;span&gt; recipes that do not appear either on the installation page nor Project Browser (&lt;/span&gt;&lt;a href="https://www.drupal.org/project/drupal_cms/issues/3493387"&gt;&lt;span&gt;yet&lt;/span&gt;&lt;/a&gt;&lt;span&gt;) and can be applied via the command line:&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;span&gt;AI support&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Analytics&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Multilingual&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Search&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Both&amp;nbsp;&lt;/span&gt;&lt;em&gt;AI support&lt;/em&gt;&lt;span&gt; and&amp;nbsp;&lt;/span&gt;&lt;em&gt;Analytics&lt;/em&gt;&lt;span&gt; require input when the recipe is applied (API keys) while&amp;nbsp;&lt;/span&gt;&lt;em&gt;Multilingual&lt;/em&gt;&lt;span&gt; and&amp;nbsp;&lt;/span&gt;&lt;em&gt;Search&lt;/em&gt;&lt;span&gt; are not yet complete recipes.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr"&gt;Recipe details&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;In the following sections, highlights of what each of the&amp;nbsp;&lt;/span&gt;&lt;em&gt;Site&lt;/em&gt;&lt;span&gt; recipes include is outlined. Note that all of the recipes included below also include some level of configuration that is applied to the site when the recipe is applied.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h3 dir="ltr"&gt;Drupal CMS base recipe&lt;/h3&gt;&lt;p dir="ltr"&gt;&lt;span&gt;The mother of all Drupal CMS recipes, this is automatically applied during site installation for all Drupal CMS sites. It includes much of the base level functionality including (but definitely not limited to:)&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Page content type&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Tags vocabulary&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Various media types&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;HTML emails (via&amp;nbsp;&lt;/span&gt;&lt;a href="https://www.drupal.org/project/easy_email/"&gt;&lt;span&gt;Easy email&lt;/span&gt;&lt;/a&gt;&lt;span&gt; and&amp;nbsp;&lt;/span&gt;&lt;a href="https://www.drupal.org/project/symfony_mailer_lite"&gt;&lt;span&gt;Symfony mailer lite&lt;/span&gt;&lt;/a&gt;&lt;span&gt; modules)&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Anti-spam functionality (&lt;/span&gt;&lt;a href="https://www.drupal.org/project/antibot"&gt;&lt;span&gt;Antibot&lt;/span&gt;&lt;/a&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;a href="https://www.drupal.org/project/honeypot"&gt;&lt;span&gt;Honeypot&lt;/span&gt;&lt;/a&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;a href="https://www.drupal.org/project/friendlycaptcha/"&gt;&lt;span&gt;Friendly captcha&lt;/span&gt;&lt;/a&gt;&lt;span&gt; modules)&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Privacy functionality (&lt;/span&gt;&lt;a href="https://www.drupal.org/project/klaro"&gt;&lt;span&gt;Klaro&lt;/span&gt;&lt;/a&gt;&lt;span&gt; module)&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Basic SEO functionality (Redirect, Pathauto, Easy breadcrumbs modules)&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Automatic updates&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Project browser&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;a href="https://www.drupal.org/project/dashboard"&gt;&lt;span&gt;Dashboard&lt;/span&gt;&lt;/a&gt;&lt;span&gt; module&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;a href="https://www.drupal.org/project/autosave_form"&gt;&lt;span&gt;Autosave form&lt;/span&gt;&lt;/a&gt;&lt;span&gt; module&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;a href="https://www.drupal.org/project/coffee"&gt;&lt;span&gt;Coffee&lt;/span&gt;&lt;/a&gt;&lt;span&gt; module&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;a href="https://www.drupal.org/project/eca"&gt;&lt;span&gt;ECA&lt;/span&gt;&lt;/a&gt;&lt;span&gt; module&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;a href="https://www.drupal.org/project/search_api"&gt;&lt;span&gt;Search API&lt;/span&gt;&lt;/a&gt;&lt;span&gt; module&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 dir="ltr"&gt;Blog recipe&lt;/h3&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Blog content type (with tagging)&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;a href="https://www.drupal.org/project/selective_better_exposed_filters"&gt;&lt;span&gt;Selective better exposed filters&lt;/span&gt;&lt;/a&gt;&lt;span&gt; module&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 dir="ltr"&gt;Case study&lt;/h3&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Case study content type (with tagging)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;figure role="group" class="align-center"&gt;
&lt;img alt="Subset of fields from a Case Study content type's Add case study page." data-entity-type="file" data-entity-uuid="8d8f6d16-7fca-4385-9e5a-b321c63b6e3d" height="552" src="https://www.drupaleasy.com/sites/default/files/inline-images/case-study-fields-subset.png" width="706" loading="lazy"&gt;
&lt;figcaption&gt;Subset of fields from a Case Study content type's&amp;nbsp;&lt;em&gt;Add case study&lt;/em&gt; page.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 dir="ltr"&gt;Events&lt;/h3&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Event content type (with tagging)&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;a href="https://www.drupal.org/project/address"&gt;&lt;span&gt;Address&lt;/span&gt;&lt;/a&gt;&lt;span&gt; and&amp;nbsp;&lt;/span&gt;&lt;a href="https://www.drupal.org/project/geofield"&gt;&lt;span&gt;Geofield&lt;/span&gt;&lt;/a&gt;&lt;span&gt;-related modules&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;a href="https://www.drupal.org/project/smart_date"&gt;&lt;span&gt;Smart date&lt;/span&gt;&lt;/a&gt;&lt;span&gt; module&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Event-related views&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;figure role="group" class="align-center"&gt;
&lt;img alt="Subset of fields from Event content type's Manage form display page." data-entity-type="file" data-entity-uuid="0cb19cc7-070e-45ea-8455-513e2f9653c3" height="231" src="https://www.drupaleasy.com/sites/default/files/inline-images/event-manage-display-subset.png" width="621" loading="lazy"&gt;
&lt;figcaption&gt;Subset of fields from Event content type's&amp;nbsp;&lt;em&gt;Manage form display&lt;/em&gt; page.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 dir="ltr"&gt;News&lt;/h3&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;span&gt;News content type (with tagging)&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;News-related views&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Selective better exposed filters module&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 dir="ltr"&gt;Person profiles&lt;/h3&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Person content type (with tagging)&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Telephone (core) module&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;figure role="group" class="align-center"&gt;
&lt;img alt="Subset of fields from Person content type's Manage fields page." data-entity-type="file" data-entity-uuid="382e7989-9a79-447e-a47f-fcd1f9aea09f" height="437" src="https://www.drupaleasy.com/sites/default/files/inline-images/person-manage-fields.png" width="625" loading="lazy"&gt;
&lt;figcaption&gt;Subset of fields from Person content type's&amp;nbsp;&lt;em&gt;Manage fields&lt;/em&gt; page.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 dir="ltr"&gt;Projects&lt;/h3&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Project content type (with tagging)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 dir="ltr"&gt;Forms&lt;/h3&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;a href="https://www.drupal.org/project/webform"&gt;&lt;span&gt;Webform&lt;/span&gt;&lt;/a&gt;&lt;span&gt; module&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 dir="ltr"&gt;SEO tools&lt;/h3&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;span&gt;SEO-related fields added to most bundles (title, image, description)&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;a href="https://www.drupal.org/project/field_group"&gt;&lt;span&gt;Field group&lt;/span&gt;&lt;/a&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;a href="https://www.drupal.org/project/focal_point"&gt;&lt;span&gt;Focal point&lt;/span&gt;&lt;/a&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;a href="https://www.drupal.org/project/metatag"&gt;&lt;span&gt;Metatag&lt;/span&gt;&lt;/a&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;a href="https://www.drupal.org/project/robotstxt"&gt;&lt;span&gt;RobotsTxt&lt;/span&gt;&lt;/a&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;a href="https://www.drupal.org/project/seo_checklist"&gt;&lt;span&gt;SEO checklist&lt;/span&gt;&lt;/a&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;a href="https://www.drupal.org/project/simple_sitemap"&gt;&lt;span&gt;Simple sitemap&lt;/span&gt;&lt;/a&gt;&lt;span&gt; modules&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;figure role="group" class="align-center"&gt;
&lt;img alt="SEO-related fields added to content types by the SEO Tools recipe." data-entity-type="file" data-entity-uuid="9b21ddf7-0706-423c-a531-74ec87ebe25c" height="567" src="https://www.drupaleasy.com/sites/default/files/inline-images/seo-fields.png" width="453" loading="lazy"&gt;
&lt;figcaption&gt;SEO-related fields added to content types by the&amp;nbsp;&lt;em&gt;SEO Tools&lt;/em&gt; recipe.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 dir="ltr"&gt;Accessibility tools&lt;/h3&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;a href="https://www.drupal.org/project/editoria11y"&gt;&lt;span&gt;Editoria11y&lt;/span&gt;&lt;/a&gt;&lt;span&gt; module&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;figure role="group" class="align-center"&gt;
&lt;img alt="Editoria11y in action on sample Drupal CMS content." data-entity-type="file" data-entity-uuid="2a98c7df-58d0-4cb5-9379-2d6f992abb0d" height="295" src="https://www.drupaleasy.com/sites/default/files/inline-images/editorially.png" width="646" loading="lazy"&gt;
&lt;figcaption&gt;Editoria11y in action on sample Drupal CMS content.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 dir="ltr"&gt;AI support&lt;/h3&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Drupal Agent Chatbox&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;a href="https://www.drupal.org/project/ai_image_alt_text"&gt;&lt;span&gt;AI image alt text&lt;/span&gt;&lt;/a&gt;&lt;span&gt; module&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;a href="https://www.drupal.org/project/ai"&gt;&lt;span&gt;AI&lt;/span&gt;&lt;/a&gt;&lt;span&gt; module as well as several supporting AI-related modules&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;See&amp;nbsp;&lt;/span&gt;&lt;a href="https://www.drupaleasy.com/blogs/ultimike/2024/12/first-look-drupal-cms-ai-recipe"&gt;&lt;span&gt;https://www.drupaleasy.com/blogs/ultimike/2024/12/first-look-drupal-cms-ai-recipe&lt;/span&gt;&lt;/a&gt;&lt;span&gt; for details&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 dir="ltr"&gt;Analytics&lt;/h3&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;a href="https://www.drupal.org/project/google_tag"&gt;&lt;span&gt;Google tag&lt;/span&gt;&lt;/a&gt;&lt;span&gt; module&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 dir="ltr"&gt;A quick word about recipes&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;If you're new to the world of Drupal recipes, there are a couple of things you should know:&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Recipes are applied to a site, not installed. This is a subtle, yet very important difference from the Drupal of yore. Once a recipe is applied, there is no way to "un-apply" it. Modules and configuration that a recipe applies can only be removed by traditional Drupal methods (as if you created the recipe's configuration yourself.)&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Recipes cannot be updated. If a new improved version of a recipe is provided in the future, it is not currently possible to "upgrade" your recipe to the new one.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p dir="ltr"&gt;&lt;span&gt;While at face value both of these points might seem initially discouraging, they are designed to eliminate lock-in with the recipe author(s) and provide you with the flexibility to tweak a recipe's configuration and keep your site up-to-date with zero reliance on the recipe's author(s.)&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr"&gt;Where is Drupal CMS 1.0 lacking?&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;The initial version won't be a truly no-code solution unless you want your site themed with Olivero. Until Drupal CMS includes tools to create and style pages from the browser, it really isn't valid to call it a no-code site-building tool. Luckily, this is being worked on by many of the brightest minds in the Drupal community.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;There is still room for improvement for in-browser "guidance" for those new to Drupal, although we're setting a nice foundation with both the Dashboard module and a documentation track for Drupal CMS development.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr"&gt;Elephant in the room: Experience builder&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;a href="https://drupal.org/project/experience_builder"&gt;&lt;span&gt;Experience builder&lt;/span&gt;&lt;/a&gt;&lt;span&gt; will be the next-generation page-builder for Drupal that will allow no-code site-builders and authors to create and style customized layouts using best-of-breed tools. Experience builder has often been mentioned as one of the key aspects of Drupal CMS and it will be, just not in the 1.0 version.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr"&gt;Final thoughts&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;As I mentioned at the top of this article, this isn't meant to be a comprehensive list of all the functionality that will be included in Drupal CMS 1.0. There are plenty of other contrib modules and configurations that will be part of this release that I didn't manage to squeeze into the narrative. Make no mistake about it, though: Drupal CMS 1.0 will be jam-packed with Drupal best-practice goodness.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;However:, Without Experience Builder, who is Drupal CMS 1.0 for? I would argue that the initial version is more of a statement of intent from the Drupal community that we're taking no-code solutions seriously and are perhaps better prepared than any other open (or closed-)source solutions to take advantage of current and emerging technologies.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
  <pubDate>Thu, 12 Dec 2024 11:20:40 -0500</pubDate>
    
    <guid isPermaLink="false">1123 at http://drupaleasy.com</guid>
    <dc:creator>drupaleasy@gmail.com (Michael Anello)</dc:creator></item>
<item>
  <title>First look: Drupal CMS AI recipe</title>
  <link>https://www.drupaleasy.com/blogs/ultimike/2024/12/first-look-drupal-cms-ai-recipe</link>
  <description>
&lt;p dir="ltr"&gt;&lt;span&gt;The initial version of the Drupal CMS AI recipe was merged into Drupal CMS on December 3 and I couldn't wait to check it out…(well, I guess I could wait just until the end of my vacation last week &#128512;.) Anyway, the first chance I had, I updated my local development copy of Drupal CMS and got right to it.&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr"&gt;&lt;strong&gt;Quick sidenote&lt;/strong&gt;&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;The first thing I noticed is that the installer had changed since I last updated my local copy (about three weeks ago.) It has a much cleaner look, but it also appears that the AI recipe hasn't been deemed "installer worthy" just yet: not a big deal.&lt;/span&gt;&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/drupal-cms-installer.png" data-entity-uuid="5280e55a-6105-4739-90cb-78b97ef7ea82" data-entity-type="file" alt="Drupal CMS installer page showing available recipes." width="687" height="588" class="align-center" loading="lazy"&gt;&lt;p dir="ltr"&gt;&lt;span&gt;I verified that the recipe was in my local codebase (/recipes/drupal_cms_ai) and went about applying the recipe via the command line. I also reviewed the recipe.yml file to discover that this initial release includes two main bits of AI functionality:&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;span&gt;The&amp;nbsp;&lt;/span&gt;&lt;em&gt;Drupal Agent Chatbot&lt;/em&gt;&lt;span&gt; - this is an admin-only chatbot that knows how to create some Drupal entities, bundles, and fields.&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;The &lt;/span&gt;&lt;a href="https://www.drupal.org/project/ai_image_alt_text"&gt;&lt;span&gt;AI Image Alt Text module&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - this generates alternate text for uploaded content images.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p dir="ltr"&gt;&lt;span&gt;I also noticed that the recipe included the &lt;/span&gt;&lt;a href="https://www.drupal.org/project/ai_simple_provider_installer"&gt;&lt;span&gt;AI Simple Provider Installer module&lt;/span&gt;&lt;/a&gt;&lt;span&gt; (which provides a form to easily select a provider and enter your API keys), but there is no link (&lt;/span&gt;&lt;a href="https://www.drupal.org/project/drupal_cms/issues/3491383"&gt;&lt;span&gt;yet&lt;/span&gt;&lt;/a&gt;&lt;span&gt;) directly to the form, so instead I navigated directly to /admin/config/ai/simple_provider_wizard and entered my OpenAI API key.&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr"&gt;Drupal Agent Chatbot&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Once the recipe was applied and my API credentials entered, I immediately noticed the Drupal Agent Chatbot in the admin area. I did not&amp;nbsp;waste any time, as I wanted to know what it could do:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;&lt;strong&gt;Prompt&lt;/strong&gt;: &lt;/span&gt;&lt;em&gt;&lt;span&gt;What do you know how to do?&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;&lt;strong&gt;Response&lt;/strong&gt;: &lt;/span&gt;&lt;em&gt;&lt;span&gt;I can help you perform a variety of tasks on your Drupal site, including:&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;em&gt;&lt;span&gt;Content Types: Create, edit, or gather information about content types.&lt;/span&gt;&lt;/em&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;em&gt;&lt;span&gt;Fields: Add or configure fields on content types or other entities.&lt;/span&gt;&lt;/em&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;em&gt;&lt;span&gt;Taxonomies: Create and manage vocabularies and terms, which are essentially categories or tags for organizing content.&lt;/span&gt;&lt;/em&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;em&gt;&lt;span&gt;Nodes: Assist in content creation, though this would often require configuration of content types and fields first.&lt;/span&gt;&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p dir="ltr"&gt;&lt;em&gt;&lt;span&gt;If you have a specific task in mind, feel free to ask, and I can let you know how I can assist or even perform the task for you directly!&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Oh my! This was very exciting! I decided to challenge it right away with the creation of a content type that I often use in our beginner-focused &lt;/span&gt;&lt;a href="https://drupaleasy.com/dco"&gt;&lt;span&gt;Drupal Career Online&lt;/span&gt;&lt;/a&gt;&lt;span&gt; course:&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;strong&gt;Prompt&lt;/strong&gt;: &lt;/span&gt;&lt;em&gt;&lt;span&gt;Create a new content type named "Movie" with fields for box office gross, a movie poster, a link to a YouTube video for a trailer, the year of release, and the director's name.&lt;/span&gt;&lt;/em&gt;&lt;br&gt;&lt;span&gt;&lt;strong&gt;Response&lt;/strong&gt;:&amp;nbsp;&lt;/span&gt;&lt;br&gt;&lt;em&gt;&lt;span&gt;I've created a new content type named "Movie" with the following fields:&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;&lt;span&gt;Box Office Gross: A decimal field.&lt;/span&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;span&gt;Movie Poster: An image field.&lt;/span&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;span&gt;YouTube Video Trailer: A link field allowing both internal and external links.&lt;/span&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;span&gt;Year of Release: An integer field.&lt;/span&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;span&gt;Director's Name: A text field.&lt;/span&gt;&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span&gt;The response also contained links to each field's config page as well as the Drupal configuration that was used to create the above.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Holy mackerel!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;The only change I wanted to make was due to my lack of specificity in the prompt - I actually wanted the &lt;/span&gt;&lt;em&gt;&lt;span&gt;YouTube Video Trailer&lt;/span&gt;&lt;/em&gt;&lt;span&gt; field to be of type &lt;/span&gt;&lt;em&gt;&lt;span&gt;Media: Remote video&lt;/span&gt;&lt;/em&gt;&lt;span&gt;. Since the agent isn't allowed to delete things, I manually deleted the existing &lt;/span&gt;&lt;em&gt;&lt;span&gt;YouTube Video Trailer&lt;/span&gt;&lt;/em&gt;&lt;span&gt; field from the &lt;/span&gt;&lt;em&gt;&lt;span&gt;Movie&lt;/span&gt;&lt;/em&gt;&lt;span&gt; content type and went back to the chatbot:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;strong&gt;Prompt&lt;/strong&gt;: &lt;/span&gt;&lt;em&gt;&lt;span&gt;Please add a YouTube Video Trailer field as a Media (remote video) field.&lt;/span&gt;&lt;/em&gt;&lt;br&gt;&lt;span&gt;&lt;strong&gt;Response&lt;/strong&gt;:&lt;/span&gt;&lt;br&gt;&lt;em&gt;&lt;span&gt;I've added a new YouTube Video Trailer field as a Media (remote video) field to the "Movie" content type. You can now add videos to be displayed as media items from remote sources, like YouTube.&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;The response also contained a link to the field's config page as well as the Drupal configuration that was used to create the above.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;A-maze-balls.&lt;/span&gt;&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/drupal-cms-movie-content-type.png" data-entity-uuid="1730acdb-b8da-4cac-97f9-7e042ce4b286" data-entity-type="file" alt="The completed &amp;quot;Movie&amp;quot; content type." width="729" height="658" class="align-center" loading="lazy"&gt;&lt;h2&gt;Image alt text&lt;/h2&gt;&lt;p&gt;Next, I wanted to test the ability to generate alt(ernate) text for uploaded content images. I figured it would be a bit anticlimactic compared to the &lt;em&gt;Drupal Agent Chatbot&lt;/em&gt; example I had just completed, but the fact that this worked out-of-the-box without any manual configuration on my part (other than my OpenAI API key) is really slick.&lt;/p&gt;&lt;p&gt;I simply went to create a new Basic page, navigated directly to the image field, uploaded an image of my dog, and clicked the &lt;em&gt;Generate with AI&lt;/em&gt; button. After a few seconds the results populated the &lt;em&gt;Alternative text&lt;/em&gt; field.&amp;nbsp;&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/stella-bone.png" data-entity-uuid="446f674d-b2ff-4e75-b1d7-75beb5249332" data-entity-type="file" alt="Image upload field showing AI generated alt text." width="644" height="534" class="align-center" loading="lazy"&gt;&lt;h2&gt;Summary&lt;/h2&gt;&lt;p&gt;This initial version of the Drupal CMS AI recipe is super-impressive and really demonstrates the power of not just AI, but also of the Drupal APIs and the amazing work of the &lt;a href="https://drupal.org/project/ai"&gt;AI&lt;/a&gt; contrib module maintainers.&lt;/p&gt;&lt;p&gt;I can't wait to see how this progresses!&lt;/p&gt;&lt;p&gt;&lt;em&gt;While writing this article, I spent a total $0.18USD on OpenAI API calls.&lt;/em&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
  <pubDate>Tue, 10 Dec 2024 05:58:33 -0500</pubDate>
    
    <guid isPermaLink="false">1122 at http://drupaleasy.com</guid>
    <dc:creator>drupaleasy@gmail.com (Michael Anello)</dc:creator></item>
<item>
  <title>Handling Drupal core's oEmbed warning</title>
  <link>https://www.drupaleasy.com/blogs/ultimike/2024/11/handling-drupal-cores-oembed-warning</link>
  <description>
&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/oembed-warning.png" data-entity-uuid="e2990eb0-6cfc-423c-b705-53e16e79684d" data-entity-type="file" alt="Common Media module warning on the Drupal core Status Report page." width="600" height="136" class="align-center" loading="lazy"&gt;&lt;p dir="ltr"&gt;&lt;span&gt;If you manage a modern Drupal site with the Media module enabled, then you're probably not a stranger to the "potentially insecure to display oEmbed content" warning that greets you whenever you visit your site's&amp;nbsp;&lt;/span&gt;&lt;em&gt;Status Report&lt;/em&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;In this article, I'll tell you what this means, and what you can do to update your site to remove this warning.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr"&gt;&lt;strong&gt;What does it mean?&lt;/strong&gt;&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;When you enable the Drupal core Media module, one of the media types that is automatically created is&amp;nbsp;&lt;/span&gt;&lt;em&gt;Remote Video&lt;/em&gt;&lt;span&gt;. This media type allows you to add a link to a YouTube or Vimeo video which then is embedded on your site - super duper!&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;This is accomplished via an HTML&amp;nbsp;iframe - normally something like this:&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class="language-html"&gt;&amp;lt;iframe src="https://drupaleasy.com/media/oembed?url=https%3A//youtu.be/EYiI0QhDqPg&amp;amp;amp;max_width=0&amp;amp;amp;max_height=0&amp;amp;amp;hash=ykZPEBJjHVy-lIEmdlods4FTRZRt3mZuYOzawp_Ti6g" width="200" height="113" class="media-oembed-content" loading="lazy" title="Inline Entity Form basics in under 4 minutes"&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Note that the URL to the video is passed as an argument to the https://drupaleasy.com/media/oembed path - this means that any content loaded in the&amp;nbsp;iframe has access to cookies from the drupaleasy.com domain.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;To keep this from happening (and to further bolster security from XSS and other attacks,) it is &lt;/span&gt;&lt;a href="https://oembed.com/#section3"&gt;&lt;span&gt;recommended&lt;/span&gt;&lt;/a&gt;&lt;span&gt; to set up a different domain (or subdomain) from which to serve the&amp;nbsp;iframe; in other words:&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class="language-html"&gt;&amp;lt;iframe src="https://SOME-OTHER-SUBDOMAIN.drupaleasy.com/media/oembed?url=https%3A//youtu.be/EYiI0QhDqPg&amp;amp;amp;max_width=0&amp;amp;amp;max_height=0&amp;amp;amp;hash=ykZPEBJjHVy-lIEmdlods4FTRZRt3mZuYOzawp_Ti6g" width="200" height="113" class="media-oembed-content" loading="lazy" title="Inline Entity Form basics in under 4 minutes"&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 dir="ltr"&gt;&lt;strong&gt;Step 1 - set up a new subdomain with your host&lt;/strong&gt;&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;I normally begin by setting up a new subdomain with the hosting provider. This new subdomain points to the same place as the main domain. For example, I set up &lt;/span&gt;&lt;em&gt;&lt;span&gt;oembed.drupaleasy.com&lt;/span&gt;&lt;/em&gt;&lt;span&gt; to point to &lt;/span&gt;&lt;em&gt;&lt;span&gt;drupaleasy.com&lt;/span&gt;&lt;/em&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr"&gt;&lt;strong&gt;Step 2 - add the new subdomain to your DNS records&lt;/strong&gt;&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;From wherever your DNS settings are managed (Cloudflare, GoDaddy, etc…,) add the necessary records to your main domain's DNS settings. Normally, your hosting provider will tell you exactly what you need to add to your DNS settings. I use Pantheon hosting and this information is readily available on my live site's "Domains" area.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr"&gt;&lt;strong&gt;Step 3 - modify response headers to allow the new subdomain&lt;/strong&gt;&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;While there's (at least) a couple of ways to do this, the easiest is perhaps with a modification to your site's main settings.php file. For example:&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class="language-php"&gt;// Modify content security policy for oembed.drupaleasy.com
if (isset($_SERVER['HTTP_HOST']) &amp;amp;&amp;amp; $_SERVER['HTTP_HOST'] === 'oembed.drupaleasy.com') {
 &amp;nbsp;&amp;nbsp;&amp;nbsp;header("Content-Security-Policy: frame-ancestors https://www.drupaleasy.com;");
}&lt;/code&gt;&lt;/pre&gt;&lt;p dir="ltr"&gt;&lt;span&gt;This allows embedded content from &lt;/span&gt;&lt;em&gt;&lt;span&gt;oembed.drupaleasy.com&lt;/span&gt;&lt;/em&gt;&lt;span&gt; to be displayed on&amp;nbsp;&lt;/span&gt;&lt;em&gt;&lt;span&gt;www.drupaleasy.com&lt;/span&gt;&lt;/em&gt;&lt;span&gt; pages.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;This type of change can also be made in your site's .htaccess file (assuming your web server uses this file) using the &lt;/span&gt;&lt;a href="https://httpd.apache.org/docs/current/mod/mod_headers.html"&gt;&lt;em&gt;&lt;span&gt;mod_headers&lt;/span&gt;&lt;/em&gt;&lt;span&gt; Apache module&lt;/span&gt;&lt;/a&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr"&gt;&lt;strong&gt;Step 4 - configure Media module to use the new subdomain&lt;/strong&gt;&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;The final, and easiest, step is to let Media module know about your new subdomain via the &lt;/span&gt;&lt;em&gt;&lt;span&gt;Configuration | Media | Media settings&lt;/span&gt;&lt;/em&gt;&lt;span&gt; page (/admin/config/media/media-settings.)&lt;/span&gt;&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/media-settings-oembed.png" data-entity-uuid="9db60463-9bfb-4894-9d1e-1558a6e0bf2a" data-entity-type="file" alt="Media module oEmbed settings page." width="600" height="316" class="align-center" loading="lazy"&gt;&lt;h2 dir="ltr"&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Once complete, the potential security threat will be neutralized and your&amp;nbsp;&lt;/span&gt;&lt;em&gt;Status Report&lt;/em&gt;&lt;span&gt; will have one less warning &#128515;.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;em&gt;&lt;span&gt;Fundamental topics like this are an important part of a modern Drupal site's day-to-day maintenance tasks. In our 12-week, 2x/week &lt;/span&gt;&lt;/em&gt;&lt;a href="https://drupaleasy.com/dco"&gt;&lt;em&gt;&lt;span&gt;Drupal Career Online program&lt;/span&gt;&lt;/em&gt;&lt;/a&gt;&lt;em&gt;&lt;span&gt;, we cover this and many other helpful site maintenance tasks.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;</description>
  <pubDate>Fri, 29 Nov 2024 14:04:18 -0500</pubDate>
    
    <guid isPermaLink="false">1120 at http://drupaleasy.com</guid>
    <dc:creator>drupaleasy@gmail.com (Michael Anello)</dc:creator></item>
<item>
  <title>DrupalEasy Podcast S17E4 - Ted Bowman - Experience Builder</title>
  <link>https://www.drupaleasy.com/podcast/2024/11/drupaleasy-podcast-s17e4-ted-bowman-experience-builder</link>
  <description>
      
  

&lt;p dir="ltr"&gt;&lt;span&gt;We talk with&amp;nbsp;&lt;/span&gt;&lt;a href="https://www.drupal.org/u/tedbow"&gt;&lt;span&gt;Ted Bowman&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&amp;nbsp;from &lt;/span&gt;&lt;a href="https://www.acquia.com/"&gt;&lt;span&gt;Acquia&lt;/span&gt;&lt;/a&gt;&lt;span&gt; about &lt;/span&gt;&lt;a href="https://www.drupal.org/project/experience_builder/"&gt;&lt;span&gt;Experience Builder&lt;/span&gt;&lt;/a&gt;&lt;span&gt;, one of the main features of the upcoming &lt;/span&gt;&lt;a href="https://www.drupal.org/about/starshot"&gt;&lt;span&gt;Drupal CMS&lt;/span&gt;&lt;/a&gt;&lt;span&gt;.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;span&gt;URLs mentioned&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p dir="ltr"&gt;&lt;a href="https://wimleers.com/tags/experience-builder"&gt;&lt;span&gt;Wim's blog posts&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;&lt;span&gt;DrupalEasy News&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p dir="ltr"&gt;&lt;a href="https://drupaleasy.com/pmd"&gt;&lt;span&gt;Professional module development&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - 15 weeks, 90 hours, live, online course.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p dir="ltr"&gt;&lt;a href="https://drupaleasy.com/dco"&gt;&lt;span&gt;Drupal Career Online&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - 12 weeks, 77 hours, live online, beginner-focused course.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p dir="ltr"&gt;&lt;a href="https://www.drupaleasy.com/podcast/transcript/1093"&gt;&lt;span&gt;Audio transcript&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;em&gt;&lt;span&gt;We're using the machine-driven Amazon Transcribe service to provide an audio transcript of this episode.&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;h2&gt;&lt;span&gt;Subscribe&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Subscribe to our podcast on &lt;/span&gt;&lt;a href="https://itunes.apple.com/us/podcast/drupaleasy-podcast/id305745575"&gt;&lt;span&gt;iTunes&lt;/span&gt;&lt;/a&gt;&lt;span&gt;, &lt;/span&gt;&lt;a href="https://www.iheart.com/podcast/256-drupaleasy-podcast-30968424/"&gt;&lt;span&gt;iHeart&lt;/span&gt;&lt;/a&gt;&lt;span&gt;, &lt;/span&gt;&lt;a href="https://music.amazon.com/podcasts/3d8b0d3f-a74f-4651-bd79-7f0163a55484/drupaleasy-podcast"&gt;&lt;span&gt;Amazon&lt;/span&gt;&lt;/a&gt;&lt;span&gt;, &lt;/span&gt;&lt;a href="https://www.youtube.com/@Drupaleasy/podcasts"&gt;&lt;span&gt;YouTube&lt;/span&gt;&lt;/a&gt;&lt;span&gt;, or &lt;/span&gt;&lt;a href="https://open.spotify.com/show/4TbuXTShKJ1CPivFzYQfP8"&gt;&lt;span&gt;Spotify&lt;/span&gt;&lt;/a&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;If you'd like to leave us a voicemail, call 321-396-2340. Please keep in mind that we might play your voicemail during one of our future podcasts. Feel free to call in with suggestions, rants, questions, or corrections. If you'd rather just send us an email, please use our &lt;/span&gt;&lt;a href="https://DrupalEasy.com/contact"&gt;&lt;span&gt;contact page&lt;/span&gt;&lt;/a&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;span&gt;Credits&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;span&gt;Podcast edited by &lt;/span&gt;&lt;a href="https://www.ameliaanello.info/"&gt;&lt;span&gt;Amelia Anello&lt;/span&gt;&lt;/a&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;</description>
  <pubDate>Thu, 21 Nov 2024 08:15:33 -0500</pubDate>
    
    <guid isPermaLink="false">1093 at http://drupaleasy.com</guid>
    <dc:creator>drupaleasy@gmail.com (Michael Anello)</dc:creator></item>
<item>
  <title>Why Drupal module developers should be excited about object-oriented hooks</title>
  <link>https://www.drupaleasy.com/blogs/ultimike/2024/10/why-drupal-module-developers-should-be-excited-about-object-oriented-hooks</link>
  <description>
&lt;p&gt;It's not super-often that a &lt;a href="https://www.drupal.org/list-changes/drupal"&gt;Drupal core change record&lt;/a&gt; stops me in my tracks, but recently, one did exactly that.&lt;/p&gt;&lt;p&gt;With so much of Drupal core written using modern, object-oriented PHP, there was still one place where we needed to use plain-old PHP functions: hook implementations. Drupal hooks have been with us since before I started with Drupal (over 18 years ago,) and I had long hoped that with the advent of "modern" Drupal (Drupal 8+,) eventually hooks would be converted over to &lt;a href="https://symfony.com/doc/current/event_dispatcher.html"&gt;Symfony events&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Much to my surprise, a recent change record for Drupal 11.x-dev (to be included in Drupal 11.1) has virtually all hooks (there are some exceptions) now being available as "object oriented hook implementations." &#128512;&lt;/p&gt;&lt;p&gt;The change record that put that smile on my face:&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;a href="https://www.drupal.org/node/3442349"&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/oo-hooks-change-record_0.png" data-entity-uuid="c99007cc-e7c3-4fbf-84c8-90e1f2788734" data-entity-type="file" alt="Screenshot of change record that introduces OO hooks to Drupal core 11.1" width="566" height="489" loading="lazy"&gt;&lt;/a&gt;&lt;p dir="ltr"&gt;&lt;a href="https://www.drupal.org/node/3442349"&gt;&lt;strong&gt;Support for object oriented hook implementations using autowired services&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;The short version&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Classes can now be written that include methods that can act as hook implementation via a &lt;/span&gt;&lt;a href="https://www.php.net/manual/en/language.attributes.syntax.php"&gt;&lt;span&gt;PHP attribute&lt;/span&gt;&lt;/a&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Click on the change record link above for a code sample.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Just as cool - there's backward compatibility built-in so that you can start writing OO hooks&amp;nbsp;&lt;/span&gt;&lt;em&gt;today&lt;/em&gt;&lt;span&gt;.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;The longer version&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Go read the entire change record. &#128077;&#127996;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;Why is this such a good thing?&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;First, less plain-old PHP functions + more classes = more modern PHP.&lt;/li&gt;&lt;li&gt;Secondly, these hook classes are services, which makes them more performant than plain-old PHP functions.&lt;/li&gt;&lt;li&gt;Thirdly, you can organize related hooks in their own classes.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Where can I see this in action?&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Together with students from our current &lt;/span&gt;&lt;a href="https://www.drupaleasy.com/academy/pmd/course-information"&gt;&lt;span&gt;Professional Module Development&lt;/span&gt;&lt;/a&gt;&lt;span&gt; class, we put together a quick module that:&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li dir="ltr"&gt;Implements&amp;nbsp;&lt;em&gt;hook_user_login()&lt;/em&gt; using this new technique to display a welcome message to the user.&amp;nbsp;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Includes the backwards compatibility stuff so that it works in Drupal 10.3+&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Is written with both Drupal coding standards and &lt;/span&gt;&lt;a href="https://phpstan.org"&gt;&lt;span&gt;PHPStan&lt;/span&gt;&lt;/a&gt;&lt;span&gt; level 6 compliance.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span&gt;Feel free to download or clone the &lt;/span&gt;&lt;a href="https://github.com/ultimike/no_more_hooks"&gt;&lt;em&gt;&lt;span&gt;no_more_hooks&lt;/span&gt;&lt;/em&gt;&lt;span&gt; module from GitHub&lt;/span&gt;&lt;/a&gt;&lt;span&gt; and check it out on your Drupal 10.3 or 11 site!&lt;/span&gt;&lt;/p&gt;</description>
  <pubDate>Tue, 29 Oct 2024 12:14:54 -0400</pubDate>
    
    <guid isPermaLink="false">1091 at http://drupaleasy.com</guid>
    <dc:creator>drupaleasy@gmail.com (Michael Anello)</dc:creator></item>
<item>
  <title>Navigation core module, Admin Toolbar contrib module, Gin contrib admin theme - I just want to rebuild caches!</title>
  <link>https://www.drupaleasy.com/quicktips/navigation-core-module-admin-toolbar-contrib-module-gin-contrib-admin-theme-i-just-want</link>
  <description>
&lt;p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/navigation-extra-tools.png" data-entity-uuid="ccd2c13c-19f8-444f-bfc5-561de3fcd679" data-entity-type="file" alt="Navigation extra tools in action screenshot." width="300" height="383" class="align-right" loading="lazy"&gt;With the new Drupal core Navigation module introduced in 10.3.0, the long-standing Admin toolbar contrib module may finally have some competition.&amp;nbsp;&lt;/p&gt;&lt;p&gt;The &lt;em&gt;Admin toolbar&lt;/em&gt; module includes the &lt;em&gt;Admin toolbar tools&lt;/em&gt; module that provides easy access to commonly-used functionality, including &lt;em&gt;Flush all caches&lt;/em&gt;. The new core &lt;em&gt;Navigation&lt;/em&gt; module does not provide the option for these, and the other options provided by &lt;em&gt;Admin toolbar tools&lt;/em&gt;.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Both &lt;em&gt;Navigation&lt;/em&gt; and &lt;em&gt;Admin toolbar&lt;/em&gt; provide dynamic, fly-out menus for easy access to various levels of admin configuration pages. Similarly, the &lt;a href="https://www.drupal.org/project/gin"&gt;&lt;em&gt;Gin&lt;/em&gt; contrib admin theme&lt;/a&gt; also includes functionality for a fly-out admin menu.&amp;nbsp;&lt;/p&gt;&lt;p&gt;With several options available, together with some of the DrupalEasy alumni during DrupalEasy Learning Community office hours, I created the following quick summary of the various ways to get both a fly-out admin menu as well as the extra items like &lt;em&gt;Flush all caches.&lt;/em&gt; This guide is appropriate for both Drupal 10.3+ and 11 sites.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Horizontal admin menu options&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;em&gt;Admin toolbar&lt;/em&gt; module + &lt;em&gt;Admin toolbar extra tools&lt;/em&gt; module&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Vertical admin menu options&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;em&gt;Navigation&lt;/em&gt; core module + &lt;a href="https://www.drupal.org/project/navigation_extra_tools"&gt;&lt;em&gt;Navigation extra tools&lt;/em&gt; contrib module&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;em&gt;Admin toolbar&lt;/em&gt; + &lt;em&gt;Admin toolbar extra tools&lt;/em&gt; + &lt;em&gt;Gin&lt;/em&gt; admin theme&lt;/li&gt;&lt;li&gt;&lt;em&gt;Gin&lt;/em&gt; admin theme + &lt;em&gt;Navigation&lt;/em&gt; core module + &lt;a href="https://www.drupal.org/project/navigation_extra_tools"&gt;&lt;em&gt;Navigation extra tools&lt;/em&gt; contrib module&lt;/a&gt;&amp;nbsp;&lt;ol&gt;&lt;li&gt;Note that &lt;em&gt;Gin&lt;/em&gt; disables its own navigation options when the Drupal core &lt;em&gt;Navigation&lt;/em&gt; module is enabled.&lt;/li&gt;&lt;li&gt;Note that the &lt;em&gt;Gin Toolbar&lt;/em&gt; module has no effect when the Drupal core &lt;em&gt;Navigation&lt;/em&gt; module is enabled.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;A couple of extra notes:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;The Drupal core &lt;em&gt;Navigation Top Bar&lt;/em&gt; module crashes the latest Drupal core 11.x-dev (as of October, 2024) when attempting to enable it.&lt;/li&gt;&lt;li&gt;The &lt;em&gt;Gin&lt;/em&gt; admin theme’s &lt;em&gt;Show Secondary Toolbar in Frontend&lt;/em&gt; option adds a horizontal top bar to the site with a “Rebuild cache” link unless the Drupal core &lt;em&gt;Navigation&lt;/em&gt; module is enabled in which case it has no effect.&lt;/li&gt;&lt;li&gt;The &lt;a href="https://www.drupal.org/project/navigation_extra_tools"&gt;&lt;em&gt;Navigation extra tools&lt;/em&gt; contrib module&lt;/a&gt; is authored by a DrupalEasy alum, &lt;a href="https://www.drupal.org/u/lostcarpark"&gt;James Shields&lt;/a&gt;!&lt;/li&gt;&lt;/ol&gt;</description>
  <pubDate>Fri, 25 Oct 2024 15:13:13 -0400</pubDate>
    
    <guid isPermaLink="false">1090 at http://drupaleasy.com</guid>
    <dc:creator>drupaleasy@gmail.com (Michael Anello)</dc:creator></item>
<item>
  <title>Who will move Drupal forward? </title>
  <link>https://www.drupaleasy.com/blogs/gwendolyn/2024/10/who-will-move-drupal-forward</link>
  <description>
&lt;p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/drupal%20pipeline%20final.png" data-entity-uuid="7652414f-d857-4514-9d52-d79a5d59c977" data-entity-type="file" alt="drupal pipeline" width="183" height="183" class="align-right" loading="lazy"&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;With &lt;/span&gt;&lt;a href="https://www.drupal.org/about/starshot"&gt;&lt;span&gt;Drupal Starshot&lt;/span&gt;&lt;/a&gt;&lt;span&gt; on the horizon, the possibilities of expanding the market share for Drupal through Drupal CMS and building further on the power of Drupal Core creates a new vision, new opportunities and hopefully a renewed path of growth for our beloved community. So, while we all look to fully understand the Starshot initiative and its implications for our businesses and the way we market Drupal, it seems like a good time to also reflect, and perhaps begin to really address, the dwindling Drupal talent pool as well as lack of available Drupal jobs. We need to take a hard look at how we can attract those who will help to multiply and diversify our legions across the globe to support the project into the future.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;The lack of Drupal talent and non-existent formal workforce pipeline for now and the future is a topic that, even having been constantly, at least casually discussed for years, has had no real community-wide solutions implemented to overcome it. Perhaps this is largely because resources (bandwidth &amp;amp; funds) tend to flow to areas that have immediate priority, have clear goals and can show immediate results. Experienced talent deficits are not easily, clearly, nor quickly fixed.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Additional challenges are that Drupal, at least what will be known as Drupal Core, has a relatively lengthy learning curve, and most companies tend to&amp;nbsp;&lt;/span&gt;&lt;strong&gt;exclusively&lt;/strong&gt;&lt;span&gt; hire experienced developers. Since time is a required component of creating experience there is no speedy way to improve the flow rate of the Drupal talent that comes into the community. It doesn’t help that those new to Drupal struggle to find sustainable work and compensation to propel their journey through the novice years.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;We must look at the supply of talent in the same way we look at our potential markets.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Consider that as people who are just starting out, changing or shifting their careers look to options, those with the foundations to take on web developer careers have a pretty good outlook. The US Department of Labor, Bureau of Labor Statistics (BLS) anticipates that, in the US alone,&amp;nbsp;&lt;/span&gt;&lt;a href="https://www.bls.gov/ooh/computer-and-information-technology/web-developers.htm"&gt;&lt;span&gt;web developer careers&lt;/span&gt;&lt;/a&gt;&lt;span&gt; will grow 8% (faster than average for most careers) from 2023 to 2033; with an estimated 16,500 new jobs every year. BLS explains,&lt;/span&gt;&lt;em&gt; “Many of those openings are expected to result from the need to replace workers who transfer to different occupations or exit the labor force, such as to retire.”&amp;nbsp;&amp;nbsp;&lt;/em&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Good news for attracting job seekers who would like to be web developers, but it also demonstrates that there is competition among the various web development platforms to attract them. This is not so great news for Drupal, with a conspicuously aging talent pool; an awareness problem among the general, (even tech-savvy) career-seeking populations and really no overall effort in place to mitigate either issue. It would be comforting to think that the workforce issue is with web development in general; but data reflects otherwise. This is a Drupal problem.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;According to&amp;nbsp;&lt;/span&gt;&lt;a href="https://www.ironstar.io/devsurvey24/"&gt;&lt;span&gt;The 2024 Drupal Developer Survey&lt;/span&gt;&lt;/a&gt;&lt;span&gt;, (Of which ~700 people responded) 36% of respondents have less than 10 years of experience. Compare that to the&amp;nbsp;&lt;/span&gt;&lt;a href="https://survey.stackoverflow.co/2023/#developer-profile-experience"&gt;&lt;span&gt;Wordpress Developer survey&lt;/span&gt;&lt;/a&gt;&lt;span&gt; (which touts 90,000 respondents) that indicates about 48% have less than 10 years in. And, although age is not a true representation of experience, it can’t be ignored especially when thinking long-term and realizing that (audible gasp)&amp;nbsp;&lt;/span&gt;&lt;strong&gt;less than 10% of Drupal respondents are under the age of 30.&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;The Wordpress survey tiered the age question differently, but ~25 % of the Wordpress respondents are under 25 (more than double the Drupal &amp;lt;30 respondents and 5 years less (&amp;amp; lower) in the tier!) while (second audible gasp)&amp;nbsp;&lt;/span&gt;&lt;strong&gt;65% are under 35 years old.&amp;nbsp;&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/Drupal%20experience%20chart.png" data-entity-uuid="68721383-0294-490f-b522-e9684cf0dcd9" data-entity-type="file" alt="drupal experience chart" width="589" height="360" class="align-center" loading="lazy"&gt;&lt;p dir="ltr"&gt;&lt;span&gt;It is clear that a concerted, well-supported movement to help create a scalable workforce pipeline to nourish the future of Drupal CMS &amp;amp; Drupal Core would be a smart action item to run in tandem with the development and introduction of the Starshot initiative. It’s true that there has not historically been ongoing, consistent, widespread efforts to do this; but new tracks for growth and added market share need to be supported, so we at least have to solve our current lack of a workforce pipeline to keep the project moving.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Of course, it’s not usually easy to get broad participation for efforts with mostly long-term results, even with widespread sentiment recognizing the need. But honestly, we have to at least do better for the new talent we have.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Consider a snapshot of the last 9 months (1 day of jobs statistics/month) of Drupal jobs posted on jobs.Drupal.org.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/drupal%20jobs%20tracking%202.png" data-entity-uuid="724a1588-4fe7-46e3-94ff-d0a8691d3cd5" data-entity-type="file" alt="jobs tracking chart" width="589" height="358" class="align-center" loading="lazy"&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Since January, the highest number of entry level positions open per month is two, and this is with two months of none being posted at all. This is a problem, perhaps&lt;/span&gt;&lt;strong&gt; The&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;problem&lt;/strong&gt;&lt;span&gt; because the beginners are already struggling the most just learning Drupal.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;strong&gt;Those who are not employed and seeking to learn, need to support themselves while they do so; and without any jobs to provide experience, they may never gain the experience needed to even be considered for the majority of positions that are open.&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Without the opportunity or support to gain experience, people often seek other careers. Perhaps the shorter learning curve promised by Starshot through Drupal CMS will help, but we still need to address the lack of new and young talent coming into, and staying with the community.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;With some time and resources from at least a few like-minded organizations, and eventually a meaningful shift in hiring practices from forward-thinking organizations; there is a way forward. Consider the &lt;/span&gt;&lt;a href="https://www.drupal.org/project/ixp"&gt;&lt;span&gt;IXP-Fellowship&lt;/span&gt;&lt;/a&gt;&lt;span&gt;, a community initiative for onboarding inexperienced developers that&amp;nbsp;hopes to create incentives for companies to guide new developers through the&amp;nbsp;&lt;/span&gt;&lt;strong&gt;very beginning&lt;/strong&gt;&lt;span&gt; of their career in Drupal.&amp;nbsp; There are also strategies that, taking into account individual organizations’ time and funding constraints, can leverage outside resource streams that can be combined with these types of community efforts. The key is recognizing the issue, and working on efforts that can help to build a Drupal workforce pipeline. These are a great start because, somehow, companies need to start showing some love to beginners in hiring.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Successful efforts would include outreach, training, and most importantly, &lt;strong&gt;placement opportunities in entry-level positions&lt;/strong&gt; that will support, and in turn retain, novice developers through the various stages (years) of gaining experience and skill. This last bit may be the hardest to make happen, but it is key to success.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;We’ve begun an effort to start collecting Drupal jobs data so that we can track, on a quarterly basis, the status of entry level and more advanced positions that are open.&amp;nbsp; We’ll start sharing our Drupal Jobs report at the end of every quarter in an effort to keep the issue top of mind.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;If you’ve been inspired or at least have become a bit interested in how you might contribute to sustaining and building Drupal talent for the future, check out:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://www.drupal.org/project/ixp"&gt;&lt;span&gt;Drupal Association IXP Fellowship program&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://www.drupaleasy.com/academy/dco/scholarships/sponsor"&gt;&lt;span&gt;Scholarship sponsor page&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://www.drupaleasy.com/academy/we-drupal-hosts"&gt;&lt;span&gt;Internship/Apprenticeship Host page&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://www.drupaleasy.com/academy/dco/mentor-application"&gt;&lt;span&gt;Mentor application page&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;a href="https://www.drupal.org/association/discover-drupal"&gt;&lt;span&gt;Discover Drupal information page&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Feel free to also send me your ideas and thoughts: gwendolyn@anelloconsulting.com&lt;/p&gt;</description>
  <pubDate>Fri, 18 Oct 2024 12:13:15 -0400</pubDate>
    
    <guid isPermaLink="false">1089 at http://drupaleasy.com</guid>
    <dc:creator>drupaleasy@gmail.com (Michael Anello)</dc:creator></item>
<item>
  <title>DrupalEasy Podcast S17E3 - Ryan Price - Modernizing a Legacy Integration</title>
  <link>https://www.drupaleasy.com/podcast/2024/09/drupaleasy-podcast-s17e3-ryan-price-modernizing-legacy-integration</link>
  <description>
      
  

&lt;p dir="ltr"&gt;&lt;span&gt;We talk with&amp;nbsp;&lt;/span&gt;&lt;a href="https://www.drupal.org/u/liberatr"&gt;&lt;span&gt;Ryan Price&lt;/span&gt;&lt;/a&gt;&lt;span&gt; from &lt;/span&gt;&lt;a href="https://icf.com"&gt;&lt;span&gt;ICF&lt;/span&gt;&lt;/a&gt;&lt;span&gt; about a recent project he worked on involving updating a legacy Drupal 7 install with modern Drupal 10 techniques.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;span&gt;URLs mentioned&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p dir="ltr"&gt;&lt;a href="https://www.iesabroad.org/"&gt;IES Abroad&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p dir="ltr"&gt;&lt;a href="https://www.studyabroadfoundation.org/"&gt;&lt;span&gt;Study Abroad Foundation&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p dir="ltr"&gt;&lt;a href="https://pnwdrupalsummit.org/"&gt;&lt;span&gt;Pacific Northwest Drupal Summit&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - October 11-13, 2024.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;&lt;span&gt;DrupalEasy News&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p dir="ltr"&gt;&lt;a href="https://drupaleasy.com/pmd"&gt;&lt;span&gt;Professional module development&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - 15 weeks, 90 hours, live, online course.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p dir="ltr"&gt;&lt;a href="https://drupaleasy.com/dco"&gt;&lt;span&gt;Drupal Career Online&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - 12 weeks, 77 hours, live online, beginner-focused course.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p dir="ltr"&gt;&lt;a href="https://www.drupaleasy.com/podcast/transcript/1086"&gt;&lt;span&gt;Audio transcript&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;em&gt;&lt;span&gt;We're using the machine-driven Amazon Transcribe service to provide an audio transcript of this episode.&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;h2&gt;&lt;span&gt;Subscribe&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Subscribe to our podcast on &lt;/span&gt;&lt;a href="https://itunes.apple.com/us/podcast/drupaleasy-podcast/id305745575"&gt;&lt;span&gt;iTunes&lt;/span&gt;&lt;/a&gt;&lt;span&gt;, &lt;/span&gt;&lt;a href="https://www.iheart.com/podcast/256-drupaleasy-podcast-30968424/"&gt;&lt;span&gt;iHeart&lt;/span&gt;&lt;/a&gt;&lt;span&gt;, &lt;/span&gt;&lt;a href="https://music.amazon.com/podcasts/3d8b0d3f-a74f-4651-bd79-7f0163a55484/drupaleasy-podcast"&gt;&lt;span&gt;Amazon&lt;/span&gt;&lt;/a&gt;&lt;span&gt;, &lt;/span&gt;&lt;a href="https://www.youtube.com/@Drupaleasy/podcasts"&gt;&lt;span&gt;YouTube&lt;/span&gt;&lt;/a&gt;&lt;span&gt;, or &lt;/span&gt;&lt;a href="https://open.spotify.com/show/4TbuXTShKJ1CPivFzYQfP8"&gt;&lt;span&gt;Spotify&lt;/span&gt;&lt;/a&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;If you'd like to leave us a voicemail, call 321-396-2340. Please keep in mind that we might play your voicemail during one of our future podcasts. Feel free to call in with suggestions, rants, questions, or corrections. If you'd rather just send us an email, please use our &lt;/span&gt;&lt;a href="https://DrupalEasy.com/contact"&gt;&lt;span&gt;contact page&lt;/span&gt;&lt;/a&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;span&gt;Credits&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;span&gt;Podcast edited by &lt;/span&gt;&lt;a href="https://www.ameliaanello.info/"&gt;&lt;span&gt;Amelia Anello&lt;/span&gt;&lt;/a&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;</description>
  <pubDate>Sat, 21 Sep 2024 06:14:25 -0400</pubDate>
    
    <guid isPermaLink="false">1086 at http://drupaleasy.com</guid>
    <dc:creator>drupaleasy@gmail.com (Michael Anello)</dc:creator></item>
<item>
  <title>How to step down successfully as a Drupal leader</title>
  <link>https://www.drupaleasy.com/blogs/ultimike/2024/09/how-step-down-successfully-drupal-leader</link>
  <description>
&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/passing-drupal-torch.jpeg" data-entity-uuid="dcffe548-f8d6-4806-830a-ad91b54e3f50" data-entity-type="file" alt="One stick figure passing a torch with a flame in the shape of the Drupal logo to another stick figure." width="600" height="361" class="align-center" loading="lazy"&gt;&lt;p&gt;In my 15+ years in the Drupal community, I've been fortunate to have been able to lead a few Drupal-related groups and I sometimes find myself in the position of encouraging other leaders - who are experiencing burnout - on how to gracefully step down from leadership positions after multiple years of service.&lt;/p&gt;&lt;p&gt;When I say "groups," I'm talking about things like:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Drupal event organizers&lt;/li&gt;&lt;li&gt;Drupal module/theme/project maintainers&lt;/li&gt;&lt;li&gt;Drupal initiative leaders&lt;/li&gt;&lt;li&gt;Drupal working group leaders&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;It seems counter-intuitive to encourage folks to step away from things they have successfully led, but I'm very fond of the concept that the true sign of a healthy organization is a successful change in leadership to make way for new perspectives, insights and ultimately fresh ideas.&lt;/p&gt;&lt;p&gt;In this article, I'll share some of my thoughts on my experiences in doing this exact thing with two prominent Drupal groups: the &lt;a href="https://www.fldrupal.camp/"&gt;Florida DrupalCamp&lt;/a&gt; organizing team and the &lt;a href="https://www.drupal.org/community/cwg"&gt;Drupal Community Working Group&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Being a leader in the Drupal community comes with responsibilities, but it also comes with prestige. Leaders tend to be more visible and therefore able to promote themselves or their organizations to their advantage.&amp;nbsp;&lt;/p&gt;&lt;h2&gt;Background&lt;/h2&gt;&lt;p&gt;My leadership positions were gratifying, and I was still committed to them, but from my perspective, I had remained in them longer than was good for the organization or for me. But, I had an incredibly strong drive to ensure that I left the group in better shape than when I joined.&lt;/p&gt;&lt;p&gt;I was one of the original organizers of Florida DrupalCamp and ended up being the leader of the team by attrition. The other original organizers became less involved as the years went on, and I ended up taking on more-and-more duties. There wasn't a breaking point, but I realized that things weren't heading in the right direction.&lt;/p&gt;&lt;p&gt;For the Drupal Community Working Group, I was added to an incredibly strong team dealing with really difficult issues, but without a structured plan for length of terms or any other way to protect the mental health of its members.&lt;/p&gt;&lt;p&gt;In both cases, I was incredibly proud of the work we were doing, but didn't see a clear path to roll over leave either team in a healthy manner.&amp;nbsp;&lt;/p&gt;&lt;h2&gt;The good news&lt;/h2&gt;&lt;p&gt;From my perspective, there are two things people need to do in order to successfully step down from leadership positions:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Train your replacement(s).&lt;/li&gt;&lt;li&gt;Codify roles and responsibilities.&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;The bad news&lt;/h2&gt;&lt;p&gt;Neither of these two steps can be done overnight.&lt;/p&gt;&lt;h2&gt;The details&lt;/h2&gt;&lt;h3&gt;Train your replacement(s)&lt;/h3&gt;&lt;p&gt;You (yes, you) need to make a concerted effort to identify, approach, and ask someone (or in many cases, "someones") to fill your role when you leave. Once you find these magical people, then it is (again) up to you to train them in what you do. It is important that you communicate not only the work involved in being a leader, but also the advantages that come with the role.&lt;/p&gt;&lt;p&gt;For Florida DrupalCamp, I made it known well in advance that I was looking to step down as its leader (but willing to stay on in a lesser capacity). I knew it would be good for the event and community if there was new leadership. I told the other organizers as well as mentioning it during the event's opening and closing sessions. Most importantly, I did it early and spoke about it often. This directly led to several people stepping up.&lt;/p&gt;&lt;p&gt;This will likely be a time-consuming process, but it will make the team stronger. It will force you to document and organize what you do, and just the act of explaining it to someone else will allow you and your replacement to identify things that need to be documented as well as possible opportunities for efficiency gains.&lt;/p&gt;&lt;p&gt;Assume that you'll need to be training your replacement for at least a few months, but the timeframe really depends on the cadence of your team's primary tasks.&amp;nbsp;&lt;/p&gt;&lt;h3&gt;Codify roles and responsibilities&lt;/h3&gt;&lt;p&gt;This was especially important for the Drupal Community Working Group, as prior to my joining the group, there weren't any guidelines for length of term, how the leader was selected, and how to step away gracefully. Under the leadership of &lt;a href="https://www.drupal.org/u/gdemet"&gt;George DeMet&lt;/a&gt;, our team implemented all of these, and more. Both George and I led the team for more years than was probably healthy for either of us, but by the time I stepped away, there were clear guidelines for all of these things (with a significant focus on the mentally draining &lt;a href="https://www.drupal.org/community/cwg/conflict-resolution"&gt;Conflict Resolution Team&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;For less formal teams, this could be as simple as a wiki page or an issue in the project's queue with what you and the other leaders do, what your boundaries are, and what your plans for the future are. This can be especially effective when someone makes a request of you that you feel is above-and-beyond - it is nice to have a document that you could point to where roles and responsibilities are detailed.&lt;/p&gt;&lt;p&gt;I'll admit that I skipped this step when stepping down as leader of the Florida DrupalCamp organizing team, as I wasn't leaving the team completely - I just stepped down into a lesser role but was always available to the new leaders for questions and advice.&amp;nbsp;&lt;/p&gt;&lt;h2&gt;Getting started&lt;/h2&gt;&lt;p&gt;There are many Drupal groups that have informal leadership roles, with many leaders who definitely feel that if they leave, then the group will fall. Clearly, this is not a healthy situation.&lt;/p&gt;&lt;p&gt;In this case, my advice is this: start by writing up a document/drupal.org page that describes what you do as leader and share it with the rest of the group. Then, be proactive and find a potential replacement and start the training process using the document as a guide.&amp;nbsp;&lt;/p&gt;&lt;h2&gt;No replacement&lt;/h2&gt;&lt;p&gt;It should be obvious that the "finding your replacement" step requires a human being other than yourself being involved. But what happens if you can't find someone…&lt;/p&gt;&lt;p&gt;This situation can be stressful and heartbreaking at the same time, but I have a strong opinion on this - if you find yourself in this situation, then maybe it is time for the team to be disbanded or go dormant. If there's not enough interest in the community to keep the group alive, it's not your responsibility to sacrifice your time/money/mental-health. My advice is to write up your thoughts, announce your intentions (and time frame) and post it to all members of the group. This can be done in a way that sets up a future leader to use the codified roles and responsibilities as a framework to get things moving again. In a way, you're still training your replacement - just not in realtime.&lt;/p&gt;&lt;p&gt;Will there be people who are disappointed and/or angry with you for "abandoning" the group? Perhaps, but you'll need to do your best to ignore those folks and focus on setting up the next leader for success.&lt;/p&gt;&lt;p&gt;I would suggest that you keep things simple and focus on the main goal of always leaving the group in a positive manner, setting up future leaders for success.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Thanks to &lt;/em&gt;&lt;a href="https://www.drupal.org/u/volkswagenchick"&gt;&lt;em&gt;AmyJune Hineline&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, &lt;/em&gt;&lt;a href="https://www.drupal.org/u/hot_sauce"&gt;&lt;em&gt;Adam Varn&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, &lt;/em&gt;&lt;a href="http://imwithherchel.com/"&gt;&lt;em&gt;Mike Herchel&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, &lt;/em&gt;&lt;a href="https://www.drupal.org/u/gdemet"&gt;&lt;em&gt;George DeMet&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, and &lt;/em&gt;&lt;a href="https://www.drupal.org/u/gwendolyn"&gt;&lt;em&gt;Gwendolyn Anello&lt;/em&gt;&lt;/a&gt;&lt;em&gt; (who reviews pretty much everything I write) for reviewing this post prior to publication.&lt;/em&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
  <pubDate>Thu, 05 Sep 2024 15:33:06 -0400</pubDate>
    
    <guid isPermaLink="false">1085 at http://drupaleasy.com</guid>
    <dc:creator>drupaleasy@gmail.com (Michael Anello)</dc:creator></item>
<item>
  <title>DrupalEasy Podcast S17E2 - Janez Urevc - Gander</title>
  <link>https://www.drupaleasy.com/podcast/2024/08/drupaleasy-podcast-s17e2-janez-urevc-gander</link>
  <description>
      
  

&lt;p&gt;We talk with &lt;a href="https://www.drupal.org/u/slashrsm"&gt;Janez Urevc&lt;/a&gt; from &lt;a href="https://www.tag1consulting.com/"&gt;Tag1 Consulting&lt;/a&gt; about &lt;a href="https://www.tag1consulting.com/gander"&gt;Gander&lt;/a&gt;, an open-source automated performance testing framework.&lt;/p&gt;&lt;h2&gt;URLs mentioned&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://www.tag1consulting.com/gander"&gt;Gander&lt;/a&gt; (includes many helpful links!)&lt;/li&gt;&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=4pEBNLe3W_k"&gt;40-minute video presentation introducing Gander&lt;/a&gt; (including a demo)&lt;/li&gt;&lt;li&gt;&lt;a href="https://www.drupal.org/docs/develop/automated-testing/performance-tests"&gt;Drupal.org docs page&lt;/a&gt; for performance testing with Gander&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="https://gander.tag1.io"&gt;https://gander.tag1.io&lt;/a&gt; - dashboard that Tag1 hosts for the Drupal community&lt;/li&gt;&lt;li&gt;&lt;a href="https://events.drupal.org/barcelona2024/session/gander-practice-start-monitoring-your-sites-performance-today"&gt;Two-hour Gander workshop at DrupalCon Barcelona on September 24, 2024&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;DrupalEasy News&lt;/h2&gt;&lt;p&gt;&lt;a href="https://drupaleasy.com/pmd"&gt;Professional module development&lt;/a&gt; - 15 weeks, 90 hours, live, online course. &amp;nbsp;&lt;br&gt;&lt;a href="https://drupaleasy.com/dco"&gt;Drupal Career Online&lt;/a&gt; - 12 weeks, 77 hours, live online, beginner-focused course.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.drupaleasy.com/podcast/transcript/1084"&gt;Audio transcript&lt;/a&gt;&lt;/p&gt;&lt;p&gt;We're using the machine-driven Amazon Transcribe service to provide an audio transcript of this episode.&lt;/p&gt;&lt;h2&gt;Subscribe&lt;/h2&gt;&lt;p&gt;Subscribe to our podcast on &lt;a href="https://itunes.apple.com/us/podcast/drupaleasy-podcast/id305745575"&gt;iTunes&lt;/a&gt;, &lt;a href="https://www.iheart.com/podcast/256-drupaleasy-podcast-30968424/"&gt;iHeart&lt;/a&gt;, &lt;a href="https://music.amazon.com/podcasts/3d8b0d3f-a74f-4651-bd79-7f0163a55484/drupaleasy-podcast"&gt;Amazon&lt;/a&gt;, &lt;a href="https://www.youtube.com/@Drupaleasy/podcasts"&gt;YouTube&lt;/a&gt;, or &lt;a href="https://open.spotify.com/show/4TbuXTShKJ1CPivFzYQfP8"&gt;Spotify&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;If you'd like to leave us a voicemail, call 321-396-2340. Please keep in mind that we might play your voicemail during one of our future podcasts. Feel free to call in with suggestions, rants, questions, or corrections. If you'd rather just send us an email, please use &lt;a href="https://DrupalEasy.com/contact"&gt;our contact page&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Credits&lt;/h2&gt;&lt;p&gt;Podcast &lt;a href="https://www.ameliaanello.info"&gt;edited by Amelia Anello&lt;/a&gt;.&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
  <pubDate>Wed, 21 Aug 2024 15:16:00 -0400</pubDate>
    
    <guid isPermaLink="false">1084 at http://drupaleasy.com</guid>
    <dc:creator>drupaleasy@gmail.com (Michael Anello)</dc:creator></item>
<item>
  <title>Using ECA to pre-populate a form field from a query string variable</title>
  <link>https://www.drupaleasy.com/blogs/ultimike/2024/08/using-eca-pre-populate-form-field-query-string-variable</link>
  <description>
&lt;p dir="ltr"&gt;&lt;span&gt;There's no doubt that the &lt;/span&gt;&lt;a href="https://www.drupal.org/project/eca"&gt;&lt;span&gt;ECA module&lt;/span&gt;&lt;/a&gt;&lt;span&gt; is changing the way Drupal sites are built&amp;nbsp; - at least for those of us that use it regularly. I recently used it to pre-populate a form field on a node&amp;nbsp;&lt;/span&gt;&lt;em&gt;add&lt;/em&gt;&lt;span&gt; page and it turned out to be easier than I figured it would be.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;The task was to pass the value I wanted to pre-populate into the form via a query string variable. Something like:&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span&gt;https://mysite.ddev.site/node/add/article?myvalue=1&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;On the node&amp;nbsp;&lt;/span&gt;&lt;em&gt;add&lt;/em&gt;&lt;span&gt; page, there exists an entity reference field whose value I'd like to pre populate with a value of 1 (&lt;/span&gt;&lt;em&gt;myvalue&lt;/em&gt;&lt;span&gt;).&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/intro_1.png" data-entity-uuid="96e4cd4b-5f07-47ef-8dab-49e2ae790ba4" data-entity-type="file" alt="Screenshot showing the task." width="600" height="330" class="align-center" loading="lazy"&gt;&lt;h2 dir="ltr"&gt;&lt;strong&gt;Modules required&lt;/strong&gt;&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Modules used in the following solution are:&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;a href="https://www.drupal.org/project/token"&gt;&lt;span&gt;Token&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;a href="https://www.drupal.org/project/bpmn_io/"&gt;&lt;span&gt;BPMN.iO for ECA&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;ECA BPMN (part of ECA module)&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;ECA Form (part of ECA module)&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;ECA UI (part of ECA module)&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;ECA Core (part of ECA module)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p dir="ltr"&gt;&lt;span&gt;The Token module is required because the ECA model will access the&amp;nbsp;&lt;/span&gt;&lt;em&gt;myvalue&lt;/em&gt;&lt;span&gt; query string value via a token.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr"&gt;&lt;strong&gt;ECA components&lt;/strong&gt;&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;The ECA Form module (a sub-module of ECA) provides the necessary components to achieve the goal.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;div class="clearfix"&gt;&lt;p dir="ltr"&gt;&lt;span&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/build-form-component.png" data-entity-uuid="2951d4da-104a-46c8-b2b7-ec3f64173671" data-entity-type="file" alt="Screenshot of Build Form component configuration." width="500" height="458" class="align-right" loading="lazy"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;The&amp;nbsp;&lt;/span&gt;&lt;em&gt;Build Form&lt;/em&gt;&lt;span&gt; event and the&amp;nbsp;&lt;/span&gt;&lt;em&gt;Form Field: Set Default Value&lt;/em&gt;&lt;span&gt; task components are all that are needed. Configuration as follows:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;em&gt;Build Form&lt;/em&gt;&lt;span&gt; event&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Restrict by form id: node-article-form&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Restrict by entity type ID: node&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Restrict by entity bundle: article&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="clearfix"&gt;&lt;p&gt;&lt;em&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/set-default-value-component.png" data-entity-uuid="83647396-5a4f-449f-9dab-1fff6b3b1a11" data-entity-type="file" alt="Screenshot of form field configuration." width="500" height="555" class="align-right" loading="lazy"&gt;Form Field: Set Default Value&lt;/em&gt; task&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Field name: field_linked_content&lt;/li&gt;&lt;li&gt;Value: [current-page:query:myvalue]&lt;br&gt;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;Once the model is created and saved, enjoy the fruits of your labor!&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/tada.png" data-entity-uuid="b586c657-b97a-4652-ad21-a012c80a3b67" data-entity-type="file" alt="Screenshot showing final result." width="600" height="305" class="align-center" loading="lazy"&gt;&lt;h2&gt;Other potential solutions&lt;/h2&gt;&lt;p&gt;Was ECA the only way to complete this task? Certainly not. A small custom module could be written to achieve the same goal. In addition, there's the &lt;a href="https://www.drupal.org/project/prepopulate"&gt;Pre-populate&lt;/a&gt; and &lt;a href="https://www.drupal.org/project/epp"&gt;Entity prepopulate&lt;/a&gt; modules.&lt;/p&gt;&lt;p&gt;Why use an ECA-based solution then? If you're already using ECA on the project for something else, then I'd recommend this type of ECA solution in order to avoid adding an additional contrib module just for your pre-populating needs.&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
  <pubDate>Thu, 08 Aug 2024 10:06:51 -0400</pubDate>
    
    <guid isPermaLink="false">1083 at http://drupaleasy.com</guid>
    <dc:creator>drupaleasy@gmail.com (Michael Anello)</dc:creator></item>
<item>
  <title>DrupalEasy Podcast S17E1 - Jamie Abrahams - Drupal's new AI module</title>
  <link>https://www.drupaleasy.com/podcast/2024/08/drupaleasy-podcast-s17e1-jamie-abrahams-drupals-new-ai-module</link>
  <description>
      
  

&lt;p&gt;We talk with &lt;a href="https://www.drupal.org/u/yautja_cetanu"&gt;Jamie Abrahams&lt;/a&gt; from &lt;a href="https://freelygive.io/"&gt;FreelyGive&lt;/a&gt; about the new AI module and what it means for the future of AI modules in the Drupal ecosystem.&lt;/p&gt;&lt;h2&gt;URLs mentioned&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;The new &lt;a href="https://www.drupal.org/project/ai"&gt;AI module&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=NQuNEEiyxsk"&gt;Introductory video on the new AI module&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://freelygive.io/blog/new-ai-initiative-drupal"&gt;Press release announcing AI module&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://freelygive.io/blog/detail-intro-new-drupal-ai-module"&gt;Detailed introduction of AI module&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="https://drupal.slack.com/archives/CDL2YPBNX"&gt;#AI channel in Drupal Slack workspace&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="https://www.drupal.org/project/ai/issues/3456553"&gt;Issue queue discussion about generic "ai()" method&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://www.langchain.com/"&gt;LangChain&lt;/a&gt; &amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="https://www.llamaindex.ai/"&gt;LlamaIndex&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="https://lmstudio.ai/"&gt;LM Studio&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="https://www.ollama.com/"&gt;Ollama&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;DrupalEasy News&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://drupaleasy.com/pmd"&gt;Professional module development&lt;/a&gt; - 15 weeks, 90 hours, live, online course. &amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="https://drupaleasy.com/dco"&gt;Drupal Career Online&lt;/a&gt; - 12 weeks, 77 hours, live online, beginner-focused course.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="https://www.drupaleasy.com/podcast/transcript/1082  "&gt;Audio transcript&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;We're using the machine-driven Amazon Transcribe service to provide an audio transcript of this episode.&lt;/em&gt;&lt;/p&gt;&lt;h2&gt;Subscribe&lt;/h2&gt;&lt;p&gt;Subscribe to our podcast on &lt;a href="https://itunes.apple.com/us/podcast/drupaleasy-podcast/id305745575"&gt;iTunes&lt;/a&gt;, &lt;a href="https://www.iheart.com/podcast/256-drupaleasy-podcast-30968424/"&gt;iHeart&lt;/a&gt;, &lt;a href="https://music.amazon.com/podcasts/3d8b0d3f-a74f-4651-bd79-7f0163a55484/drupaleasy-podcast"&gt;Amazon&lt;/a&gt;, &lt;a href="https://www.youtube.com/@Drupaleasy/podcasts"&gt;YouTube&lt;/a&gt;, or &lt;a href="https://open.spotify.com/show/4TbuXTShKJ1CPivFzYQfP8"&gt;Spotify&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;&lt;p&gt;If you'd like to leave us a voicemail, call 321-396-2340. Please keep in mind that we might play your voicemail during one of our future podcasts. Feel free to call in with suggestions, rants, questions, or corrections. If you'd rather just send us an email, please use our &lt;a href="http://DrupalEasy.com/contact"&gt;contact page&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Credits&lt;/h2&gt;&lt;p&gt;Podcast edited by Amelia Anello.&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
  <pubDate>Sun, 04 Aug 2024 15:26:43 -0400</pubDate>
    
    <guid isPermaLink="false">1082 at http://drupaleasy.com</guid>
    <dc:creator>drupaleasy@gmail.com (Michael Anello)</dc:creator></item>
<item>
  <title>Getting ready to run your first migration</title>
  <link>https://www.drupaleasy.com/blogs/ultimike/2024/07/getting-ready-run-your-first-migration</link>
  <description>
&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/drupal-migration-monster.jpg" data-entity-uuid="e6b60d98-fab3-4c4e-aaea-d4628a222e05" data-entity-type="file" alt="AI generated image of a Drupal monster ingesting books." width="600" height="343" class="align-center" loading="lazy"&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Migrating content into Drupal is an extremely useful skill for most Drupal developers. Often, the most difficult step in learning to do migrations is the first one - that of getting everything set up and running your first migration to ensure that everything is working as expected.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Most Drupal migration-related blog posts and documentation that I've seen either completely ignore the setup process or gloss over it before diving into the details of writing migrations. I like to ensure, both here, and when working with participants in our &lt;/span&gt;&lt;a href="https://www.drupaleasy.com/academy/pmd/course-information "&gt;&lt;span&gt;Professional Module Development&amp;nbsp;course&lt;/span&gt;&lt;/a&gt;&lt;span&gt;, that we ensure a solid understanding of this process to build not only skills, but confidence.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;This blog post will explain how to set up and run your first (very simple) Drupal migration. The process I will outline is actually the same steps I do when beginning to write a custom migration - just to make sure I have everything "hooked up" properly before I start getting into the more complex aspects of the project.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;I generally write migrations on my local machine, using DDEV as the local development environment.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr"&gt;&lt;strong&gt;Configuration migrations vs. Plugin migrations&lt;/strong&gt;&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;When creating a custom migration, one of the initial decisions to be made is whether you'll write the migrations as plugins or configuration entities. I've always used configuration entities, but there are pros and cons to both approaches. Here, we will focus on configuration entity migrations.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;There are some minor differences in the workflow presented below when using plugin migrations. For more information on the differences, I recommend &lt;/span&gt;&lt;a href="https://understanddrupal.com/lessons/defining-drupal-migrations-configuration-entities-migrate-plus-module/"&gt;&lt;span&gt;Mauricio Dinarte's article&lt;/span&gt;&lt;/a&gt;&lt;span&gt;.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr"&gt;&lt;strong&gt;Core and contrib modules used&lt;/strong&gt;&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;If you're planning on following along with this article, the following modules should be installed and enabled:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Drupal core:&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Migrate&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Migrate Drupal&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Contrib:&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Migrate tools (for Drush commands)&amp;nbsp;&lt;/span&gt;&lt;a href="https://www.drupal.org/project/migrate_tools"&gt;&lt;span&gt;https://www.drupal.org/project/migrate_tools&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Migrate plus (migrations as configuration, additional process plugins, and more)&amp;nbsp;&lt;/span&gt;&lt;a href="https://www.drupal.org/project/migrate_plus"&gt;&lt;span&gt;https://www.drupal.org/project/migrate_plus&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 dir="ltr"&gt;&lt;strong&gt;Source database&lt;/strong&gt;&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;This blog post will demonstrate importing a small portion of user data from a Drupal 7 site into a Drupal 10 site. Normally, the first step is setting up the source data: in this case a Drupal 7 database. I normally create a new&amp;nbsp;&lt;/span&gt;&lt;em&gt;d7&lt;/em&gt;&lt;span&gt; database on the same MariaDB server as the Drupal 10 site (using DDEV, this is quite easy) and then import the Drupal 7 database into it.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Next, we have to tell the Drupal 10 site about the&amp;nbsp;&lt;/span&gt;&lt;em&gt;d7&lt;/em&gt;&lt;span&gt; source database. This can be done by adding the following database connection array to the bottom of your&amp;nbsp;settings.local.php file (&lt;/span&gt;&lt;a href="https://www.drupaleasy.com/blogs/ultimike/2024/02/why-you-should-care-about-using-settingslocalphp"&gt;&lt;span&gt;which I know you're using!&lt;/span&gt;&lt;/a&gt;&lt;span&gt;):&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class="language-plaintext"&gt;$databases['migrate']['default'] = array(
 &amp;nbsp;'driver' =&amp;gt; 'mysql',
 &amp;nbsp;'database' =&amp;gt; 'd7',
 &amp;nbsp;'username' =&amp;gt; 'db',
 &amp;nbsp;'password' =&amp;gt; 'db',
 &amp;nbsp;'host' =&amp;gt; 'db',
 &amp;nbsp;'port' =&amp;gt; 3306,
 &amp;nbsp;'prefix' =&amp;gt; '',
);&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;span&gt;Note the database key is&amp;nbsp;&lt;/span&gt;&lt;em&gt;migrate&lt;/em&gt;&lt;span&gt; and the database name is&amp;nbsp;&lt;/span&gt;&lt;em&gt;d7&lt;/em&gt;&lt;span&gt;. Everything else is identical to the regular Drupal 10 database credentials in DDEV. If you're using Lando or another local development environment, then your database connection array may be different.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr"&gt;&lt;strong&gt;Custom migration module&lt;/strong&gt;&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Next, we need a custom module to house our migration. The easiest way to create one is via Drush's&amp;nbsp;&lt;/span&gt;&lt;em&gt;generate&lt;/em&gt;&lt;span&gt; command:&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class="language-plaintext"&gt;$ drush generate module
 Welcome to module generator!
––––––––––––––––––––––––––––––
 Module name:
 ➤ My d7 migration
 Module machine name [my_d7_migration]:
 ➤ 
 Module description:
 ➤ Migrations from Drupal 7 site.
 Package [Custom]:
 ➤&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
 Dependencies (comma separated):
 ➤ migrate, migrate_drupal, migrate_plus
 Would you like to create module file? [No]:
 ➤ 
 Would you like to create install file? [No]:
 ➤ 
 Would you like to create README.md file? [No]:
 ➤ 
 The following directories and files have been created or updated:
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
 • /var/www/html/web/modules/custom/my_d7_migration/my_d7_migration.info.yml&lt;/code&gt;&lt;/pre&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Once created, go ahead and enable the module as well:&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class="language-plaintext"&gt;$ drush en my_d7_migration&lt;/code&gt;&lt;/pre&gt;&lt;h2 dir="ltr"&gt;&lt;strong&gt;Migration group configuration&lt;/strong&gt;&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;As this blog post will be writing migrations as configuration entities, create a new&amp;nbsp;&lt;/span&gt;&lt;em&gt;config/install&lt;/em&gt;&lt;span&gt; directory in your new module.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;We'll define a migration group to which all of our migrations will belong - this is what connects each migration to the source&amp;nbsp;&lt;/span&gt;&lt;em&gt;d7&lt;/em&gt;&lt;span&gt; database. Create a new&amp;nbsp;&lt;/span&gt;&lt;em&gt;migrate_plus.migration_group.my_group.yml&lt;/em&gt;&lt;span&gt; file in the new&amp;nbsp;&lt;/span&gt;&lt;em&gt;config/install&lt;/em&gt;&lt;span&gt; directory with the following contents:&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class="language-plaintext"&gt;id: my_d7_migration
label: My Drupal 7 migration.
description: Content from Drupal 7 site.
source_type: Source Drupal 7 site
shared_configuration:
 &amp;nbsp;source:
 &amp;nbsp;&amp;nbsp;&amp;nbsp;key: migrate
 &amp;nbsp;migration_tags:
 &amp;nbsp;&amp;nbsp;&amp;nbsp;- Drupal 7
 &amp;nbsp;&amp;nbsp;&amp;nbsp;- my_d7_migration&lt;/code&gt;&lt;/pre&gt;&lt;p dir="ltr"&gt;&lt;span&gt;The most important bit of this configuration is the&amp;nbsp;&lt;/span&gt;&lt;em&gt;source key&lt;/em&gt;&lt;span&gt; of&amp;nbsp;&lt;/span&gt;&lt;em&gt;migrate&lt;/em&gt;&lt;span&gt;; this links up this migration group with the&amp;nbsp;&lt;/span&gt;&lt;em&gt;d7&lt;/em&gt;&lt;span&gt; database, with the migrate key we previously configured. Then, any migration created that is in this group automatically has access to the source&amp;nbsp;&lt;/span&gt;&lt;em&gt;d7&lt;/em&gt;&lt;span&gt; database.&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr"&gt;&lt;strong&gt;Simple sample migration configuration&lt;/strong&gt;&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Next, let's look at a super simple example migration for user entities. This will not be a complete user migration, but rather just enough to migrate&amp;nbsp;&lt;/span&gt;&lt;em&gt;something&lt;/em&gt;&lt;span&gt;. Many migration blog posts, documentation pages and other sources provide guidance and examples for writing migration configuration files (remember, this blog post is focused on all of the configuration and mechanics that normally aren't covered in other places.)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Here's the user migration configuration we'll use. Create a new&amp;nbsp;&lt;/span&gt;&lt;em&gt;&lt;span&gt;/config/install/migrate_plus.migration.user.yml&lt;/span&gt;&lt;/em&gt;&lt;span&gt; file in your custom module with the following contents:&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class="language-plaintext"&gt;id: user
label: Migrate D7 users.
migration_group: my_d7_migration
source:
 &amp;nbsp;plugin: d7_user
process:
 &amp;nbsp;name: name
 &amp;nbsp;pass: pass
 &amp;nbsp;mail: mail
 &amp;nbsp;created: created
 &amp;nbsp;access: access
 &amp;nbsp;login: login
 &amp;nbsp;status: status
 &amp;nbsp;timezone: timezone
destination:
 &amp;nbsp;plugin: entity:user&lt;/code&gt;&lt;/pre&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Reputable Drupal migration articles and documentation will explain that migrations need a source (extraction,) some processing (transform,) and a destination (where to load the data.) Often these three concepts will be called ETL. Each of these concepts are easy to spot in our sample configuration file:&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;span&gt;The data is coming from the&amp;nbsp;&lt;/span&gt;&lt;em&gt;&lt;span&gt;d7_user&lt;/span&gt;&lt;/em&gt;&lt;span&gt; plugin (provided by Drupal core with the data source being that of the&amp;nbsp;&lt;/span&gt;&lt;em&gt;&lt;span&gt;my_d7_migration&lt;/span&gt;&lt;/em&gt;&lt;span&gt; group which we configured in a previous step.)&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;The processing of the data in this simple migration is just field mapping (&lt;/span&gt;&lt;em&gt;&lt;span&gt;to&lt;/span&gt;&lt;/em&gt;&lt;span&gt;:&amp;nbsp;&lt;/span&gt;&lt;em&gt;&lt;span&gt;from&lt;/span&gt;&lt;/em&gt;&lt;span&gt;.) Many migration configurations have transformations as part of this section, often provided by Drupal &lt;/span&gt;&lt;em&gt;&lt;span&gt;process plugins&lt;/span&gt;&lt;/em&gt;&lt;span&gt;.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;The destination is Drupal user entities.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 dir="ltr"&gt;&lt;strong&gt;Running the migration&lt;/strong&gt;&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Again, these instructions are specific to Drupal migration configurations when created as configuration entities. Instructions for migration configuration written as plugins are slightly different (and not covered in this article.)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;As we are dealing with configuration entities, they must be imported into the&amp;nbsp;&lt;/span&gt;&lt;em&gt;active&lt;/em&gt;&lt;span&gt; configuration store - which, by default, is the Drupal database. This is easily accomplished with the&amp;nbsp;&lt;/span&gt;&lt;em&gt;&lt;span&gt;drush cim --partial&lt;/span&gt;&lt;/em&gt;&lt;span&gt; command. This must be run&amp;nbsp;&lt;/span&gt;&lt;strong&gt;each and every&lt;/strong&gt;&lt;span&gt; time a migration configuration file is modified. This is one of the (few, in my opinion) downsides of writing migrations as configurations.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Next, I often check the status of migration via the&amp;nbsp;&lt;/span&gt;&lt;em&gt;&lt;span&gt;drush migrate:status&lt;/span&gt;&lt;/em&gt;&lt;span&gt; command. When using the Migrate Drupal module, it is recommended to always use the &lt;/span&gt;&lt;em&gt;&lt;span&gt;--group&lt;/span&gt;&lt;/em&gt;&lt;span&gt; option otherwise the output of&amp;nbsp;&lt;/span&gt;&lt;em&gt;&lt;span&gt;migrate:status&lt;/span&gt;&lt;/em&gt;&lt;span&gt; can get a bit messy (due to all the default migrations that will be displayed.)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;The drush&amp;nbsp;migrate:import and&amp;nbsp;migrate:rollback commands should be self-explanatory. Each can be used with either the&amp;nbsp;&lt;/span&gt;&lt;em&gt;&lt;span&gt;--group&lt;/span&gt;&lt;/em&gt;&lt;span&gt; option or with a migration name (as shown below.) I almost always use the&amp;nbsp;&lt;/span&gt;&lt;em&gt;&lt;span&gt;--update&lt;/span&gt;&lt;/em&gt;&lt;span&gt; option on&amp;nbsp;&lt;/span&gt;&lt;em&gt;&lt;span&gt;migrate:import&lt;/span&gt;&lt;/em&gt;&lt;span&gt; for updating previously imported data.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Finally, keep the&amp;nbsp;&lt;/span&gt;&lt;em&gt;&lt;span&gt;drush migrate:reset&lt;/span&gt;&lt;/em&gt;&lt;span&gt; command in your back pocket when writing custom migrations. If the migration crashes, you'll need to use this to reset its status from&amp;nbsp;&lt;/span&gt;&lt;em&gt;processing&lt;/em&gt;&lt;span&gt; to&amp;nbsp;&lt;/span&gt;&lt;em&gt;idle&lt;/em&gt;&lt;span&gt; in order to run it again.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Here's a full set of the command specific to the sample user migration, migration group, and custom module created in this article:&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class="language-plaintext"&gt;$ drush cim --partial --source=modules/custom/my_d7_migration/config/install
$ drush migrate:status --group=whatever
$ drush migrate:import user --update
$ drush migrate:reset user
$ drush migrate:rollback user&lt;/code&gt;&lt;/pre&gt;&lt;h2 dir="ltr"&gt;&lt;strong&gt;What's next?&lt;/strong&gt;&lt;/h2&gt;&lt;p dir="ltr"&gt;&lt;span&gt;What I've presented in this article is 90% of what I regularly use when running migrations. Sure, there are a few edge cases where oddities occur, but I believe this is a solid base of knowledge to start with.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr"&gt;&lt;span&gt;Once all this makes sense, I encourage you to utilize other blog posts and documentation to extend the user migration we started, or write new ones based on other resources. Once you're comfortable writing additional migrations, learning how to create your own process plugins is the natural next step. As process plugins are written as PHP classes, some knowledge of module development is necessary.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Interested in learning more about Drupal module development? Check out &lt;/em&gt;&lt;a href="https://www.drupaleasy.com/academy/pmd/course-information"&gt;&lt;em&gt;DrupalEasy's 15-week Professional Module Development course&lt;/em&gt;&lt;/a&gt;&lt;em&gt;!&amp;nbsp;&lt;/em&gt;&lt;/p&gt;&lt;h2 dir="ltr"&gt;&lt;strong&gt;Additional resources&lt;/strong&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;a href="https://understanddrupal.com/"&gt;&lt;span&gt;UnderstandDrupal.com&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - loads of resources about Drupal migrations from Mauricio Dinarte.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;a href="https://www.tag1consulting.com/services/d7-d10-data-migration-guide"&gt;&lt;span&gt;Tag1's recent series about migrations&lt;/span&gt;&lt;/a&gt;&lt;span&gt; (also written by Mauricio Dinarte!):&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span&gt;Migration related modules (definitely not an exhaustive list, but a solid start):&lt;/span&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;&lt;a href="https://www.drupal.org/project/migrate_plus"&gt;&lt;span&gt;Migrate plus&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;a href="https://www.drupal.org/project/migrate_tools"&gt;&lt;span&gt;Migrate tools&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;a href="https://www.drupal.org/project/migrate_devel"&gt;&lt;span&gt;Migrate devel&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;a href="https://www.drupal.org/project/migrate_process_extra"&gt;&lt;span&gt;Migrate process extra&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - process plugins for migrations.&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;a href="https://www.drupal.org/project/migrate_conditions"&gt;&lt;span&gt;Migrate conditions&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - additional process plugins for migrations.&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;a href="https://www.drupal.org/project/migrate_source_csv"&gt;&lt;span&gt;Migrate source CSV&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - allows migrations from .csv files.&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;a href="https://www.drupal.org/project/migration_tools"&gt;&lt;span&gt;Migration tools&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - even more process plugins and additional helper classes and methods for migration.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;a href="https://www.drupal.org/project/migrate_upgrade"&gt;&lt;span&gt;Migrate upgrade&lt;/span&gt;&lt;/a&gt;&lt;span&gt; - Drush support for the Drupal core migrations from Drupal 6 and 7.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;&lt;span&gt;Lead image generated by OpenAI.&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;</description>
  <pubDate>Tue, 23 Jul 2024 05:29:54 -0400</pubDate>
    
    <guid isPermaLink="false">1081 at http://drupaleasy.com</guid>
    <dc:creator>drupaleasy@gmail.com (Michael Anello)</dc:creator></item>
<item>
  <title>Visual Debugger module: a modern take on an old idea</title>
  <link>https://www.drupaleasy.com/blogs/ultimike/2024/06/visual-debugger-module-modern-take-old-idea</link>
  <description>
&lt;p&gt;If you've been a Drupal developer since before the time of &lt;em&gt;modern Drupal&lt;/em&gt; (pre-Drupal 8,) then you probably remember the &lt;a href="https://www.drupal.org/project/devel_themer"&gt;Theme Developer module&lt;/a&gt;. This module is/was used to figure out theme template usage and possible overrides in Drupal 7.&lt;/p&gt;&lt;p&gt;With modern Drupal, this same information is available directly in the HTML source code of a file when Twig development mode is enabled.&amp;nbsp;&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/twig-development-mode.png" data-entity-uuid="0f09985b-54d2-4563-99e2-a5c78b8a2457" data-entity-type="file" alt="Screenshot of Drupal 10 Development Settings page." width="600" height="181" class="align-center" loading="lazy"&gt;&lt;p&gt;The &lt;a href="https://www.drupal.org/project/visual_debugger"&gt;Visual Debugger module&lt;/a&gt; by &lt;a href="https://www.drupal.org/u/mabho"&gt;Marcos Hollanda&lt;/a&gt; combines the best of the present with the best of the past to surface template information directly in the user interface without having to dig into the page's HTML.&amp;nbsp;&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/visual-debugger-in-action.png" data-entity-uuid="c5bdb774-e4fa-4352-94dc-87f9657f5fec" data-entity-type="file" alt="Screenshot of the Visual Debugger module showing theme suggestions and the currently used template file." width="600" height="342" class="align-center" loading="lazy"&gt;&lt;h2&gt;Pre-impressions&lt;/h2&gt;&lt;p&gt;I will admit that before I installed the module, I was doubtful that I'd be interested in using it. Marcos had pinged me on Slack asking me to take a look at it, and I figured it would be a nice exercise for DrupalEasy Office Hours, which it was.&lt;/p&gt;&lt;p&gt;Much to my surprise though, I really like using it.&amp;nbsp;&lt;/p&gt;&lt;h2&gt;Basic usage&lt;/h2&gt;&lt;p&gt;There's not much to say about how to use this module - it works just like you'd expect. Use Composer to get the code, enable the module, then enable Twig development mode and you're done. By default it will appear on each non-admin page of your site, with a handy activate/deactivate icon. There's really not too much to say about its usage &#128512;.&lt;/p&gt;&lt;h2&gt;Current status&lt;/h2&gt;&lt;p&gt;The module is in alpha status with several planned features not yet implemented. What is implemented so far appears to be solid and useful. The basic functionality that I expected is there. Click on any section of the page, and the module will display the template file that is used to render that section as well as a list of possible template file override names. This is the same information that Twig developer mode displays in HTML comments.&lt;/p&gt;&lt;p&gt;Marcos let me know that other planned features include theme hook suggestions and displaying caching information; (similar to the &lt;a href="https://www.drupal.org/project/cache_review"&gt;Cache review module&lt;/a&gt;, perhaps?)&lt;/p&gt;&lt;p&gt;There are other challenges to overcome as well, including how to handle selecting overlapping elements. I did make one very &lt;a href="https://www.drupal.org/project/visual_debugger/issues/3454733"&gt;minor suggestion&lt;/a&gt; to relocate the module's configuration page which Marcos quickly implemented &#129304;&#127996;.&lt;/p&gt;&lt;h2&gt;Who is this module for?&lt;/h2&gt;&lt;p&gt;I would definitely put this module in the category of a developer tool for folks who are either new to Drupal theme development or people who prefer a UI instead of scrolling through raw HTML.&lt;/p&gt;&lt;p&gt;I plan on following the progress of this module closely, in hopes that it will be suitable to use during the next semester of &lt;a href="https://www.drupaleasy.com/academy/dco/course-information"&gt;Drupal Career Online&lt;/a&gt;, where we have a theming lesson that could definitely benefit from this module.&amp;nbsp;&lt;/p&gt;</description>
  <pubDate>Thu, 20 Jun 2024 08:07:18 -0400</pubDate>
    
    <guid isPermaLink="false">1080 at http://drupaleasy.com</guid>
    <dc:creator>drupaleasy@gmail.com (Michael Anello)</dc:creator></item>
<item>
  <title>Two very different European Drupal events in one week</title>
  <link>https://www.drupaleasy.com/blogs/ultimike/2024/06/two-very-different-european-drupal-events-one-week</link>
  <description>
&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/IMG_4953.jpeg" data-entity-uuid="3283e8c0-959b-4b5f-a534-8fe87d22a26d" data-entity-type="file" alt="Beach in Cemaes, Wales at sunset." width="600" height="450" loading="lazy"&gt;&lt;p&gt;I was fortunate enough to attend two very different European Drupal events recently, and wanted to take a few minutes to share my experience as well as thank the organizers for their dedication to the Drupal community.&lt;/p&gt;&lt;p&gt;The events couldn't have been more different - one being a first-time event in a town I've never heard of and the other celebrating their 20th anniversary in a city that can be considered the crossroads of the Netherlands.&lt;/p&gt;&lt;h2&gt;DrupalCamp Cemaes&lt;/h2&gt;&lt;p&gt;First off - it is pronounced KEM-ice (I didn't learn this until I actually arrived). Cemaes is a small village at the &lt;a href="https://www.openstreetmap.org/node/253946697#map=6/53.413/-4.454"&gt;very northern tip of Wales&lt;/a&gt; with a &lt;a href="https://en.wikipedia.org/wiki/Cemaes"&gt;population of 1,357&lt;/a&gt;. Luckily, one of those 1,357 people is &lt;a href="https://www.drupal.org/u/jeni_dc"&gt;Jennifer Tehan&lt;/a&gt;, an independent Drupal developer who decided to organize a Drupal event in a town that (I can only assume) has more sheep than people.&amp;nbsp;&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/IMG_0148.jpg" data-entity-uuid="c8a69822-4707-4a7e-8966-d0328a229743" data-entity-type="file" alt="Two sheep looking at camera." width="600" height="450" loading="lazy"&gt;&lt;p&gt;When this event was first announced a few months back, I immediately knew that this was something I wanted to attend - mostly because I've always wanted to visit Wales to do some hiking ("walking," if you're not from the United States.) I used the camp as an excuse for my wife and I to take a vacation and explore northern Wales. I could write an entire other blog post on how amazeballs the walking was…&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/IMG_4958.jpeg" data-entity-uuid="2a662923-fd24-4970-8279-58911227250b" data-entity-type="file" alt="Hiking on a trail near Cemaes Wales on a hill overlooking some ruins. " width="600" height="450" loading="lazy"&gt;&lt;p&gt;DrupalCamp Cemaes was never going to be a large event, and it turns out there wound up being only nine of us (ten if you count Frankie, pictured below.) The advantage of such a small event was easy to see - we all got to know each other quite well. There's something really nice - less intimidating - about small Drupal events that I realized that I've really missed since the decline of Drupal meetups in many localities.&amp;nbsp;&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/IMG_0472.jpeg" data-entity-uuid="88a3bcf8-6379-4310-a774-ee13597ae82e" data-entity-type="file" alt="Frankie, the official dog of DrupalCamp Cemaes" width="600" height="450" loading="lazy"&gt;&lt;p&gt;The event itself was an unconference, with different people presenting on Drupal contributions (&lt;a href="https://www.drupal.org/u/lostcarpark"&gt;James Shields&lt;/a&gt;), GitHub Codespaces (&lt;a href="https://www.drupal.org/u/rachel_norfolk"&gt;Rachel Lawson&lt;/a&gt;), remote work (Jennifer Tehan), the LocalGov distribution (&lt;a href="https://www.drupal.org/u/andybroomfield"&gt;Andy Broomfield&lt;/a&gt;), and Starshot (myself.)&lt;/p&gt;&lt;p&gt;The setting of the event couldn't have been more lovely - an idyllic seaside community where everything was within walking distance, including the village hall where the event took place. If Jennifer decides to organize DrupalCamp Cemaes 2025, I'm pretty sure Gwendolyn and I will be there.&lt;/p&gt;&lt;p&gt;&lt;a href="https://drupalcampcemaes.wales/blog/2024/06/drupalcamp-cemaes-2024-roundup"&gt;&lt;em&gt;Read a brief wrap-up of DrupalCamp Cemaes from Jennifer Tehan.&lt;/em&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/IMG_4949.jpeg" data-entity-uuid="7b0de431-cb51-4261-8055-d28c9e50e8a0" data-entity-type="file" alt="Village hall in Cemaes Wales." width="600" height="450" loading="lazy"&gt;&lt;p&gt;This camp was proof that anyone, anywhere can organize a successful Drupal event with a minimum of fuss.&amp;nbsp;&lt;/p&gt;&lt;h2&gt;Drupaljam&lt;/h2&gt;&lt;p&gt;Four days later, I was in &lt;a href="https://www.openstreetmap.org/relation/419203#map=6/52.084/5.083"&gt;Utrecht, Netherlands&lt;/a&gt;, at the 20th anniversary of &lt;a href="https://drupaljam.nl/"&gt;Drupaljam&lt;/a&gt;, the annual main Dutch Drupal event.&amp;nbsp;&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/IMG_4974.jpeg" data-entity-uuid="90579318-3db7-454a-9aa1-f45842ccc3c5" data-entity-type="file" alt="Entrance to Drupaljam venue." width="600" height="436" loading="lazy"&gt;&lt;p&gt;I had previously attended 2011 &lt;a href="https://groups.drupal.org/node/146969"&gt;Drupaljam&lt;/a&gt; and recall two things about that event: the building it took place in seemed like it was from the future, and many of the sessions were in Dutch.&lt;/p&gt;&lt;p&gt;This was a very different event from the one I had been at a few days earlier, in a city of almost 400,000 people with over 300 attendees (I was told this number anecdotally) in one of the coolest event venues I've ever been to. &lt;a href="https://defabrique.nl/"&gt;Defabrique&lt;/a&gt; is a renovated linseed oil and compound feed factory that is a bit over 100 years old that is (IMHO) absolutely perfect for a Drupal event. Each and every public space has character, yet is also modern enough to support open-source enthusiasts. On top of all that, the food was amazing.&lt;/p&gt;&lt;p&gt;Attending Drupal Jam was a bit of a last minute decision for me, but I'm really glad that I made the time for it. I was able to reconnect with members of the European Drupal community that I don't often see, and make new connections with more folks that I can count.&lt;/p&gt;&lt;p&gt;I spent the day the way I spend most of my time at Drupal events - alternating between networking and attending sessions that attracted me. There were a number of really interesting AI-related sessions that I took in; it's pretty obvious to me that the Drupal community is approaching AI integrations in an unsurprisingly thoughtful manner.&lt;/p&gt;&lt;p&gt;The last week reinforced to me how fortunate I am to be able to attend so many in-person Drupal events. The two events I was able to participate in couldn't have been more different in scale and scope, but don't ask me to choose my favorite, because I'm honestly not sure I could!&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
  <pubDate>Tue, 18 Jun 2024 08:18:48 -0400</pubDate>
    
    <guid isPermaLink="false">1079 at http://drupaleasy.com</guid>
    <dc:creator>drupaleasy@gmail.com (Michael Anello)</dc:creator></item>
<item>
  <title>Ruminations on Drupal Starshot</title>
  <link>https://www.drupaleasy.com/blogs/ultimike/2024/05/ruminations-drupal-starshot</link>
  <description>
&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/starshot.png" data-entity-uuid="8fec6ff3-d611-40ea-ae6c-6bcff5e73757" data-entity-type="file" alt="Presentation slide introducing Drupal Starshot." width="600" height="334" loading="lazy"&gt;&lt;blockquote&gt;&lt;p&gt;a second official version of Drupal&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;em&gt;- Dries Buytaert, in his &lt;/em&gt;&lt;a href="https://dri.es/state-of-drupal-presentation-may-2024"&gt;&lt;em&gt;blog post&lt;/em&gt;&lt;/a&gt;&lt;em&gt; announcing Drupal Starshot&lt;/em&gt;&lt;/p&gt;&lt;p&gt;If you're a Drupal developer of any caliber and pay any attention to the goings-on in the Drupal community, then you no doubt have heard about &lt;a href="https://www.drupal.org/starshot"&gt;Starshot&lt;/a&gt;, recently &lt;a href="https://www.youtube.com/watch?v=Dl9XZNtQJzs"&gt;announced by Dries Buytaert at DrupalCon Portland 2024.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;In this post, I'll do my best to not repeat everything that was announced, but rather to summarize, ask a question or two and offer an opinion or two…&lt;/p&gt;&lt;h2&gt;The basics&lt;/h2&gt;&lt;p&gt;Starshot will be a new download available on drupal.org that includes contributed modules and configuration to provide a superior out-of-the-box solution that is more usable/approachable/friendlier than Drupal core.&lt;/p&gt;&lt;p&gt;In my opinion, Starshot can be thought of (generally speaking of course) as two-ish large tasks. First, full integration with &lt;a href="https://www.drupal.org/about/core/strategic-initiatives/automatic-updates"&gt;Automatic Updates&lt;/a&gt;, &lt;a href="https://www.drupal.org/about/core/strategic-initiatives/project-browser"&gt;Project Browser&lt;/a&gt; and &lt;a href="https://www.drupal.org/about/core/strategic-initiatives-distributions-and-recipes"&gt;Recipes&lt;/a&gt; (including full Recipe support in Project Browser.) Second; &lt;a href="https://www.drupal.org/node/3375371"&gt;Experience Builder&lt;/a&gt;, which is planned to be (roughly speaking) some combination of &lt;a href="https://www.drupal.org/docs/8/core/modules/layout-builder"&gt;Layout Builder&lt;/a&gt; (or a replacement,) &lt;a href="https://www.drupal.org/project/paragraphs"&gt;Paragraphs&lt;/a&gt;, &lt;a href="https://www.drupal.org/docs/develop/theming-drupal/using-single-directory-components"&gt;Single Directory Components&lt;/a&gt;, an in-browser styling tool and other modules/configuration to provide a best-of-breed page-building solution.&lt;/p&gt;&lt;p&gt;The &lt;em&gt;-ish&lt;/em&gt; in &lt;em&gt;two-ish&lt;/em&gt; from above is all the additional functionality that having full Recipes support will bring. IMHO, this is the star in Starshot.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Note: Experience Builder is not new - it is an evolution of &lt;/em&gt;&lt;a href="https://dri.es/evolving-drupal-layout-builder-to-an-experience-builder "&gt;&lt;em&gt;Next generation page builder initiative&lt;/em&gt;&lt;/a&gt;&lt;em&gt; that started in 2023.&amp;nbsp;&lt;/em&gt;&lt;/p&gt;&lt;h2&gt;Why?&lt;/h2&gt;&lt;p&gt;In his keynote, Dries spoke about the need for Starshot over the course of a few minutes, enumerating various reasons why he and others in the community feel this is a necessary task, including the fact that Drupal's UI is difficult to use for new users.&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/interface-too-hard.png" data-entity-uuid="95a5e3f3-2512-4a65-b981-fa3747eb1207" data-entity-type="file" alt="Presentation slide saying that the Drupal UI is too hard to use." width="600" height="335" loading="lazy"&gt;&lt;p&gt;I think Mike Herchel summed the Why up nicely in his &lt;a href="https://herchel.com/articles/thoughts-drupals-new-starshot-initiative"&gt;blog post&lt;/a&gt;:&amp;nbsp;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;It’s an acknowledgement of the perception that Drupal is archaic and/or legacy software, and that this perception needs to change.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Starshot is the Drupal community's effort to win back small- and medium-sized sites that don't currently &lt;em&gt;even consider&lt;/em&gt; using Drupal.&lt;/p&gt;&lt;p&gt;Furthermore, one of the main goals of Drupal Starshot is to allow for faster innovation cycles, allowing Starshot to add functionality at a faster pace than Drupal core.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;&lt;p&gt;There's a countdown clock to liftoff on &lt;a href="https://www.drupal.org/starshot"&gt;drupal.org/starshot&lt;/a&gt; that is currently at a bit over 200 days. Based on this, Starshot will be ready by January 1, 2025. Dries mentioned in his keynote that the goal was to have an initial release by the end of 2024.&lt;/p&gt;&lt;p&gt;There's actually a &lt;a href="https://github.com/phenaproxima/starshot-prototype"&gt;very early prototype&lt;/a&gt; of a subset of the functionality available from &lt;a href="https://www.drupal.org/u/phenaproxima"&gt;phenaproxima&lt;/a&gt; (Adam G-H.)&amp;nbsp;&lt;/p&gt;&lt;p&gt;I'm a bit dubious about all of the mentioned functionality of Starshot being ready by the end of the year. More of my opinion on this in a bit…&lt;/p&gt;&lt;h2&gt;Relationship to Drupal core&lt;/h2&gt;&lt;p&gt;It's not a fork - that much is &lt;a href="https://www.drupal.org/starshot#fork"&gt;clear&lt;/a&gt;. It will include Drupal core, but have its own release schedule. I can only imagine that any time Drupal core has a security update, there will be a new Starshot release (as well as any time any of the contrib modules used in Starshot have a security release as well, I assume)&lt;/p&gt;&lt;h2&gt;What's up with the "Launch" button?&lt;/h2&gt;&lt;p&gt;One of my biggest questions after Dries' keynote was based on a mockup of a drupal.org page that he presented.&lt;/p&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/launch-button.png" data-entity-uuid="508c14fc-f330-4383-96c2-f031b75b5ef3" data-entity-type="file" alt="Mockup showing a Launch button for Starshot." width="600" height="338" loading="lazy"&gt;&lt;p&gt;What happens when someone clicks "Launch?" I've been a proponent of the Drupal Association engaging/partnering with low-cost hosting providers to provide a way to easily provide hosting for a Drupal site that &lt;s&gt;supports&lt;/s&gt; relies on Automatic Updates and Project Browser. The community has invested a lot of time in both of these initiatives, and I feel that neither really has a hosting "home." What would be a better way to officially launch these projects than hosting partners that fully support both, as well as a meaningful site backup plan, all included in a low monthly hosting price. IMHO, this type of thing should definitely be one of the options behind the mysterious "Launch" button. Maybe the DA gets a small referral fee from the hosting providers as well?&lt;/p&gt;&lt;p&gt;Gábor Hojtsy writes in his &lt;a href="https://www.hojtsy.hu/blog/2024-may-11/15-reasons-i-am-excited-about-drupals-new-starshot-initiative"&gt;blog post about Starshot&lt;/a&gt;, "Discussions around making simple hosting available for simpler sites was reignited and a WebAssembly-based browser-executed demo solution's feasibility is also explored again." He also mentioned the potential for a &lt;a href="https://youtu.be/dHbH8ubQoi0?si=khzG47bzv8NBhfo7&amp;amp;t=960"&gt;WebAssembly-based option&lt;/a&gt; in his DrupalCon Portland 2024 session about Drupal 11, as well as options for ephemeral (temporary) hosting solutions (think &lt;a href="https://simplytest.me/"&gt;SimplyTest.me&lt;/a&gt;.)&amp;nbsp;&lt;/p&gt;&lt;h2&gt;Will the plan and/or timeline change?&lt;/h2&gt;&lt;p&gt;Absolutely. Dries and other folks already involved in Starshot admit that there's a lot of things to still figure out, decisions to be made and a lot of work to do to make all this a reality. &lt;strong&gt;Nothing&lt;/strong&gt; is set in stone.&amp;nbsp;&lt;/p&gt;&lt;h2&gt;If I had a magic wand &#129668;&lt;/h2&gt;&lt;p&gt;As exciting as Experience Builder sounds, I'm worried that this is going to take a long time. In addition, as we've seen with the plethora of Layout Builder related contrib modules, there is often no one-size-fits-all solution for page creation.&lt;/p&gt;&lt;p&gt;From my perspective, I think that Drupal Starshot (or Drupal CMS, or whatever we end up calling it) phase 1 should be Automatic Updates, Project Browser, Recipes, and a set of curated recipes available geared towards page building. Experience Builder should be phase 2.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Being able to install recipes from Project Browser (leveraging Package Manager from Automatic Updates) will be a game-changer.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The way I look at it is with full Recipes support, we don't have to have just one Experience Builder, we can have many. We can have simpler ones (sooner) and more intricate ones (later.) We can have recipes that leverage Layout Builder and any number of the &lt;em&gt;currently existing&lt;/em&gt; supporting contrib modules or recipes that focus on Paragraphs. The cream will rise to the top as the various Experience Builder modules are written, tested, and released.&lt;/p&gt;&lt;p&gt;Simon Hobbs agrees that Recipes is the "secret sauce" to Starshot in &lt;a href="https://www.linkedin.com/pulse/codename-starshot-simon-hobbs-t8rlc/?trackingId=bpXhCfYSSRSsV2FSKV176A%3D%3D"&gt;his optimistic blog post&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;&lt;h2&gt;Community reaction&lt;/h2&gt;&lt;p&gt;In the two-ish weeks since Dries announced Starshot, Drupal agencies from around the world have weighed in with their support, including PreviousNext from Australia (&lt;a href="https://www.previousnext.com.au/blog/starshot-and-experience-builder"&gt;blog post by Kim Pepper&lt;/a&gt;,) 1xINTERNET from Europe (&lt;a href="https://www.1xinternet.de/en/highlights/1xinternet-supports-new-drupal-starshot"&gt;announcement&lt;/a&gt;,) Specbee (&lt;a href="https://www.specbee.com/blogs/drupal-starshot-initiative"&gt;blog post by Malabya Tewari&lt;/a&gt;,) and (obviously) Acquia (United States.)&amp;nbsp;&lt;/p&gt;&lt;p&gt;In my conversations with folks while at DrupalCon Portland 2024, reactions were mostly positive, but some folks had some concerns; with the leading issue being that (paraphrasing) the announcement feels like there were some internal (non-public) discussions about doing Starshot following by a "we are doing this" announcement by Dries. While I don't completely agree with this sentiment, I do understand it. The main pieces of Starshot have been open to discussion in the community, while the idea of putting them all together into a new "product" is something that (as far as I could tell) wasn't necessarily widely open for community input.&amp;nbsp;&lt;/p&gt;&lt;h2&gt;Additional resources&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;If you're only going to read one (more) "reaction" blog post about Starshot, I recommend &lt;a href="https://herchel.com/articles/thoughts-drupals-new-starshot-initiative"&gt;Mike Herchel's&lt;/a&gt;, despite the fact that we disagree about the most important part of Starshot (he says Experience Builder, I say Recipes: stay tuned for a future cage match.) Regardless of his incorrect opinion &#128540;, his blog post is quite comprehensive.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="https://fivejars.com/blog/drupal-starshot-reflections-drupalcon-portland-2024"&gt;Blog post from Taylor Paine at Five Jars&lt;/a&gt; about Starshot.&lt;/li&gt;&lt;li&gt;&lt;a href="https://mglaman.dev/blog/starshot-recipe-cook-ambitious-drupal-applications"&gt;Matt Glaman's reaction&lt;/a&gt; to the Starshot announcement (focuses on Recipes.)&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="https://imagexmedia.com/blog/drupal-starshot-new-cms"&gt;Blog post from Nadiia Nykolaichuk&lt;/a&gt; from ImageX&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="https://www.drupal.org/association/blog/drupal-lead-dries-buytaert-announces-the-guiding-star-for-a-new-version-of-the-drupal-cms-23-years"&gt;Press release about Starshot&lt;/a&gt; from the Drupal Association&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="https://medium.com/@pdjohnson/ambitious-drupal-starshot-initiative-announced-f74339a9613b"&gt;Paul Johnson't blog post&lt;/a&gt; about Starshot&amp;nbsp;&lt;/li&gt;&lt;li&gt;Electric Citizen &lt;a href="https://www.electriccitizen.com/citizen-blog/big-changes-ahead-drupal "&gt;blog post by Dan Moriarty&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;</description>
  <pubDate>Thu, 23 May 2024 08:03:00 -0400</pubDate>
    
    <guid isPermaLink="false">1077 at http://drupaleasy.com</guid>
    <dc:creator>drupaleasy@gmail.com (Michael Anello)</dc:creator></item>
<item>
  <title>Drupal needs new, young developers</title>
  <link>https://www.drupaleasy.com/blogs/ultimike/2024/05/drupal-needs-new-young-developers</link>
  <description>
&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/11_0.png" data-entity-uuid="42829391-3847-4476-b084-2e5bdfca86b1" data-entity-type="file" alt="Pie chart showing most survey respondents have been using Drupal longer than 5 years." width="600" height="338" loading="lazy"&gt;&lt;p&gt;&lt;em&gt;Image used with permission from &lt;/em&gt;&lt;a href="https://www.drupal.org/u/richo_au"&gt;&lt;em&gt;Michael Richardson&lt;/em&gt;&lt;/a&gt;&lt;em&gt; from &lt;/em&gt;&lt;a href="https://www.ironstar.io/"&gt;&lt;em&gt;Ironstar.io&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;I took a lot away from DrupalCon Portland 2024, and while one of my lasting memories from the main keynote (the Driesnote) will be the introduction of &lt;a href="https://www.drupal.org/starshot"&gt;Starshot&lt;/a&gt;, something that has occupied a good amount of space in my brain is what happened just prior to Dries’ Starshot announcement.&lt;/p&gt;&lt;p&gt;At the start of his presentation (&lt;a href="https://www.youtube.com/watch?v=I95hSyocMlg&amp;amp;t=1045s"&gt;the 21:15 mark of this video&lt;/a&gt;,) Dries asks everyone with at least one year of Drupal experience to stand up. He then asked everyone with less than three years of experience with Drupal to sit down. The results were scary. As Dries reacted:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Oh wow. Almost nobody sat down.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This really shouldn't surprise anyone who has been developing Drupal sites for more than a few years. Drupal 8+ (modern Drupal) was considerably more difficult to get started with, and definitely geared toward more experienced developers.&lt;/p&gt;&lt;h2&gt;Another data point&lt;/h2&gt;&lt;p&gt;The &lt;a href="https://www.ironstar.io/devsurvey24/"&gt;2024 Drupal Developer Survey results&lt;/a&gt; were recently announced (thanks to &lt;a href="https://www.ironstar.io/"&gt;Ironstar.io&lt;/a&gt; for the huge effort in making this happen) and while there's a ton of great data in there, I'd like to focus on the &lt;em&gt;Age and Experience&lt;/em&gt; section, which shows that only 9.1% of the 648 respondents were under the age of 30, with no respondents under the age of 21 (insert standard disclaimer about survey size and sample and this not necessarily being a scientific survey.) &lt;strong&gt;This is troublesome.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Maybe we shouldn't be focusing on age, but rather experience. However; the &lt;em&gt;How long have you been working with Drupal&lt;/em&gt; question results didn't make me feel any better. Only 9.6% of the respondents have been working with Drupal for less than 4 years. Yikes.&lt;/p&gt;&lt;h2&gt;Is this as scary as it looks?&lt;/h2&gt;&lt;p&gt;I really don't know the answer to this question. Both of the data points listed above are somewhat anecdotal. The first can be mitigated by the fact that you're probably much less likely to attend a DrupalCon if you're new to Drupal. The second can be accounted for by the assumption that only folks who are experienced enough with Drupal to be on the right mailing lists and/or follow the right social media accounts would know about the survey in the first place.&lt;/p&gt;&lt;p&gt;All that being said, I don't think the &lt;em&gt;trend&lt;/em&gt; that the data is showing us is wrong: Clearly Drupal needs new developers.&lt;/p&gt;&lt;h2&gt;What's the solution?&lt;/h2&gt;&lt;p&gt;Obviously, there's not a single solution. I think there are a few things that we (yes you,) the Drupal community, can do to help entice new developers to Drupal.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Keep Drupal's code modern&lt;/strong&gt; - we do a pretty good job of this, but we can definitely do better by better integrating with front-end developer/designer tools like &lt;a href="https://storybook.js.org/"&gt;Storybook&lt;/a&gt; and whatever the cool Javascript front-end tools are this month (mostly kidding, of course.) These efforts are critical, but these types of solutions tend to be longer-term.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Get more people using Drupal&lt;/strong&gt; - the more people using Drupal, the more likely they'll become invested in the platform and likely to become full-time Drupal developers. We don't need to convert all Drupal users to developers, just a portion. Clearly, Drupal Starshot is a well-placed effort to do this, but again, I think it'll be a bit of time before this has a significant effect.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Create programs that introduce Drupal to students&lt;/strong&gt; - as a Drupal trainer who is active in the community, I've heard about a few attempts at this in local communities, but nothing at scale. This is definitely a long-term goal, and will take time, money and leadership from the &lt;a href="https://www.drupal.org/association"&gt;Drupal Association&lt;/a&gt;, including a hopefully re-imagined and more ambitious &lt;a href="https://www.drupal.org/association/discover-drupal"&gt;Discover Drupal&lt;/a&gt; program.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Entice organizations that build Drupal sites to hire new developers&lt;/strong&gt; - Money (in this case job opportunities) talks. If there are entry-level jobs in Drupal, then new developers will come. Of course, there are plenty of jobs in Drupal, but not the kind of entry level positions that are going to provide an on-ramp for aspiring Drupal developers. If jobs for those new to Drupal aren't there, then the effect of the first two items above will be muted. There is an exciting, thoughtful short-term solution to this called the &lt;a href="https://www.drupal.org/community-initiatives/ixp/"&gt;Drupal IXP community initiative&lt;/a&gt;, which will (hopefully later this year) begin to incentivize organizations to hire new, inexperienced ("IXP") Drupal developers in exchange for Drupal community contribution credits. You can get involved with IXP today by completing &lt;a href="https://docs.google.com/forms/d/e/1FAIpQLSchiKGaVVg5AOmRLDEhRZQAlLCuMfP4WhAPKiQXKaRIgHDibg/viewform"&gt;this survey&lt;/a&gt; to help us figure out which skills a new Drupal developer should have (survey closes June 1, 2024).&amp;nbsp;&lt;/li&gt;&lt;li&gt;Attract good Drupal developer candidates with a leg up &amp;nbsp;- Companies (like &lt;a href="https://www.palantir.net/podcast/palantir-fellowship-program"&gt;Palantir.net&lt;/a&gt;,) &amp;nbsp;who have become involved in scholarship programs, including (the currently dormant) Discover Drupal (which aimed to not just build the Drupal talent pool, but do it with an eye toward diversifying our ranks,) and providing their own training scholarships, initiating internship programs and providing mentors for newbies have had success in building their talent benches over time by training up the people that are a good fit their organizations. It takes a bit of investment and patience, but the returns are usually worth it. &amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;How can you help?&lt;/h2&gt;&lt;p&gt;If this nagging issue of too few new Drupal developers is becoming a growing concern for you, like it is for me; then perhaps you’d like to get involved in one of the above efforts to help move things forward and, maybe even spread the word to help inspire others to get involved as well. &amp;nbsp;&amp;nbsp;&lt;/p&gt;</description>
  <pubDate>Tue, 21 May 2024 08:08:15 -0400</pubDate>
    
    <guid isPermaLink="false">1076 at http://drupaleasy.com</guid>
    <dc:creator>drupaleasy@gmail.com (Michael Anello)</dc:creator></item>
<item>
  <title>cspell and drupalorg CLI: two useful tools for Drupal contrib module maintainers</title>
  <link>https://www.drupaleasy.com/blogs/ultimike/2024/04/cspell-and-drupalorg-cli-two-useful-tools-drupal-contrib-module-maintainers</link>
  <description>
&lt;p&gt;While preparing the recent &lt;a href="https://www.drupal.org/project/markdown_easy"&gt;Markdown Easy&lt;/a&gt; 1.0.1 release, I utilized a couple of tools that I hadn't used before in order to help improve code quality as well as the quality of the &lt;a href="https://www.drupal.org/project/markdown_easy/releases/1.0.1"&gt;release notes&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;cspell&lt;/h2&gt;&lt;img src="https://www.drupaleasy.com/sites/default/files/inline-images/cspell-in-pipeline_0.png" data-entity-uuid="604031a1-dc13-41ad-acd6-73e0ba111ad5" data-entity-type="file" alt="Screenshot of cspell validation in GitLab" width="300" height="378" class="align-right" loading="lazy"&gt;&lt;p&gt;&lt;a href="https://cspell.org"&gt;cspell&lt;/a&gt; is a Node.js spell-checker for code that was &lt;a href="https://www.drupal.org/project/gitlab_templates/issues/3405955"&gt;made available&lt;/a&gt; to the default Drupal GitLab templates in February, 2024. There is a new &lt;em&gt;SKIP_CSPELL&lt;/em&gt; variable that can be set if you'd like your project to completely ignore cspell (it is enabled by default.) Documentation on using cspell in Drupal GitLab pipelines is &lt;a href="https://project.pages.drupalcode.org/gitlab_templates/jobs/cspell/"&gt;available&lt;/a&gt;. I'd wager that most Drupal contrib maintainers will have the need for a custom word list (as I did,) so I took a few minutes to learn a bit more about it.&lt;/p&gt;&lt;p&gt;Cspell uses its default wordlist along with a few add-on dictionaries related to Drupal development (anecdotally, words like "mglaman," "gloop," "skynet," and "vampirize" are included) for checking the spelling of both variable names as well as code comments, but luckily, additional words (and patterns) can be added on a per-project basis in order to achieve a clean cspell report in GitLab pipelines. While there are several methods to add a list of custom words, the way I felt was most elegant (and easy for me to remember in the future!) was to add a &lt;em&gt;.cspell-project-words.txt&lt;/em&gt; file on the project root (in this case, the contrib module is the project.) This file then includes a list of words that cspell should not flag as misspellings. For the Markdown Easy &lt;a href="https://git.drupalcode.org/project/markdown_easy/-/blob/1.0.x/.cspell-project-words.txt"&gt;project&lt;/a&gt;, I went with "Anello," "~commonmark," and "~ultimike" (possibly for obvious reasons.) The ~ modifier indicates those words are case-insensitive (additional modifiers are available.) With that change, Markdown Easy now earns a passing score from the cspell pipeline.&amp;nbsp;&lt;/p&gt;&lt;h2&gt;drupalorg CLI&lt;/h2&gt;&lt;p&gt;&lt;a href="https://github.com/mglaman/drupalorg-cli"&gt;drupalorg&lt;/a&gt; is a command-line interface maintained by (who else?) &lt;a href="https://mglaman.dev"&gt;Matt Glaman&lt;/a&gt;. I actually learned about this tool a few years ago after Matt &lt;a href="https://mglaman.dev/blog/creating-better-drupal-module-release-notes"&gt;blogged about it,&lt;/a&gt; but for whatever reason, I only thought about installing and (finally) using it recently. The general idea is to provide a command line tool for contributors to interact with drupal.org. It's available commands are:&lt;/p&gt;&lt;pre&gt;&lt;code class="language-plaintext"&gt; help                                 Displays help for a command
 list                                 Lists commands
cache
 cache:clear (cc)                     Clears caches
ci
drupalci
 drupalci:list (ci:l)                 Lists test results for an issue
 drupalci:watch (ci:w)                Watches a Drupal CI job
issue
 issue:apply                          Applies the latest patch from an issue.
 issue:branch                         Creates a branch for the issue.
 issue:interdiff                      Generate an interdiff for the issue from local changes.
 issue:link                           Opens an issue
 issue:patch                          Generate a patch for the issue from committed local changes.
maintainer
 maintainer:issues (mi)               Lists issues for a user, based on maintainer.
 maintainer:release-notes (rn, mrn)   Generate release notes.
project
 project:issues (pi)                  Lists issues for a project.
 project:kanban                       Opens project kanban
 project:link                         Opens project page
 project:release-notes (prn)          View release notes for a release
 project:releases                     Lists available releases
tci
travisci
 travisci:list (tci:l)                Lists Travis Ci builds for a Drupal project
 travisci:watch (tci:w)               Watches a Travis CI job
 &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;em&gt;maintainer:release-notes&lt;/em&gt; command is especially helpful to automatically generate release notes for a new version of a Drupal contrib project. Here's how I installed and used this tool to generate the release notes for Markdown Easy 1.0.1:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;I downloaded the &lt;em&gt;drupalorg.phar&lt;/em&gt; to a new ~/sites/drupalorg/ directory on my local, and renamed the file to just &lt;em&gt;drupalorg&lt;/em&gt;.&lt;/li&gt;&lt;li&gt;I then gave execute permission to this file via &lt;em&gt;chmod u+x ~/sites/drupalorg/drupalorg&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I use zsh, so I added the following to my ~/.zshrc file and then restarted my terminal:&lt;/p&gt;&lt;pre&gt;&lt;code class="language-plaintext"&gt;# drupalorg command line tool
export PATH="/Users/michael/sites/drupalorg:$PATH"&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Here's the important part - I then navigated to my local, working copy of the Markdown Easy module. In my case &lt;em&gt;cd ~/sites/d10/web/modules/contrib/markdown_easy&lt;/em&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;I then ran the following command to generate the release notes: &lt;em&gt;drupalorg maintainer:release-notes 1.0.0&lt;/em&gt; &amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;I assumed at first that I should use the current release (1.0.1) as the argument, but after reading the documentation, I discovered that the command will generate release notes &lt;em&gt;from&lt;/em&gt; the tag provided in the argument.&lt;/p&gt;&lt;p&gt;I also originally assumed that the command would take a contrib module's machine name as an argument, but after a few minutes of poking around the documentation, I realized that the command must be run from the module's directory.&lt;/p&gt;&lt;p&gt;You can &lt;a href="https://www.drupal.org/project/markdown_easy/releases/1.0.1"&gt;see the automatically generated release notes here&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Summary&lt;/h2&gt;&lt;p&gt;Both of these tools were rather easy to implement (once I read just a little bit of documentation) and seem like they'll be useful for just about any Drupal contrib maintainer.&amp;nbsp;&lt;/p&gt;</description>
  <pubDate>Tue, 23 Apr 2024 08:34:51 -0400</pubDate>
    
    <guid isPermaLink="false">1073 at http://drupaleasy.com</guid>
    <dc:creator>drupaleasy@gmail.com (Michael Anello)</dc:creator></item>

  </channel>
</rss>