logo

Extra Block Types (EBT) - Nieuwe Layout Builder ervaring❗

Extra Block Types (EBT) - gestileerde, aanpasbare bloktypes: Slideshows, Tabs, Cards, Accordions en vele andere. Ingebouwde instellingen voor achtergrond, DOM Box, javascript-plugins. Ervaar vandaag al de toekomst van layout building.

Demo EBT-modules Download EBT-modules

❗Extra Paragraph Types (EPT) - Nieuwe Paragraphs ervaring

Extra Paragraph Types (EPT) - analoge op paragrafen gebaseerde set modules.

Demo EPT-modules Download EPT-modules

Scroll

Form API in Drupal 7 — formulieren maken in Drupal

14/10/2025, by Ivan

In de vorige lessen hebben we kennisgemaakt met de hooks hook_block_info(), hook_block_view(), hook_menu() en hook_permission(). Nu kunnen we programmatisch zoveel pagina’s en blokken aanmaken als we willen. In deze les maken we kennis met de Form API van Drupal 7 om formulieren te bouwen. We gaan een formulier maken voor het beheren van de functionaliteit van onze module en proberen zoveel mogelijk van de eerder geleerde hooks toe te passen om onze kennis te versterken.

Om te beginnen tonen we drie blokken — dit zou voor jou geen probleem moeten zijn.

function sitemade_block_info(){
    $blocks = array(); // initialiseren van een lege array
    $blocks[1]['info'] = 'Lijst van gebruikers'; // bloktitel voor de beheerpagina
    $blocks[2]['info'] = 'Lijst van nodes';
    $blocks[3]['info'] = 'Lijst van termen';
    return $blocks; // retourneert de lijst met blokken
}
 
function sitemade_block_view($delta = ''){
    $block = array(); // initialiseert een lege blokarray
    switch ($delta){
        case 1:
          $block['subject'] = 'Gebruikers';
          $block['content'] = '';
          $query = db_select('users', 'u')
            ->fields('u', array('uid', 'name'))
            ->orderBy('u.uid', 'DESC')
            ->range(0, 5)
            ->execute();
          $users = $query->fetchAll(PDO::FETCH_ASSOC);
          foreach($users as $user){
            $block['content'] .='';
          }
        break;
        case 2:
          $block['subject'] = 'Nodes';
          $block['content'] = '';
          $query = db_select('node', 'n')
            ->fields('n', array('nid', 'title'))
            ->orderBy('n.nid', 'DESC')
            ->range(0, 10)
            ->execute();
          $nodes = $query->fetchAll(PDO::FETCH_ASSOC);
          foreach($nodes as $node){
            $block['content'] .='';
        }            
        break;
        case 3:
          $block['subject'] = 'Termen';
          $block['content'] = '';
          $query = db_select('taxonomy_term_data', 't')
            ->fields('t', array('tid', 'name'))
            ->orderBy('t.tid', 'DESC')
            ->range(0, 10)
            ->execute();
          $terms = $query->fetchAll(PDO::FETCH_ASSOC);
          foreach($terms as $term){
            $block['content'] .='';
          }            
        break;
    }
    return $block;
}

Wis de cache zodat de nieuwe blokken zichtbaar worden in de admininterface en plaats ze in de linkerzijbalk.

Drupal blocks

Nu maken we een beheerpagina aan waarop we later het formulier voor deze drie blokken zullen plaatsen:

function sitemade_permission(){
    return array(
      'admin content blocks' => array(
        'title' => t('Admin content blocks'),
        'description' => t('Nodes, Users, Terms'),
      ),
    );
}
function sitemade_menu(){
    $items = array();   
    $items['admin/config/content/content_blocks'] = array(
      'title' => 'Gebruikers-, node- en termenblokken',
      'description' => 'Beheer van blokken',
      'page callback' => '_sitemade_content_blocks',
      'access arguments' => array('admin content blocks'),
    );
    return $items;
}
function _sitemade_content_blocks(){
    $content = 'Lorem ipsum!';
    return $content;
}

De nieuwe pagina verschijnt nu als placeholder op admin/config/content/content_blocks.

Drupal admin page

Verleen vervolgens toegang voor de beheerder via de rechteninstellingen.

Drupal permission

Nu gaan we het formulier zelf aanmaken. In de drie blokken willen we de bloktitel en het aantal weergegeven items beheren.

Allereerst passen we de 'page callback' aan in hook_menu() om het formulier op te roepen:

function sitemade_menu(){
    $items = array();
    $items['admin/config/content/content_blocks'] = array(
      'title' => 'Gebruikers-, node- en termenblokken',
      'description' => 'Beheer van blokken',
      'page callback' => 'drupal_get_form',
      'page arguments' => array('_sitemade_content_blocks'),
      'access arguments' => array('admin content blocks'),
    );
    return $items;
}

