Form API in Drupal 7 — formulieren maken in Drupal
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.
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.
Verleen vervolgens toegang voor de beheerder via de rechteninstellingen.
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:
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().
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!