Why Won’t If “Drupal\node\NodeForm” Work?

I need to determine what kind of object a form is. When I dpm the class, it says Drupal\node\NodeForm . So, the following should work:

if (get_class($form_state->getFormObject()) == "Drupal\node\NodeForm") {

But it does not! I’ve been forced to do stupid things like this:

if (get_class($form_state->getFormObject()) != "Drupal\node\Form\DeleteMultiple") {

DUH MOMENT! I finally figured it out today. VS code highlighted this out of the above first line of code:


DUH! PHP is reading this as a new line! Wow.

New code that works is:

if (get_class($form_state->getFormObject()) == "Drupal\\node\NodeForm") {

This does make sense now that I think about it!

Used Drupal 8 Functions That Don’t Work In Drupal 9

Not really a problem/solution post.

We’re upgrading to Drupal 9! Let me tell you, what a crock that Upgrade Status module is. It’s a trap! It does so little it’s almost laughable. It primarily told me that all my .info.yml files just needed core_version_requirement: ^8.8 || ^9 and they were good.

That’s not true. It’s a scam. We upgraded to D9 and things broke all over the place. Symphony has been giving us the most trouble. Sometimes the error will tell you what to change it to, most of the times not.

Anyway, here’s a blog post of stuff I had to figure out how to change on my own since simply googling for it won’t yield the fix you’re looking for.


If you’re trying to check if an alias exists like this:

if (\Drupal::service("path.alias_storage")->aliasExists($node_path, "en")) {

That function doesn’t exist anymore. It takes more to figure this out now; especially since the return of this isn’t true or false; it’s the fucking path.

Your new code for this is:

$possible_node_alias = \Drupal::service("path_alias.manager")->getPathByAlias($node_path);
// is this path a node path? if so, it's the equivalent of aliasExists returning true
if (str_starts_with($possible_node_alias, "/node/") && is_numeric(str_replace("/node/", "", $possible_node_alias))) {

In the if, that’s where it would be true if the alias is in use.


This one was a little easier to track down.

Before it was:

\Drupal::service("path_alias.manager")->save("/node/" . $node_id, $archive_url, "en");

Now it’s:

$path_alias = \Drupal\path_alias\Entity\PathAlias::create(array("path" => "/node/" . $nid, "alias" => $archive_url));

Yay for more lines of code that do the same fucking thing as before!

I’ll update this blog post if there are any more I get stuck on and google doesn’t have the answer.

Installing Library Using Drupal & Composer

The instructions on drupal.org on how to install a library using composer suck. Or maybe I’m just doing it wrong? I don’t know. But it happened again. I need another library from some outside source.

I thought I just needed to modify my composer.json file and run composer install and it was good but I forgot the other step.

You also need to run composer require and whatever you named your library.

Here’s the code from my composer.json:

			"type": "package",
			"package": {
				"name": "addon/youtube",
				"version": "2.1.18",
				"type": "drupal-library",
				"dist": {
					"url": "https://download.ckeditor.com/youtube/releases/youtube_2.1.18.zip",
					"type": "zip"

Save the file. Then run:

$ composer require addon/youtube

That should do it. Maybe run another $ composer install so everything is good.

Background Opacity Affecting Text Opacity

Why do I always forget this? Hopefully I’ll remember why this happens this time with a simple blog post!

When you add opacity to a div, it affects the text opacity as well. Ex.

Your CSS is something like this:

.header_background {
	opacity: .8;
	color: #FFFFFF;
	background-color: #475260;

Do not just use opacity like that. Use it like this:

.header_background {
	color: #FFFFFF;
	background: rgba(47, 52, 60, .8);

Now it’s nice:

Get Human-Readable Name Of Media Bundle In Drupal 8

I need to get the label/name of the bundle of a media entity for a preprocess. Unfortunately, the following code to get the label of the bundle does not work for media:


I’ve tried to google various things but nothing came up that was helpful. The code $current_entity->bundle() works to get the machine name of the bundle; but how can we get the human-readable name of the bundle?

The solution requires something really stupid. If anyone has a method I can call instead, more than welcome to comment!


That’s really stupid!

By the way, just to remember, how to get the entity type you can use:


I think this ticket could possibly make the solution easier: https://www.drupal.org/project/drupal/issues/969180. All entities should use the same methods to get the type, bundle, label, etc. Also, label shouldn’t be ambiguous. It should either be for the title of the entity or for what the entity actually is.

Change Theme To Admin For Custom Module Page

I’ll forgo the PROBLEM/SOLUTION in this one since it’s so quick.

I wanted to make the pages (forms) of a custom module I was creating use the admin theme instead of the public facing theme. Turns out it was really easy.

In the .routing.yml file, add the following:

    _admin_route: TRUE

So a cleaned-up example of the yml looks like this:

  path: '/whatever/your/path/is'
    _form: '\Drupal\module_name\Form\WhateverYourFormIs'
    _title: 'Page/Form Title'
    _role: 'authenticated'
    _admin_route: TRUE

Need this in my arsenal.

Unexpected Error With Form Controller

This is going to be a stupid one but I’m going to blog about it anyway.

While setting up a new custom module for Drupal 8, I need to set up a form. Since I’ve done this many times before, I copied and pasted stuff from another module which worked.

While renaming things and putting things in the right spot, when I went to test the form I got the following error:

TypeError: Argument 2 passed to Symfony\Component\HttpKernel\Event\FilterControllerEvent::__construct() must be callable, object given, called in /var/www/docroot/vendor/symfony/http-kernel/HttpKernel.php on line 138 in Symfony\Component\HttpKernel\Event\FilterControllerEvent->__construct() (line 32 of /var/www/docroot/vendor/symfony/http-kernel/Event/FilterControllerEvent.php)

Google was completely useless! It seems I was the only one in history to get this.

Considering how fucking burnt out I am without having a break in more than a year, I completely missed it. The solution was so simple.

I guess I had renamed my file wrong in the /module_name/src/Form/ folder. After renaming everything again to bullshit, I found I guess that was my issue.

I’m filling this under silly mistakes that I hope I never make again! #stupidjanny

How To Determine If You’re On A Node In Drupal 8

Preamble: If you don’t know how yet to embed media into Drupal, I recommend looking at how to embed stuff into Drupal 8 by Lullabot. It doesn’t go over everything (since you definitely need custom stuff) but it’s a good start.

We are using Entity Embed along with a few other contributed Drupal modules to be able to insert media into the WYSIWYG. I created a custom module in order to do this. I use hooks such as
HOOK_preprocess_entity_embed_container and HOOK_form_entity_embed_dialog_alter in order to get this functionality to work. I also have a template which outputs the media. Images output as img, files output as a link with file name and opens in a new window.

We were now asked to attach a content type in our content. Instead of creating a field, I wanted to be able to insert this content into the WYSIWYG.

After modifying my custom module which will render the entity, I ran into an interesting issue. I did not want to render the full entity in the WYSIWYG. First, it would render the whole thing and it would not put in the stuff we put into our .theme file. It didn’t look right.

I only want the entity to be rendered on the node screen (i.e. in our public facing theme… when it’s actually on a node).

The template in our custom module renders it in both the WYSIWYG and on the “node” side. So… how do I get it to only render on the “node” side?

There are several states when it’s on the “node” side. I’m adding a variable in HOOK_preprocess_entity_embed_container which will tell the template to render the entity or else just say the name of the node it’s inserting. Just using
$node_info = \Drupal::routeMatch()->getParameter("node"); doesn’t work. $node_info is NULL on preview. However, if you also do:

$node_info = \Drupal::routeMatch()->getParameter("node");
if (empty($node_info)) {
	$node_info = \Drupal::routeMatch()->getParameter("node_preview");

then a:

if (gettype($node_info) == "object") {
	$variables["node_render"] = true;

which will tell the template to render the entity via the {{ children }}. So far this code hasn’t triggered any PHP or Drupal errors or warnings (fingers crossed).

Not sure if I’ll need this again but it’s probably handy to have since we are also using workbench, have nodes in draft, and have a preview.

Hook “More” Link In Views For Drupal 8

I needed a way to modify the Custom URL in the Pager for the More link for Views. I added a Contextual Filter so that the particular display can be put onto any page and it will display items from the current office.

This URL needs to be dynamic and change depending on where on the site this view is placed.

What Views needs here is some tokens!

I looked into hooking “container” but that seems messy as I’m not sure where else it’s used. It’s doable that way but I primarily tried to look at the view.

In my preprocess, THEME_views_pre_render, I tried to dig further into the ViewsExecutable class. It turns out, the display_plugin method was what I was looking for.

Here’s some of my code:

function THEME_views_pre_render(\Drupal\views\ViewExecutable $view) {
	// target your view and display
	if (($view->id() == "my_view") && ($view->current_display == "my_display")) {
		// this is just what's actually in the field to begin with... i.e. "success-story" in my screen shot above
		$ending_part_of_uri = $view->display_handler->getOption("link_url");

		// call a function or whatever to get the part of your uri
		$starting_part_of_uri = _THEME_function_to_dynamically_get_URI();

		// now set the link to whatever
		$view->display_handler->setOption("link_url", $starting_part_of_uri . $ending_part_of_uri));

Turn Off Caching For Paragraph In Drupal 8

I had an interesting one. I’ve blogged about Drupal 8 caching before and how annoying it is. I’ve solved the issue of caching custom blocks and caching on a specific view.

But what about paragraphs?

We needed to make content in a paragraph dynamic and change on every page load. We want a random item to display from an array of items. I noticed that this happened when the user was logged in but not anonymously. I don’t know if I have caching turned off for authenticated users or what.

After some digging, I couldn’t find a good way to turn caching off with config and I wasn’t about to turn caching off for every page. I also couldn’t find a way to do it in the preprocess of the paragraph.

There’s kinda like a kill switch, I guess. I think we should probably use this sparingly as there’s a reason why Drupal caches so much (it is a HUGE footprint!).

I put this code inside my preprocess function of my paragraph in my .theme file:


It took me a bit to find it as googling around doesn’t yield the results I’d expect.

And note, this is how I solved it for the mean time… This way might not be the best but it works. Until I am told that this is very dangerous or whatever and we find a better way, this is what I did.