drupal_get_form() roept een formulierfunctie aan en genereert het formulier-HTML. Laten we nu onze functie herschrijven om een formulier-array terug te geven:

function _sitemade_content_blocks(){
    $form = array();
    $form['nodes-title'] = array(
      '#type' => 'textfield',
      '#title' => t('Bloktitel voor nodes'),
      '#default_value' => variable_get('node_block', ''),
      '#size' => 60,
      '#maxlength' => 64,
      '#description' => t('Titel van het nodeblok'),
    );
    $form['node-selected'] = array(
      '#type' => 'select',
      '#title' => t('Aantal nodes in blok'),
      '#options' => drupal_map_assoc(range(1, 10)),
      '#default_value' => variable_get('node_block_range', 5),
      '#description' => t('Hoeveel nodes moeten worden weergegeven'),
    );    
    $form['users-title'] = array(
      '#type' => 'textfield',
      '#title' => t('Bloktitel voor gebruikers'),
      '#default_value' => variable_get('user_block', ''),
      '#size' => 60,
      '#maxlength' => 64,
      '#description' => t('Titel van het gebruikersblok'),
    );    
    $form['user-selected'] = array(
      '#type' => 'select',
      '#title' => t('Aantal gebruikers in blok'),
      '#options' => drupal_map_assoc(range(1, 10)),
      '#default_value' => variable_get('user_block_range', 5),
      '#description' => t('Hoeveel gebruikers moeten worden weergegeven'),
    );        
    $form['terms-title'] = array(
      '#type' => 'textfield',
      '#title' => t('Bloktitel voor termen'),
      '#default_value' => variable_get('term_block', ''),
      '#size' => 60,
      '#maxlength' => 64,
      '#description' => t('Titel van het termenblok'),
    );        
    $form['term-selected'] = array(
      '#type' => 'select',
      '#title' => t('Aantal termen in blok'),
      '#options' => drupal_map_assoc(range(1, 10)),
      '#default_value' => variable_get('term_block_range', 5),
      '#description' => t('Hoeveel termen moeten worden weergegeven'),
    );        
    $form['actions'] = array('#type' => 'actions');
    $form['actions']['submit'] = array(
      '#type' => 'submit',
      '#value' => t('Opslaan'),
    );
    return $form;
}

Na opslaan van het formulier zien we de nieuwe beheervorm:

Drupal admin form

We moeten nu de submit-handler toevoegen om de waarden op te slaan:

function sitemade_content_blocks_submit($form, &$form_values){
    variable_set('node_block', $form_values['values']['nodes-title']);
    variable_set('user_block', $form_values['values']['users-title']);
    variable_set('term_block', $form_values['values']['terms-title']);
    variable_set('node_block_range', $form_values['values']['node-selected']);
    variable_set('user_block_range', $form_values['values']['user-selected']);
    variable_set('term_block_range', $form_values['values']['term-selected']);
}

De waarden van het formulier worden nu opgeslagen via variable_set() en opnieuw geladen met variable_get().

Drupal form submit

Tot slot passen we de blokweergave aan zodat titels en aantallen dynamisch uit de variabelen worden geladen:

function sitemade_block_view($delta = ''){
    $block = array();
    switch ($delta){
        case 1:
          $block['subject'] = variable_get('user_block', 'Gebruikers');
          $query = db_select('users', 'u')
            ->fields('u', array('uid', 'name'))
            ->orderBy('u.uid', 'DESC')
            ->range(0, variable_get('user_block_range', 5))
            ->execute();
          $users = $query->fetchAll(PDO::FETCH_ASSOC);
          foreach($users as $user){
            $block['content'] .=''; 
          }
        break;
        case 2:
          $block['subject'] = variable_get('node_block', 'Nodes');
          $query = db_select('node', 'n')
            ->fields('n', array('nid', 'title'))
            ->orderBy('n.nid', 'DESC')
            ->range(0, variable_get('node_block_range', 5))
            ->execute(); 
          $nodes = $query->fetchAll(PDO::FETCH_ASSOC);
          foreach($nodes as $node){
            $block['content'] .=''; 
        }           
        break;
        case 3:
          $block['subject'] = variable_get('term_block', 'Termen');
          $query = db_select('taxonomy_term_data', 't')
            ->fields('t', array('tid', 'name'))
            ->orderBy('t.tid', 'DESC')
            ->range(0, variable_get('term_block_range', 10))
            ->execute(); 
          $terms = $query->fetchAll(PDO::FETCH_ASSOC);
          foreach($terms as $term){ 
            $block['content'] .=''; 
          }         
        break;
    }
    return $block;
}

En hier is het resultaat — vergeet niet na afloop de cache te legen!

Drupal block