1. #1

    Registered
    02/10/13
    Location
    Adinkerke
    Posts
    116
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    0/0

    Drupal: custom module: form validatie

    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!'));
      }
    }
    no votes  

  2. #2

    Registered
    02/10/13
    Location
    Adinkerke
    Posts
    116
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    0/0
    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.
    Last edited by ctuxboy; 05-01-2014 at 23:45.
    no votes  

  3. #3

    Registered
    02/10/13
    Location
    Adinkerke
    Posts
    116
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    0/0
    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!
    no votes  

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  

Log in

Log in