Specbee: How to Efficiently Fetch Drupal Reference Entities in Custom Modules

How to Efficiently Fetch Drupal Reference Entities in Custom Modules Jigish Chauhan 07 Mar, 2023 Subscribe to our Newsletter Now Subscribe Leave this field blank

Fetching Drupal entities and fields in custom modules is a critical part of building complex Drupal applications that require custom functionality. By understanding how to access and manipulate entities and fields programmatically, developers can create powerful and flexible modules that can handle a wide range of data-driven tasks. 

In this article, we will share tips and easy methods on fetching reference entity fields using entity API that will help you simplify your custom module development process.

Image removed.

Getting Back to Basics

What are Entities?

Entities are the most core part of Drupal and it is important to understand what they are and how they work. They are objects that represent anything from users and nodes to taxonomy terms. Each entity has their own properties and can be customized or extended to fit the needs of a website.

What are Fields?

Fields make it easy to manage complex content structures. They are used to collect and display a variety of data like text, images, date and more which can be associated with an entity. For example, a content node can have multiple fields like a title, summary, body, image etc.

What are Nodes?

A node is a basic unit of content in Drupal. It can be a blog post, a product, a news article or an event. Each node has its own properties and can be organized into different types (or content types). A node can be used to create, edit, delete or categorize content.

Drupal Entity Reference Fields

Entity reference fields provide relationships between entities in Drupal. It stores references to another entity (a node, user, taxonomy, etc.). An example of a relationship would be:

  • A taxonomy term associated with a content type or user account.
  • A parent content that references a child content element.

It is commonly used in views and adding view relationships makes it quite easy to use reference fields. But the problem arises when fetching values of the reference fields in your custom module and custom theme.

The common method used to get a referenced entity is very long, so I will take you through a shorter solution.

For example, let's say we have a node object with a reference taxonomy field named field_specbee_term.

How it is usually done:

Method 1:

// $id = Node ID // $field = 'field_specbee_term'; // field name for term reference field $node = Drupal\node\Entity\Node::load($id); // To get first value from multivalue field used first() method. $reference_item = $node->get($field)->first(); // \Drupal\Core\Entity\Plugin\DataType\EntityReference. $entity_reference = $reference_item->get('entity'); // \Drupal\Core\Entity\Plugin\DataType\EntityAdapter. $entity_adapter = $entity_reference->getTarget(); // \Drupal\Core\Entity\EntityInterface. $referenced_entity = $entity_adapter->getValue();

Here, $referenced_entity is the referenced entity object.

Now alternatively, instead of using the above tedious method 1, here is an easier way of doing it.

Method 2:

$referenced_entity = $node->field_specbee_term->entity;

However, if you want to fetch all the values from the multivalue field, Method 2 will not work.

For loading the entire list of reference entities as objects will use the below method which is a type of array.

$referenced_entities = $node->get('field_specbee_term')->referencedEntities();

This method can be used for image reference as well. 

Let’s see an example of how we can get an image URL from a node with a specific image style.

// $fid = File ID $file = Drupal\file\Entity\File::load($fid); // Alternatively you can use direct node field. $file = $node->field_image->entity; $image_uri = $file->getFileUri(); // Get origin image URI. $style = ImageStyle::load('thumbnail'); // Load image style "thumbnail". $uri = $style->buildUri($image_uri); // Get URI. $url = $style->buildUrl($image_uri); // Get URL.

Now let’s understand how to retrieve any field values and which method is preferred for different scenarios.

// $id = Node ID $node = Node::load($id); $node->get(FIELDNAME)->value; // ALL VALUES - WON'T WORK IN REFERENCE FIELDS $node->get(FIELDNAME)->getValue(); // ALL VALUES $node->get(FIELDNAME)->getString(); // ALL VALUES

1. value :

This will return the actual value of the field but it will not work for any referenced field. 

2. getValue() :

When you need to get values of a field, whether it is a single-value or multi-value field, you can use this method. It will return an array of field values. 

3. getString() :

This method will return the value of a single-value field, and if it is a multi-valued field it will return comma-separated values.

Note: Sometimes when using getString(), if there is no value present, it will throw an error. This can be tackled by using the hasvalue() function before using the getString() function.

Final Thoughts

Fetching Drupal reference entities is an essential skill for Drupal developers. With the Entity API, you can easily load and manipulate entities and their fields, making your custom module development process more efficient and streamlined. However, if you need expert assistance with Drupal development, our team of experienced developers is here to help. Contact us today to learn more about our Drupal development services and how we can help you build powerful Drupal websites and applications that meet your unique needs.

Author: Jigish Chauhan

Meet Jigish Chauhan, Technical Architect, who’s fond of photography. He dreams of traveling to the playground of Europe, Switzerland, and loves to embrace the nature around him.

Email Address Subscribe Leave this field blank Drupal Drupal Module Drupal Development Drupal Planet

Leave us a Comment

 

Recent Blogs

Image Image removed.

How to Efficiently Fetch Drupal Reference Entities in Custom Modules

Image Image removed.

Finding Balance - Santhosh Kumar's Parallel Worlds

Image Image removed.

Migrate to Drupal 9 (or 10) Without Losing Your Hard-Earned SEO Ranking

Want to extract the maximum out of Drupal? TALK TO US

Featured Case Studies

Image removed.Image removed.

Upgrading the web presence of IEEE Information Theory Society, the most trusted voice for advanced technology

Explore
Image removed.Image removed.

A Drupal powered multi-site, multi-lingual platform to enable a unified user experience at SEMI

Explore
Image removed.Image removed.

Great Southern Homes, one of the fastest growing home builders in the US, sees greater results with Drupal

Explore
View all Case Studies

ComputerMinds.co.uk: Drupal 10 upgrade: Custom code upgrades

Image removed.

This one is entirely on us, we wrote the custom code, which makes us responsible for maintaining it.

The upgrade status module gives us a nice report of each custom project and what changes it thinks are required to bring the code up to date to work with Drupal 10.

We really don't have a lot of custom module code, and the code that we do have is very simple, standard Drupal 8/9/10 stuff, so there are a couple of calls to taxonomy_term_load_multiple_by_name to remove, and an accessCheck to add to an entity query, but other than that our custom module code looked fine.

Our custom theme however, is a different story: we have some usages of jQuery once to remove, and we have a lot of custom Twig PHP classes that are extending deprecated classes. Nothing show-stopping, but a few things to do worth covering in more detail.

jQuery once

The jQuery once plugin has gone from core in Drupal 10, so we need to upgrade our javascript that is using it to use the vanilla javascript alternative that ships in Drupal 9: the once plugin. This is simple enough, we can rewrite code like this:

(function($) { Drupal.behaviors.smoothScroll = { attach: function (context, settings) { $('a[href*="#"]:not([href="#"])').once('smoothscroll').click(function() { if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) { var target = $(this.hash); target = target.length ? target : $('[name=' + this.hash.slice(1) +']'); if (target.length) { var offset_height = target.offset().top; $('html, body').stop().animate({ scrollTop: offset_height , }, 1000); return false; } } }); } }; })(jQuery);

Into code like this:

(function($, Drupal, once) { Drupal.behaviors.smoothScroll = { attach: function (context, settings) { var elements = once('smoothscroll', 'a[href*="#"]:not([href="#"])', context); $(elements).click(function() { if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) { var target = $(this.hash); target = target.length ? target : $('[name=' + this.hash.slice(1) +']'); if (target.length) { var offset_height = target.offset().top; $('html, body').stop().animate({ scrollTop: offset_height , }, 1000); return false; } } }); } }; })(jQuery, Drupal, once);

