Skip to main content

How to load a entity or node in form builder class?

I want to load default values in my form. I am fetching the node of the table row from form list and passing it into route.

my_form_eform:
 path: '/edit/{bar}'
 options:
 parameters:
  bar:
  type: entity:node
 defaults:
  _form: '\Drupal\my_form\Form\EditForm'
  _title: 'Edit Item'
 requirements:
  _permission: 'access content'

and code for editform.php is

namespace Drupal\my_form\Form;

use Drupal\Core\Session\AccountInterface;
use Symfony\Component\HttpFoundation\Request;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Form\NodeInterface;

class EditForm extends FormBase{


// public function content(AccountInterface $index, Request $request) {

public function getFormId() {
return 'edit_form';
}

public function buildForm(array $form, FormStateInterface $form_state , NodeInterface $bar = NULL){

 // $id = $bar;
//  $result = db_select('my_form','t')  
// ->fields('t',array('id','title','author','stream','description','price'))
// ->condition('id',$id) 
// ->execute()->fetchAssoc();

// $dtitle = $result['title'];
// $dauthor = $result['author'];
// $ddesc = $result['description'];
// $dstream = $result['stream'];
// $dprice = $result['price'];

$form = array();

$form['title'] = [
  '#type' => 'textfield',
  '#title' => t('Title of your book.'),
   '#default_value'=> $dtitle
];
$form['author'] = [
  '#type' => 'textfield',
  '#title' => $this->t('Author.'),
   '#default_value'=> $dauthor
  ];
$form['stream'] = [
  '#type' => 'select',
  '#title' => t('Stream'),
  '#options' => array(
  'ECE' => t('ECE'),
  'CSE' => t('CSE'),
  'ME'=> t('ME'),
),
   '#default_value'=> $dstream
  ];
  $form['desc'] = [
  '#type' => 'textfield',
  '#title' => t('Description'),
   '#default_value'=> $ddesc
  ];
  $form['Price'] = [
  '#type' => 'textfield',
  '#title' => t('Price'),
   '#default_value'=> $dprice,
  ];
$form['ADD'] = [
  '#type' => 'submit',
  '#value' => $this->t('Update'),
];
return $form;

}

I read about parameter upcasting, but its not required for node instance.

If I am passing the id in function itself through account interface it's giving the error

must be compatible with formbuilder class

Now I am using NodeInterface argument but its also giving the error

Argument 3 passed to Drupal\my_form\Form\EditForm::buildForm() must be an instance of Drupal\Core\Form\NodeInterface

Please help. How can I load my id so that default values for form fields can be fetched from db?

ronit
  • 131
  • 4