How to create a custom form and submit data in to database in Drupal 8 and 9

In this article we are discussing about steps required to create a custom form. Here we are creating a custom form in our custom module with validations and submit data in to a custom table.

So after applying below changes you can a see a custom form as below which will save data in to the  table students.

Assume  dn_students is our custom module. Follow below 3  steps of implementation in this custom module.

Step1 –  Create table schema in *.install file

Create a dn_students.install file in your module root folder path and place below code.

<?php
use Drupal\Core\Database\Database;
 
/**
 * Implements hook_schema().
 */
function dn_students_schema(){
    $schema['students'] = array(
        'description' => 'The table for storing the students data.',
        'fields' => array(
            'id' => array(
                'description' => 'The primary identifier for student',
                'type' => 'serial',
                'not null' => TRUE,
                'unsigned' => TRUE,
            ),
            'fname' => array(
                'description' => 'Student name',
                'type' => 'varchar',
                'length' => 255,
                'not null' => TRUE,
                'default' => '',
            ),
           'sname' => array(
                'description' => 'Student second name.',
                'type' => 'varchar',
                'length' => 255,
                'not null' => TRUE,
                'default' => '',
            ),
            'age' => array(
                'description' => 'Age of student',
                'type' => 'int',
                'length' => 100,
                'not null' => TRUE,
               
            ),
            'marks' => array(
                'description' => 'Mark of student',
                'type' => 'int',
                'length' => 100,
                'not null' => TRUE,
            ),
        ),
        'primary key' => array('id'),
    );
    return $schema;
}

During installation of dn_students module, students table will be created in your database with fields fname, lname , id, age and marks.

Step 2  – Create page path and form mapping in *.routing.yml

Add below code in dn_students.routing.yml

dn_students.add_student:
  path: '/students/add'
  defaults:
    _title: 'Add Students'
    _form: '\Drupal\dn_students\Form\StudentForm'
  requirements:
    _access: 'TRUE'

So, our form page URL is http://yourdomain/students/add

Next, we have to create form php file.

Step 3 –  Create a form php file in path  /src/Form 

Create StudentForm.php file in module path /src/Form

This file has three functions ,

  • BuildForm function for bulding form elements
  • ValidateForm function for validating form values
  • submitForm function for handing form data insertion to database.

See below full code in StudentForm.php.

<?php

namespace Drupal\dn_students\Form;

use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Database\Database;
use Drupal\Core\Url;
use Drupal\Core\Routing;

/**
 * Provides the form for adding countries.
 */
class StudentForm extends FormBase {

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'dn_student_form';
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {


    
    $form['fname'] = [
      '#type' => 'textfield',
      '#title' => $this->t('First Name'),
      '#required' => TRUE,
      '#maxlength' => 20,
      '#default_value' =>  '',
    ];
	 $form['sname'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Second Name'),
      '#required' => TRUE,
      '#maxlength' => 20,
      '#default_value' =>  '',
    ];
	$form['age'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Age'),
      '#required' => TRUE,
      '#maxlength' => 20,
      '#default_value' => '',
    ];
	 $form['marks'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Marks'),
      '#required' => TRUE,
      '#maxlength' => 20,
      '#default_value' => '',
    ];
	
    $form['actions']['#type'] = 'actions';
    $form['actions']['submit'] = [
      '#type' => 'submit',
      '#button_type' => 'primary',
      '#default_value' => $this->t('Save') ,
    ];
	
	//$form['#validate'][] = 'studentFormValidate';

    return $form;

  }
  
   /**
   * {@inheritdoc}
   */
  public function validateForm(array & $form, FormStateInterface $form_state) {
       $field = $form_state->getValues();
	   
		$fields["fname"] = $field['fname'];
		if (!$form_state->getValue('fname') || empty($form_state->getValue('fname'))) {
            $form_state->setErrorByName('fname', $this->t('Provide First Name'));
        }
		
		
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array & $form, FormStateInterface $form_state) {
	try{
		$conn = Database::getConnection();
		
		$field = $form_state->getValues();
	   
		$fields["fname"] = $field['fname'];
		$fields["sname"] = $field['sname'];
		$fields["age"] = $field['age'];
		$fields["marks"] = $field['marks'];
		
		  $conn->insert('students')
			   ->fields($fields)->execute();
		  \Drupal::messenger()->addMessage($this->t('The Student data has been succesfully saved'));
		 
	} catch(Exception $ex){
		\Drupal::logger('dn_students')->error($ex->getMessage());
	}
    
  }

}

Now install the file and access url   /students/add.

You can see submitted details in students table as below.

 

Download sample module code here.

 

Get Free E-book
Get a free Ebook on Drupal 8 -theme tutorial
I agree to have my personal information transfered to MailChimp ( more information )
if you like this article Buy me a Coffee this will be an ispiration for me to write articles like this.

You may also like...