And then we need to tweak the definition of our library in the corresponding .libraries.yml file to remove the dependency on core/jquery.once and add one on core/once.

Twig changes

As mentioned previously the site was originally built in Drupal 8, which meant using Twig version 1, so there are plenty of deprecations to take care of to get the codebase ready for Drupal 10.

This is largely because we have a slightly strange setup in that we're using an early version of Emulsify to build our theme. Most importantly for this article it means that our theme contains quite a few twig functions like this:

<?php /** * @file * Add "getUniqueId" function for Pattern Lab. * * Brings the useful Drupal Html::getUniqueId function in. */ use Drupal\Component\Utility\Html; /** * Create the function we want to be able to call. * * Our function will be passed $context and then any other values provided. */ $function = new Twig_SimpleFunction('getUniqueId', function ($context, $string) { if (is_string($string)) { // Must cover the Drupal context AND the PatternLab context. if (class_exists('Drupal')) { return Html::getUniqueId($string); } else { return $string; } } else { return $string; } }, ['needs_context' => TRUE, 'is_safe' => ['html']]);

This can trivially become (changing the base class that is extended):

<?php /** * @file * Add "getUniqueId" function for Pattern Lab. * * Brings the useful Drupal Html::getUniqueId function in. */ use Drupal\Component\Utility\Html; /** * Create the function we want to be able to call. * * Our function will be passed $context and then any other values provided. */ $function = new \Twig\TwigFunction('getUniqueId', function ($context, $string) { if (is_string($string)) { // Must cover the Drupal context AND the PatternLab context. if (class_exists('Drupal')) { return Html::getUniqueId($string); } else { return $string; } } else { return $string; } }, ['needs_context' => TRUE, 'is_safe' => ['html']]);

The codebase has around 20 usages of deprecated Twig classes, however the task looks simple enough and there's nothing particularly tricky to do here, simply tweak the classes used per the deprecation messages in the older classes. There are automated tools that'll make these changes for you, but to be honest, there aren't that many changes to make and I'm keen to get eyes on the codebase more generally and get a feel for what we have in it!

All done

So that's it for Custom code and theme. We had actually been pretty good at:

  • Not writing custom code unless we had to.
  • If we did write custom code, not using already deprecated code.
  • Going back periodically and remediating new deprecations.

Which then makes these changes pretty straightforward. 

Aside: I'll just note that we have a lot jQuery style JavaScript in our codebase....mostly because we've been around for a while and learned JavaScript with jQuery, so it's just too easy for us to still write with jQuery everywhere. However, we know that we need to get to a place where we don't need jQuery and we'll get there, but we'll need to do some internal training on that and then go back through our code and re-write it without jQuery. Maybe I'll write an article about that too one day!

Salsa Digital Drupal-Related Articles: BenefitMe — coding NZ’s Social Security Act (Rules as Code)

Image removed.Overview  Digital Aotearoa Collective’s  challenge The Digital Aotearoa Collective (formerly GovZero Aotearoa) wanted to use Rules as Code (RaC) to code NZ’s Social Security Act. This was an important project for the collective, which aims to address injustice and improve wellbeing in Aotearoa New Zealand. Digital Aotearoa Collective’s transformation Salsa donated NZ$20,000 and three team members (for a total of 24 hours a week for 11 months) to help build the first iteration of BenefitMe . Working with other key members, we started with rules analysis, before splitting into two teams: one focused on service design and building the frontend, and one focused on the OpenFisca rules coding.  In the last 6 weeks of the project, Salsa also contributed additional Drupal resources.

Salsa Digital Drupal-Related Articles: The CivicTheme 1.4 release

Image removed.What’s in the CivicTheme 1.4 release? The recent CivicTheme 1.4 release includes a major review of all components and over 100 bug fixes. Some of the bigger changes include: New Event content type  Standardisation across all CivicTheme cards New support for external links  Updates to filters for automated lists Automatically generated component pages for visual regression testing New documentation The release of CivicTheme on drupal.org New Event content type The new Event content type provides event-specific fields. For example, time and date, and location (with the ability to embed a map URL or add in an address). Event cards can then link to this content.  Standardisation across all CivicTheme cards CivicTheme boasts an extensive range of different cards.

ImageX: Let’s Roll: How to Use Video to Engage and Inform Your Audience

Let’s Roll: How to Use Video to Engage and Inform Your Audience amanda Mon, 03/06/2023 - 21:19

Whether you’re scrolling through your social media feed or researching the latest marketing techniques, video content is ubiquitous. And for good reason. Video is an effective way to capture your attention and keep you coming back for more — all while entertaining and educating you in the process. 

But do you know how to effectively incorporate video on your organization’s website?

Video is undoubtedly an invaluable tool that distinguishes your brand. But there’s a difference between producing valuable content that cuts through the noise and simply adding to an already cluttered digital landscape. 

To provide a positive experience for your users and achieve your strategic objectives, you need to understand why using video is important and learn how to do it well. Let’s break it down.

Video Offers a Powerful User Experience

As users read less content word for word, video steps in as a tell-all tool. Through visuals, users can quickly digest content without having to slog through (or completely skip) long walls of text.

Video gets straight to the point — and to the heart — of the message you’re trying to get across. An incredible storytelling tool, video connects you to your audience. It evokes and underscores moods, ideas, and information in compelling and authentic ways through visuals, sounds, and imagery.

More than that, video is an essential way to offer accessibility-friendly content. Through closed captions and transcripts, you can offer a quality experience your entire audience can enjoy

Users can also search for answers to their questions via video. How many times have you searched YouTube (or even TikTok) to learn something new? People absorb information in different ways and need multiple avenues to promote learning — your users included.

Finally, video conveys the feeling and culture of your brand in a matter of seconds. It can show off a collective spirit or attitude without saying a word. And that means if you want your audience to feel the ethos of your brand, using video is a powerful way to convey that. 

Using Video Can Drive Traffic to Your Website 

Perhaps you’ve already created a video (or an entire library of them), but you find they’re not getting views and you’re not sure how to promote them effectively. How can you make sure users actually see your videos and come to your website as a result? 

Most brands choose to host their videos on a third party (such as YouTube, Vimeo, or Wisteria) for two reasons. 

  1. Video takes up space on your site. Hosting your videos on another site means ​​you're not saving all those video files on your server. This keeps your website running quickly and optimally.
     
  2. SEO benefits. As long as the video is linked back to the website, your video can be a great way to drive traffic to your site. Using a third-party site like YouTube (which is the second-largest search engine behind Google) also gives your brand more visibility and another way to be discovered.  

As you look for ways to get eyes on your content, don’t forget to use your own social channels. Right now that means TikTok and Instagram. Share your videos on the sites your target audience is likely to be on, and encourage users to share them.

Think strategically about how you can repurpose or reuse your content, like breaking videos down into teaser snippets to capture attention.

Two Video Formats to Incorporate Into Your Marketing Website

For marketing purposes, there are two main types of videos you can use to enhance your users’ experience: ambient and long form. It’s wise to use both different types of videos on your site based on the message you want to communicate and the goal you're trying to achieve.

Ambient videos are shorter and set the tone or feeling of a brand. They lay the groundwork for the story you’re trying to tell. For example, ambient video could be drone footage of a university campus or footage of people in a meeting to reflect their company’s culture. In other words, ambient video gives users a feel for what your brand is all about — sans dialogue.

Long-form videos tend to be more informative and provide more value. They often serve a specific purpose, such as showing users how to complete a complex task. This is especially helpful for visual learners. How-to videos can be extremely effective in reducing customer support inquiries and increasing conversions.

Image removed.Use different types of videos on your site to complement the message you want to communicate and the goal you're trying to achieve.

Dos and Don’ts of Using Marketing Videos on Your Website

Simply adding video content to your marketing plans isn’t enough. You need to be strategic and think through what you want your videos to achieve. Furthermore, there are plenty of best practices and nuances to consider that should inform your strategy. Here are a few recommendations.  

 

Do: Relax and go slow. Think about what’s achievable. You don’t need to hit the ground running with high-quality videos at every touchpoint. If you lack time, good content, or the budget to produce the robust video library you want, it’s okay. You have options. What matters most is that you build content to support the story that you're sharing. 

 

For example, you can use a static image that you can later swap out for an ambient video. Or, consider producing smaller snippets that you can use on social media to drive traffic to your channel until you build your content library.

 

Don’t: Neglect accessibility standards. Avoid elements like autoplay, modals, or overlays. because they take ‌control away from the user. And when it comes to upholding accessibility standards, taking control away is exactly what you want to avoid. 

 

A modal is a window that appears in the middle of the video and displays a specific message or image. An overlay is a transparent layer of branding or an interactive element that appears on the video. These features are easy enough to interact with for a user with a mouse or trackpad but are inaccessible to those who rely on their keyboard or other assistive technology.

 

Do: Know when to refresh content or keep it evergreen. Keeping videos relevant and accurately reflecting your message should always be top of mind. But you may not have to swap out videos as often as you think. The key is to look at your audience and think about what’s likely to compel them to convert. If you have a high number of returning visitors to your website, you should consider updating your content to keep things fresh. By contrast, if you get new visitors on a more cyclical, spread-out basis,‌ your video content can last longer. 

 

Don’t: Forget to measure the value of your video content. First, consider your video in the overall user journey. For example, if there’s a video touting a particular program deep within your site, you could measure success by looking at the number of conversions you receive on the corresponding call to action. For more straightforward feedback, incorporate surveys onto your site. Ask if the video achieved your objective for the user. This way you can learn what worked and what needs work. 

Image removed.Consider best practices to guide how you approach your strategy.

Make the Most Out of Your Website Experience With Video

Video is one of the most powerful marketing tools available. It increases engagement with your users and connects your brand to a larger audience. No wonder it’s everywhere. 

 

As you seek ways to set yourself apart, embrace video and all its strategic and creative possibilities. After all, you have a great story to tell — it’s time to tell it. 

/sites/default/files/styles/original/public/2023-03/sirisvisual-IcwAKUhNGXs-unsplash_0.jpg.webp?itok=gi2-qGlK Feature as an event Off Service Category Strategy Content Strategy Storytelling Digital Marketing IsGated 0 IsDownloadable 0

Talking Drupal: Talking Drupal #389 - Headless - Fact or Fiction

Today we are talking about Headless and if it’s really all it’s cracked up to be with Martin Anderson-Clutz.

For show notes visit: www.talkingDrupal.com/389

Topics
  • What is headless
  • What started you writing the blog post
  • Where does headless make sense
  • Does headless perform better than Drupal
  • Are APIs always important
  • How does progressive decoupling work
  • Where does headless not make sense
  • Are people putting too much faith in headless
  • What is the future of CMSs
Resources Guests

Martin Anderson-Clutz - @mandclu

Hosts

Nic Laflin - www.nLighteneddevelopment.com @nicxvan John Picozzi - www.epam.com @johnpicozzi Jacob Rockowitz - www.jrockowitz.com @jrockowitz

MOTW Correspondent

Martin Anderson-Clutz - @mandclu JSON:API Search API Allows your headless Drupal site to also provide a search service.

Promet Source: How to Leverage Load Testing to Scale up a Drupal Site

Load-testing is an essential exercise to methodically test a Drupal site to ensure it can handle a high volume of traffic without encountering performance issues. In a previous post, we discussed how Locust can be used to simulate concurrent user requests and measure site performance.  This is a review of some additional load-testing solutions.