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