An Entities type is a type which represents many items in drupal8 which includes items as follows :
During the development of your application you will need to perform some action on these entities.
we will expand the module functionality by adding a new form that will be searched for a node given a title entered by the user, it will also display elements of that node in a window.
In our src\form directory we will create a new file named as ” HelloModalForm.php“.
add the following code in this file.
<?php
//include helloform
namespace Drupal\hello\Form;
//include formbase class
use Drupal\Core\Form\FormBase;
//include formstateinterface
use Drupal\Core\Form\FormStateInterface;
//include AjaxResponse library
use Drupal\Core\Ajax\AjaxResponse;
//include core Ajax library
use Drupal\Core\Ajax;
//include OpenModalDialogCommand library
use Drupal\Core\Ajax\OpenModalDialogCommand;
class HelloModalForm extends FormBase
{
// buildForm function with multiple arguments.
public function buildForm(array $form, FormStateInterface $form_state)
{
$form['#attached']['library'][] = 'core/drupal.dialog.ajax';
$form['node_title'] = array(
'#type' => 'textfield',
'#title' => $this->t('Node\'s title'),
'#description' => $this->t('Enter a portion of the title to search for'),
);
$form['actions']['#type'] = 'actions';
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => $this->t('Search'),
'#ajax' => array(
// here we add Ajax callback where we will process
'callback' => '::open_modal',
// the data that came from the form and that we
// will receive as a result in the modal window
),
);
$form['#title'] = 'Search for Node by Title';
return $form;
}
public function getFormId()
{
return 'hello_modal_form';
}
//validateForm() function for validation to fields.
public function validateForm(array &$form, FormStateInterface $form_state) {
}
//submitForm used for submission of form
public function submitForm(array &$form, FormStateInterface $form_state) {
}
public function open_modal(&$form, FormStateInterface $form_state)
{
$node_title = $form_state->getValue('node_title');
$query = \Drupal::entityQuery('node')
->condition('title', $node_title, 'CONTAINS');
$entity = $query->execute();
$key = array_keys($entity);
$id = !empty($key[0]) ? $key[0] : NULL;
$response = new AjaxResponse();
$title = 'Node ID';
if ($id !== NULL) {
$content = '<div class="test-popup-content"> Node ID is: ' . $id . '</div>';
$options = array(
'dialogClass' => 'popup-dialog-class',
'width' => '300',
'height' => '300',
);
$response->addCommand(new OpenModalDialogCommand($title, $content, $options));
} else {
$content = 'Not found record with this title <strong>' . $node_title .'</strong>';
$options = array(
'dialogClass' => 'popup-dialog-class',
'width' => '300',
'height' => '300',
);
$response->addCommand(new OpenModalDialogCommand($title, $content, $options));
}
return $response;
}
}
?>
update the routing file with following code :
hello.modal : path : 'hello/modal' defaults : _form: '\Drupal\hello\Form\HelloModalForm' requirements : _access : 'TRUE'
After updation of this file now update the “hello.links.menu.yml” file to create a new menu item for the modal window. Add the following to the end of the file :
hello.modal : title : Hello Modal Form menu_name : main route_name : hello.modal expanded : TRUE weight: 130
saving all go to dashboard :
create a new node by visiting Content == > Add Content ==> Article.
Enter the full title in the node’s title text box of the new form and click the Search button.
In a development phase in which you need to creating a custom module that may be on a specific content type being present.
Here we will create a specific content type named as ” customer“.
Customer Content Type that will provide us a “title” with “body field”
to enter information about the ” customer “.
Starting creation of custom module customer, we will give the name the module as ” customer “.
In module directory create a new directory named as ” customer“.
create a new directory named as ” config ” in the “customer” directory.
Create a new directory named as “ install ” in the ” config” directory.
customer \ config \ install
The first file that we will create is “ customer.info.yml” file.
which exists in the / modules /custom / customer directory.
Add content to this file :
name : Customer Content Type description : The simplest example of implementing a customer node content type in a module. package : Awesome modules type : module dependencies : - node - path - text core : 8.x
The next file that we will create is ” customer.module ” file under ” customer ” directory.
You may add additional functionality to the module.
In the ” install ” directory create three additional fileswhich are :
In “ node.type.customer.yml ” file add the following code :
langcode: en
status: true
dependencies: { }
name: 'Customer'
type: customer
description: 'This is a very basic customer content type.'
help: ''
new_revision: false
preview_mode: 1
display_submitted: true
third_party_settings: { }
This is a standard “ yml ” file for all node-based content types.
The only value that is changeable is name, type, description .
The next file is ” field.field.node.customer.body.yml ” with following code.
langcode: en
status: true
dependencies:
config:
- field.storage.node.body
- node.type.customer
module:
- text
id: node.customer.body
field_name: body
entity_type: node
bundle: customer
label: Body
description: ''
required: false
translatable: true
default_value: { }
default_value_callback: ''
settings:
display_summary: true
third_party_settings: { }
field_type: text_with_summary
This file is also a standard template file for creating fields.
The last file is ” core.entity_form_display.node.customer.default.yml ” file.
This file specifies that how the node edit form will show when content creators add a new customer to the site.
Add the following code to this file.
langcode: en
status: true
dependencies:
config:
- field.field.node.customer.body
- node.type.customer
module:
- path
- text
id: node.customer.default
targetEntityType: node
bundle: customer
mode: default
content:
title:
type: string_textfield
weight: 0
settings:
size: 60
placeholder: ''
third_party_settings: { }
uid:
type: entity_reference_autocomplete
weight: 1
settings:
match_operator: CONTAINS
size: 60
placeholder: ''
third_party_settings: { }
created:
type: datetime_timestamp
weight: 2
settings: { }
third_party_settings: { }
promote:
type: boolean_checkbox
weight: 3
settings:
display_label: true
third_party_settings: { }
sticky:
type: boolean_checkbox
weight: 4
settings:
display_label: true
third_party_settings: { }
path:
type: path
weight: 5
settings: { }
third_party_settings: { }
body:
type: text_textarea_with_summary
weight: 6
settings:
rows: 9
summary_rows: 3
placeholder: ''
third_party_settings: { }
hidden: { }
third_party_settings: { }
After saving all the files,
Goto the dashboard and search the “ customer ” module in the “Awesome Modules section“.
After enabling this “customer” content type. select content page and click the “add content” button.
This section we will describes how to create nodes, files. nodes apply images , taxonomy terms, and menu item.
Before implementing this functionality on your site to be sure of several things:
First enable all the multilingual modules and setup spanish language that your site supports.
Goto :
Structure => Taxonomy => Manage => Tags
creates a new taxonomy term in the tags vocabulary.
It will be used in the node that will be created following process.
First we will add some content to our ( .module ) file.
we will add very top a code in this file, we add use Drupal \node \Entity \Node.
use Drupal \ user\ Entity\ User
In our next step we will create a new function in the module file.
Function code is as follows :
<?php
function hello_create_node()
{
$node = Node::create([
// The node entity bundle.
'type' => 'article',
'langcode' => 'en',
'created' => REQUEST_TIME,
'changed' => REQUEST_TIME,
// The user ID.
'uid' => 1,
'title' => 'My test!',
// An array with taxonomy terms.
'field_tags' =>[1],
'body' => [
'summary' => '',
'value' => '<p>The body of my node creating custom node programatically.</p>',
'format' => 'full_html',
],
]);
$node->save();
\Drupal::service('path.alias_storage')->save("/node/" . $node->id(),"/hello/example-node", "en");
$node_es = $node->addTranslation('es');
$node_es->title = 'Mi prueba!';
$node_es->body->value = '<p>El cuerpo de mi nodo.</p>';
$node_es->body->format = 'full_html';
$node_es->save();
\Drupal::service('path.alias_storage')->save("/node/" . $node->id(), "/mi/ruta", "es");
return t("Created node " . $node->get('title')->value);
}
?>
This codes creates a new ” $node ” object by using the “ Node :: create ” method.
Creates a new language translation of the node into the spanish and also creates a new alias in spanish.
With the functionality which is already present in the module file.
Our next step is to update the controller for the hello module.
We need to edit the ” HelloController.php” file in the ” src/controller ” directory.
Add the following code to this file.
<?php
public function create_node() {
return array(
'#markup' => hello_create_node(),
);
}
?>
Add code at the end of the routing file, which is “ hello.routing.yml ” file.
hello.create : path : 'hello/create-node' defaults : _controller: '\Drupal\hello\Controller\HelloController :: create_node' requirements : _access : 'TRUE'
The route file provides the URL of the hello /create-node.
After visiting of the URL go to :
Admin => content
Here you can see both english and spanish version of the node.
Clicking on the ” My Test ” title which displays the node as it was created by the module.