Drupal 8.7.x
I have a Form button with a confirmation page to delete an ingredient. I'm trying to convert it to a standard Form that just deletes it without confirmation, however I keep getting an error.
Confirmation Form (works just fine) src/Form/DeleteIngredient.php:
<?php
namespace Drupal\recipe_search\Form;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Form\ConfirmFormBase;
use Drupal\Core\Url;
/**
* Class DeleteIngredient
*
* @package Drupal\recipe_search\Form
*/
class DeleteIngredient extends ConfirmFormBase{
/**
* {@inheritdoc}
*/
public function getFormId() {
return 'delete_ingredient';
}
public $cid;
public function getQuestion() {
return t('Do you want to delete %cid?', array('%cid' => $this->cid));
}
public function getCancelUrl() {
return new Url('recipe_search.recipes');
}
public function getDescription() {
return t('Only do this if you are sure!');
}
/**
* {@inheritdoc}
*/
public function getConfirmText() {
return t('Delete it!');
}
/**
* {@inheritdoc}
*/
public function getCancelText() {
return t('Cancel');
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state, $cid = NULL) {
$this->pid = $cid;
return parent::buildForm($form, $form_state);
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
$database = \Drupal::database();
$database->delete('ingredient_list')
->condition('pid', $this->pid)
->execute();
$form_state->setRedirect('recipe_search.recipes');
}
Tried this for normal form without confirmation src/Form/DeleteIngredient.php:
<?php
namespace Drupal\recipe_search\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
/**
* Class DeleteIngredient
*
* @package Drupal\recipe_search\Form
*/
class DeleteIngredient extends FormBase{
/**
* {@inheritdoc}
*/
public function getFormId() {
return 'delete_ingredient';
}
public $cid;
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state, $cid = NULL) {
$this->pid = $cid;
return parent::buildForm($form, $form_state);
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
$database = \Drupal::database();
$database->delete('ingredient_list')
->condition('pid', $this->pid)
->execute();
$form_state->setRedirect('recipe_search.recipes');
}
}
This is where I return the form to the twig template src/Block/RecipeSearch.php:
//FETCH THE INGREDIENTS TO MAKE AN API CALL
$result = $connection->select('ingredient_list', 'il');
$result->fields('il', array('ingredient', 'pid'));
$result->condition('uid', $uid);
$data = $result->execute();
$results = $data->fetchAll(\PDO::FETCH_OBJ);
foreach ($results as $field) {
$delete = Url::fromUserInput('/delete/'.$field->pid);
array_push($ingredients, ["ingredient" => $field->ingredient, "delete" => $delete]);
array_push($ingredientsArray, $field->ingredient);
};
This is the Error I'm getting:
Error: Cannot call abstract method Drupal\Core\Form\FormInterface::buildForm() in Drupal\recipe_search\Form\DeleteIngredient->buildForm() (line 32 of /var/www/html/web/modules/custom/recipe_search/src/Form/DeleteIngredient.php)
I guess you cannot use buildForm while extending FormBase but I don't know how I should solve this.
Thanks in advance!