Should be pretty straightforward but I am kinda stuck. I am prepopulating a mandatory field's value according to the URL, so I want to prevent the field from showing up, but not in a CSS level.

hide() and #access do not seem to submit the field leading to a validation error. Any clues on how would I go about doing this?

P.S. not a field of #type => hidden. An actual field. A select list if you want.

Comment trail clarifications:
1) the field is an entity field, a user field
2) the field is mandatory
3) the field is prepopulated using #value and #default_value (for safety (?))
4) the field should not be either visible or editable
5) I'd like to avoid adding a hidden and/or value field myself and write another submission/validation function since the user_register one works just fine. I want to use the value that the field has upon the form's rendering taking into consideration point 4.

  • Just to clarify, you don't want the input to be a hidden element, you don't want it to show on the form, but you want it to be pre-populated from a URL parameter? You're going to have to use CSS I think. Or implement your own pre-populate functionality which converts the relevant field to #type => value on the backend, so it never has to be displayed on the form itself
    – Clive
    Feb 13, 2013 at 15:37
  • Yes, the element is a select list, it's prepopulated, but I do not want to show it. If I resign to css, is there any chance I can somehow prevent the user from changing the value?
    – user5005
    Feb 13, 2013 at 15:38
  • 2
    If you want to stop the user changing the value then it shouldn't be a select list, you should just convert it to a #type => value in your form definition/form alter. That way it will be available server side, can be pre-populated in your form logic, and won't show to the user. Or if you're not bothered about doing it 'properly' just add #disabled => TRUE to the element and hide it with CSS
    – Clive
    Feb 13, 2013 at 15:39
  • Hold on, testing.
    – user5005
    Feb 13, 2013 at 15:40
  • 1
    Yes, it needs to be in a form alter. If it's a field as in an entity-field, you'll also need to make sure you're targeting the actual html element, and not the language or delta wrapper...(see drupal.stackexchange.com/questions/27767 for context)
    – Clive
    Feb 13, 2013 at 15:52

2 Answers 2


Since Drupal 7, Field API is in core so you don't have to worry about Fields when editing a node form. In Drupal 6, you have to add an #after_build function to do this.

You need to create a hook_form_alter function to alter the user_register_form. (or hook_form_FORM_ID_alter).

I can't remember the structure of form fields. Install devel module and you can see the entire $form array nicely.

    function mymodule_form_user_register_form_alter(&$form, &$form_state) {
      dpm($form); // Make sure you have Devel module installed. 
      $field_name = 'field_myfield';
      $value = $_GET['somekey']; // populate this var from the URL params as you mentioned in your question. 

      if (isset($form[$field_name][LANGUAGE_NONE][0])) {
        if (empty($value)) {
          $form['#access'] = FALSE;
          drupal_set_message(t('Please use correct URL'), 'warning'); // in case the value is not set, hide the form and issue a warning. 
        // #options is an array like this: array('key' => 'value', 'key2' => 'value2'); 
        // Make sure you set the key of this array in $value. if your $value is a value, you'll need to array_flip and find the key instead. 
        $form[$field_name][LANGUAGE_NONE][0]['#type'] = 'value'; // this element will not be rendered at all
        $form[$field_name][LANGUAGE_NONE][0]['#value'] = $value; // this value will be passed to $form_state['values']

Calling the form using drupal_get_form DOES fire all form_alters as necessary. If you are trying to use this form with a direct menu router, set page callback in the menu router item to drupal_get_form and array('user_register_form'), as the page arguments

  • see my answer for what actually worked
    – user5005
    Feb 13, 2013 at 16:35

For some bizzare reason, both

  $form['field_fieldname'][LANGUAGE_NONE]['#disabled'] = true;
  $form['field_fieldname'][LANGUAGE_NONE]['#type'] = 'value';

needed to be done, both in the hook_form_alter.

Doing the same work within the page callback:

$form = drupal_get_form('form_id');
//same thing
$form['field_fieldname'][LANGUAGE_NONE]['#disabled'] = true;
$form['field_fieldname'][LANGUAGE_NONE]['#type'] = 'value';
return $form;

Does not work. The field is a select list.

  • If anyone, can tell me why those 2 lines work in hook_form_alter, but do not work when I edit the renderable form's array I'd be greatful.
    – user5005
    Feb 15, 2013 at 9:22

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.