Archief - Drupal: custom module: form validatie

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

ctuxboy

Legacy Member
Heb een custom module gemaakt met een form. Dit werkt.
Enkel de controle of het veld distance[postal_code] ingevuld is wordt niet gecontroleerd.
(De overige velden zijn hidden ingesteld om de rest vd url aan te vullen!)

Wie kan mij verder helpen?


De code:
Code:
<?php
function location_search_menu() {
  $items = array();
  $items['markten'] = array( //this creates a URL
    'title' => 'Markten, nog toegankelijker!', //page title
    'page callback' => 'drupal_get_form', //this is the function that will be called when the page is accessed.  for a form, use drupal_get_form
    'page arguments' => array('location_search_form'), //put the name of the form here
    'access callback' => TRUE
  );
  return $items;
}

function location_search_form($form, &$form_state) {
  $form['#prefix'] = '<div id="postal-code-search"><h2>Markten vandaag in de buurt...</h2>';
  $form['#sufix'] = '</div>';
  $form['#attributes'] = array('id' => 'postal-code-form');
  $form['#method'] = 'get';
  $form['#action'] = '/location-list'; // make url 
  $form['#after_build'][] = 'location_search_form_modify';
  $form['distance[postal_code]'] = array(
    '#type' => 'textfield', //postal code field
    '#size' => 10,
    '#maxlength' => 10,
    '#required' => TRUE, //make this field required
    '#attributes' =>array('placeholder' => t('Postal code')),
  );
  $form['distance[search_distance]'] = array(
    '#type' => 'hidden', //distance field
    '#value' => '50',
  );
  $form['distance[search_units]'] = array(
    '#type' => 'hidden', //distance units field
    '#value' => 'km',
  );
  $form['submit_button'] = array(
    '#type' => 'submit',
    '#value' => t('Search'),
    '#name' => '', // unset 'op'
  );
  return $form;
}

function location_search_form_modify($form){ // remove form_token, form_build_id, form_id from url
  unset($form['form_token']);
  unset($form['form_build_id']);
  unset($form['form_id']);
  return $form;
}

function location_search_validate($form, &$form_state) {
  $pc = $form_state['values']['distance[postal_code]'];
  if(empty($pc) || $pc == '') {
    form_set_error('distance[postal_code]', t('Postal code is required!'));
  }
}

ctuxboy

Legacy Member
Intussen heb ik gevonden dat het probleem zit in het versturen van de form met de GET-methode, dus in dit stukje code:

Code:
...
$form['#method'] = 'get';
$form['#action'] = '/location-list';
...

Dus na een submit worden de gegevens direct naar de ../location-list... url gestuurd, en wordt de validatie omzeilt.

Alsook deze code zorgt voor problemen:
Code:
...
$form['#after_build'][] = 'location_search_form_modify';
...
function location_search_form_modify($form){ // remove form_token, form_build_id, form_id from url
  unset($form['form_token']);
  unset($form['form_build_id']);
  unset($form['form_id']);
  return $form;
}
...

Deze zorgt ervoor dat de form_id, form_token en form_build_id_worden verwijdert.

Wat ik eigenlijk wil bereiken met dit form, is een vervanging van een exposed form, die volgende GET-url weergeeft:
http://www.site.com/location-list?distance[postal_code]=...
Maar niet wordt verzonden wanneer geen postcode is ingevuld.

ctuxboy

Legacy Member
Ik heb het mezelf blijbaar heel moeilijk gemaakt, daarom een andere oplossing gevonden die iets makkelijker is, nl. de exposed form vd view overriden met hook_form_alter, maar zal dit in een nieuw topic starten.

Dus hier mag een slotje op!
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan