You are here

function farm_sensor_form_alter in farmOS 7

Implements hook_form_alter().

File

modules/farm/farm_sensor/farm_sensor.module, line 218

Code

function farm_sensor_form_alter(&$form, &$form_state, $form_id) {

  // Only alter the farm asset form.
  if ($form_id != 'farm_asset_form') {
    return;
  }

  // Only alter if the asset is of type 'sensor'.
  if ($form['#entity_type'] != 'farm_asset' || $form['#bundle'] != 'sensor') {
    return;
  }

  // Pull the farm asset object out of the form.
  $farm_asset = $form['farm_asset']['#value'];

  // Load the available sensor types.
  $sensor_types = farm_sensor_types();

  // Generate a list of sensor type options.
  $options = array();
  foreach ($sensor_types as $name => $type) {
    $options[$name] = $type['label'];
  }

  // Determine the type.
  $sensor_type = !empty($farm_asset->sensor_type) ? $farm_asset->sensor_type : NULL;

  // Override sensor type with $form_state value, so AJAX works.
  if (!empty($form_state['values']['sensor_type'])) {
    $sensor_type = $form_state['values']['sensor_type'];
  }

  // Add a sensor fieldset.
  $form['sensor'] = array(
    '#type' => 'fieldset',
    '#title' => t('Sensor configuration'),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
    '#weight' => 99,
  );

  // Add a sensor type selection field to the form.
  $form['sensor']['sensor_type'] = array(
    '#type' => 'select',
    '#title' => t('Sensor type'),
    '#description' => t('What type of sensor is this?'),
    '#options' => $options,
    '#default_value' => $sensor_type,
    '#required' => TRUE,
    '#ajax' => array(
      'callback' => 'farm_sensor_settings_form_ajax',
      'wrapper' => 'farm_sensor_settings',
    ),
  );

  // Load the sensor settings.
  $sensor_settings = !empty($farm_asset->sensor_settings) ? $farm_asset->sensor_settings : array();

  // Sensor settings fieldset.
  $form['sensor']['sensor_settings'] = array(
    '#type' => 'fieldset',
    '#title' => t('Sensor settings'),
    '#description' => t('Configure settings for the sensor type selected above.'),
    '#prefix' => '<div id="farm_sensor_settings">',
    '#suffix' => '</div>',
    '#tree' => TRUE,
  );

  // If a sensor type is selected, and the type has a settings form...
  if (!empty($sensor_type) && !empty($sensor_types[$sensor_type]['form']) && function_exists($sensor_types[$sensor_type]['form'])) {

    // Load the sensor type settings form.
    $settings_form = call_user_func_array($sensor_types[$sensor_type]['form'], array(
      $farm_asset,
      $sensor_settings,
    ));

    // Add it to the fieldset.
    $form['sensor']['sensor_settings'] = array_merge($form['sensor']['sensor_settings'], $settings_form);
  }

  // Add to the "General" group.
  $form['#group_children']['sensor'] = 'group_farm_general';
}