You are here

function editableviews_handler_field_entity_metadata_property::options_form in Editable Views 7

Default options form provides the label widget that all fields should have.

Overrides views_handler_field::options_form

File

handlers/editableviews_handler_field_entity_metadata_property.inc, line 27

Class

editableviews_handler_field_entity_metadata_property
Field handler for editing an entity metadata property.

Code

function options_form(&$form, &$form_state) {
  parent::options_form($form, $form_state);
  $table_data = views_fetch_data($this->table);
  $entity_info = entity_get_info($table_data['table']['entity type']);
  $entity_property_info = entity_get_property_info($table_data['table']['entity type']);

  // Create an array of grouped options.
  $options = array();

  // Common properties.
  $label_common = t('Common');
  $options[$label_common] = array();
  if (isset($entity_info['entity keys']['bundle'])) {

    // Entity API makes the bundle entity key settable, presumably for
    // creating new entities. That's really not going to fly here.
    // (No need to check it exists before we attempt to unset it.)
    unset($entity_property_info['properties'][$entity_info['entity keys']['bundle']]);
  }
  foreach ($entity_property_info['properties'] as $property_name => $property_info) {
    if (empty($property_info['setter callback'])) {

      // We can't do anything with a property that has no information about
      // how to set it.
      continue;
    }
    if (!empty($property_info['field'])) {

      // FieldAPI fields have their own handler that does a far better job
      // (with widgets, etc) than this can do.
      continue;
    }
    $options[$label_common][$property_name] = $property_info['label'];
  }

  // Bundle-specific properties.
  foreach ($entity_property_info['bundles'] as $bundle_name => $bundle_info) {
    $bundle_label = $entity_info['bundles'][$bundle_name]['label'];
    $options[$bundle_label] = array();
    foreach ($bundle_info['properties'] as $property_name => $property_info) {
      if (empty($property_info['setter callback'])) {

        // We can't do anything with a property that has no information about
        // how to set it.
        continue;
      }
      if (!empty($property_info['field'])) {

        // FieldAPI fields have their own handler that does a far better job
        // (with widgets, etc) than this can do.
        continue;
      }
      $options[$bundle_label][$property_name] = $property_info['label'];
    }
  }
  $form['property'] = array(
    '#type' => 'select',
    '#title' => t('Metadata property'),
    '#options' => $options,
    '#description' => t('Select the property to edit with this field. (Only properties that define how they may be set on an entity are available. Be sure to ensure the property applies to all entities the View will show.)'),
    '#default_value' => $this->options['property'],
    // Views AJAX magic which I don't pretend to understand, which allows a
    // dependent form element for 'reverse_boolean'.
    '#ajax' => array(
      'path' => views_ui_build_form_url($form_state),
    ),
    '#submit' => array(
      'views_ui_config_item_form_submit_temporary',
    ),
    '#executes_submit_callback' => TRUE,
  );
  $form['form_use_label'] = array(
    '#type' => 'checkbox',
    '#title' => t('Use handler label for form element'),
    '#description' => t('Use the label for this handler on the form element, rather than the label set in metadata properties which is not always suited to non-developer consumption.'),
    '#default_value' => $this->options['form_use_label'],
  );
  if ($this->options['property']) {
    $entity_all_property_info = entity_get_all_property_info($table_data['table']['entity type']);
    $selected_property_info = $entity_all_property_info[$this->options['property']];
    if ($selected_property_info['type'] == 'boolean') {
      $form['reverse_boolean'] = array(
        '#type' => 'checkbox',
        '#title' => t('Reverse checkbox value'),
        '#description' => t('Reverse the value of the boolean property in the checkbox. Use this for properties which make more sense to the user when inverted.'),
        '#default_value' => $this->options['reverse_boolean'],
      );
    }
  }
}