Creating a node in code
This is a brief note about creating a node in code,.
Table of contents
Introduction
The code in this tutorial presents a simple example of how to create a node in PHP code.
We are going to do it by creating a custom module with a controller to create the node. The custom module to create the node in code shall be named “Hello Node”, with the machine name “hellonode”.
You start by creating a directory with the name “hellonode” in the
directory modules/custom
below the webroot.
Create hellonode.info.yml
Move into the cirectory you just created, and create the
file hellonode.info.yml
to hold information about the
custom module:
name: Hello Node description: Custom module to demonstrate how to create a node programatically. core_version_requirement: ^8.8 || ^9 || ^10 type: module package: custom
This is the minimum required to have a custom module. As soon as this has been created, you should be able to navigate to
and see this custom module.Create a controller
First, create a directory to hold the controller, the change into that directory, and finally create an empty file named "HelloNodeController.php":
$ mkdir -p src/Controller $ cd src/Controller $ thouch HelloNodeController.php
Use your favourite text editor to put the follwing PHP code inside "HelloNodeController.php":
<?php namespace Drupal\hellonode\Controller; use Drupal\Core\Controller\ControllerBase; use Drupal\node\Entity\Node; /** * Creates a node in code. */ class HelloNodeController extends ControllerBase { /** * Creates a node. */ public function createhello() { $article = [ 'title' => 'Hello, World!', 'body' => 'This is a node created in code.', ]; $newArticleNode = $this->createArticleNode($article); $element = [ '#markup' => '<p>' . t('Created new article node.') . '</p>', ]; return $element; } protected function createArticleNode($article) { $new_article = Node::create(['type' => 'article']); $new_article->set('title', $article['title']); $new_article->set('body', [ 'value' => $article['body'], 'format' => 'basic_html', ]); $new_article->enforceIsNew(); // Set status to unpublished. $new_article->status = 0; $new_article->save(); return true; } }
Custom fields added to a content type using the GUI will have a
human label and a machine name. The machine name will start
with field
, usually followed by a lowercase ASCII
version of the project name and field label separated by underscores.
When using the wrapper, values can be assigned to the machine name. Example:
$new_article->set('field_hellonode_myfieldname', 'value');
Create a route
Finally create the file hellonode.routing.yml
to make the controller accessible from the GUI.
hellonode.hello_node: path: '/hellonode' defaults: _controller: '\Drupal\hellonode\Controller\HelloNodeController::createhello' _title: 'Hello world' requirements: _permission: 'access content'
If your site's name is "example.com", visiting the following URL: "https://example.com/hellonode" will create a new node.
Final word
Alternative method, using dependency injection: DO: Dependency Injection example.
Last update: 2023-05-09 [gh].