How to do some basic code things in Drupal 8

Here goes a few snippets that will help you to start with Drupal 8.

Load a Node

use Drupal\node\Entity\Node;

$node = Node::load($nid);

Load Multiple Nodes

use Drupal\node\Entity\Node;

$nodes = Node::loadMultiple($nids);

Get the node from a request, previously menu_get_object

$node = Drupal::request()->attributes->get('node');

Get the title of a node

$node = \Drupal\node\Entity\Node::load($nid);
$title_field = $node->get('title');
$title = $title_field->value;

Or something more simple

use Drupal\node\Entity\Node;

$title = Node::load($nid)->get('title')->value;

Get the Node Type

$node = Node::load($nid);
$node->getType();

Get the value of a field from the node

For a textfield will be something like this

$node->get('field_my_text’)->value;

For a link field something like this

$node->get('field_blog_url')->uri;

For the body you have things like

$node->get(‘body’)->summary;

In the case of a geo field

$node->get(‘field_geo_location’)->lat;
$node->get(‘field_geo_location’)->lon;

Depending on the structure of the field you will get the values in the right property, you can take a look to the field table definition to know what can you use after the get.

That is to get the first value of the field, if you have a multivalued field the things changes a little bit.

The method getValue() is used to get an array:

   $array = $user->get('field_value')->getValue();

If you want to get a skalar use:

   $value = $user->get('field_value')->value;

Both methods look similar, but do different things:

The method getValue() is to get the complete array of a field, which is quite useful for multiple value fields or multiple properties.

The method ->value gets the property with the same name. Most standard fields use value as the main property, other examples are target_id for entity references, lat / long for geofields, etc.

Render a node view, previously node_view

For a single node

$node = Node::load($nid); 
 $view_builder = \Drupal::entityTypeManager()->getViewBuilder($node->getEntityTypeId());
 $node_view = $view_builder->viewMultiple($nodes, 'teaser');

For multiple nodes at once

$nodes = Node::loadMultiple($nids); 
 $view_builder = \Drupal::entityTypeManager()->getViewBuilder(reset($nodes)->getEntityTypeId());
 $nodes_views = $view_builder->viewMultiple($nodes, 'teaser');

In both cases you can call directly to render to get the html output or in twig just use

{{ node_view }}

You can still do node_view and render but that is calling to deprecated flagged methods, will change some day.

Load a taxonomy term by the name

$terms = taxonomy_term_load_multiple_by_name(‘My Term’);

Note: will return an array of matched terms.

Get the term id

$tid = $term->get('tid')->value;

Entity Query

Basic usage to get all the nodes that are related to a taxonomy term

$nids = \Drupal::entityQuery('node')
 ->condition('status', 1)
 ->condition('type', 'blog_post')
 ->condition('field_blog_category', $tid)
 ->sort('nid', 'DESC')
 ->range(0, 10)
 ->execute();

Get the alias of a path

$url_alias = \Drupal::service('path.alias_manager')->getAliasByPath('/taxonomy/term/111’);

Some Magic in Twig

Render the node title

 {{ node.title.value }}

Build the url of the node

{% set node_url = path('entity.node.canonical', {'node': node.id}) %}

Or for other kinds of entities

// Link to the default frontpage content listing view:
<a href="{{ path('view.frontpage') }}">{{ 'View all content'|t }}</a>

// Link to a specific user profile page:
<a href="{{ path('entity.user.canonical', {'user': user.id}) }}">{{ 'View user profile'|t }}</a>

// Link to a view, and throw in some additional query string parameters:
<a href="{{ path('view.articles.page_1', {'page': 2}) }}">{{ 'Go to page 2'|t }}</a>

// Link to a view and pass in some arguments to the view:
<a href="{{ path('view.recent_articles_by_author.page_1', {'arg_0': user.field_display_name.value|drupal_escape }) }}">{{ 'See all the articles written by'|t }} {{ user.field_display_name.value }}</a>

Get the current Path Url

  $current_url = Url::fromRoute('<current>');
  $path = $current_url->toString();

Print the creation date formatted

 {{ node.createdtime|format_date('long') }}

This is nasty, don’t do it at home, print the body after some filters

 {% set body = node.body.value | striptags | raw %}
 {{ body | length > 1000 ? body | slice(0, 1000) | raw ~ '...' : body|raw }}

Have more useful snippets ? Leave me a comment.

Get the current user Object

In Drupal 8 the global variable $user is gone, now you have to do something like this to retrieve the User Object.

   //use Drupal\user\Entity\User;
    $userCurrent = \Drupal::currentUser();
    $user = \Drupal\user\Entity\User::load($userCurrent->id());
    $name = $user->getUsername();

2 thoughts on “How to do some basic code things in Drupal 8

Leave a Reply to Améziane Cancel reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.