Render arrays
Två (tre) olika typer av render arrays
- #theme
- #markup
<?php
// Returns HTML for an image.
$logo = array(
'#theme' => 'image',
'#path' => 'logo.png',
'#alt' => t('My logo'),
);
// Returns HTML for a list or nested list of items.
$item_list = array(
'#theme' => 'item_list',
'#items' => $items,
'#title' => $heading,
);
#theme
$markup['first_para'] = array(
'#markup' => 'A first paragraph',
);
$markup['admin_filtered_string'] = array(
'#markup' => '<em>This is filtered using the admin tag list</em>',
'#allowed_tags' => ['strong'],
);
#markup
Formulär
Skillnad i routen
hello_world_form.content:
path: '/hello-world-form'
defaults:
_title: 'Hello World Form'
_form: '\Drupal\hello_world_form\Form\HelloWorldForm'
requirements:
_access: 'TRUE'
Formulär i Drupal 8
Kräver en klass med fyra metoder:
- getFormId
- buildForm
- validateForm
- submitForm
namespace Drupal\hello_world_form\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
class HelloWorldForm extends FormBase {
/**
* GetFormId();
*/
public function getFormId() {
return $form_id;
}
/**
* buildForm();
*/
public function buildForm(array $form, FormStateInterface $form_state) {
return $form;
}
/**
* Validate();
*/
public function validateForm(array &$form, FormStateInterface $form_state) {
}
/**
* Submit();
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
}
}
Element
// Textfält
$form['title'] = array(
'#type' => 'textfield',
'#title' => t('Subject'),
'#required' => TRUE,
);
// Checkbox
$form['copy'] = array(
'#type' => 'checkbox',
'#title' => t('Send me a copy.'),
);
// Radioknappar
$form['selected'] = array(
'#type' => 'select',
'#title' => t('Selected'),
'#options' => array(
0 => t('No'),
1 => t('Yes'),
),
'#default_value' => 1,
'#description' => t('Yes or no. Simple question.'),
);
Validering
/**
* Validate data.
*/
public function validateForm(array &$form, FormStateInterface $form_state) {
// Check if given email is valid.
if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
$form_state->setErrorByName('email', $this->t('Not a valid e-mail address.'));
}
}
Submit
/**
* What should happen when form is submitted?
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
// Notify user that we've sent an email greeting.
drupal_set_message(
$this->t('Sent an email to @email', array('@email' => $form_state->getValue('email')))
);
}
Påverka befintliga formulär
/**
* Implements hook_form_alter().
*/
function MODULE_form_alter(array &$form, FormStateInterface $form_state, $form_id) {
if ($form_id == 'user_form') {
$form['#submit'][] = 'my_new_submit_function';
}
}
Uppgift 1
- Skapa en ny route med _form istället för _controller.
- Skapa en ny klass som bygger ut "FormBase".
- Implementera de metoder som krävs.
- Skapa valfritt element.
Uppgift 2
- Skapa en submit-knapp.
- Utför någon slags validering. Kan t.e.x vara om ett fält har något värde eller ej.
- Använd drupal_set_message() i submit-metoden för att notifiera användaren att formuläret har blivit skickat.
Uppgift 3
- Lägg till hook_form_alter() i din .module fil.
- Byta sedan titel på valfritt element.
Render arrays & forms
By Erik Johansson
Render arrays & forms
- 895