function ViewsUiBaseViewsWizard::build_filters

Build the part of the form that allows the user to select the filters.

By default, this adds "of type" and "tagged with" filters (when they are available).

1 call to ViewsUiBaseViewsWizard::build_filters()
ViewsUiBaseViewsWizard::build_form in plugins/views_wizard/views_ui_base_views_wizard.class.php
For AJAX callbacks to build other elements in the "show" form.

File

plugins/views_wizard/views_ui_base_views_wizard.class.php, line 350

Class

ViewsUiBaseViewsWizard
A very generic Views Wizard class - can be constructed for any base table.

Code

protected function build_filters(&$form, &$form_state) {
    // Find all the fields we are allowed to filter by.
    $fields = views_fetch_fields($this->base_table, 'filter');
    $entity_info = $this->entity_info;
    // If the current base table support bundles and has more than one (like
    // user).
    if (isset($entity_info['bundle keys']) && isset($entity_info['bundles'])) {
        // Get all bundles and their human readable names.
        $options = array(
            'all' => t('All'),
        );
        foreach ($entity_info['bundles'] as $type => $bundle) {
            $options[$type] = $bundle['label'];
        }
        $form['displays']['show']['type'] = array(
            '#type' => 'select',
            '#title' => t('of type'),
            '#options' => $options,
        );
        $selected_bundle = views_ui_get_selected($form_state, array(
            'show',
            'type',
        ), 'all', $form['displays']['show']['type']);
        $form['displays']['show']['type']['#default_value'] = $selected_bundle;
        // Changing this dropdown updates the entire content of $form['displays']
        // via AJAX, since each bundle might have entirely different fields
        // attached to it, etc.
        views_ui_add_ajax_trigger($form['displays']['show'], 'type', array(
            'displays',
        ));
    }
    // Check if we are allowed to filter by taxonomy, and if so, add the
    // "tagged with" filter to the view.
    //
    // We construct this filter using taxonomy_index.tid (which limits the
    // filtering to a specific vocabulary) rather than taxonomy_term_data.name
    // (which matches terms in any vocabulary). This is because it is a more
    // commonly-used filter that works better with the autocomplete UI, and
    // also to avoid confusion with other vocabularies on the site that may
    // have terms with the same name but are not used for free tagging.
    //
    // The downside is that if there *is* more than one vocabulary on the site
    // that is used for free tagging, the wizard will only be able to make the
    // "tagged with" filter apply to one of them (see below for the method it
    // uses to choose).
    if (isset($fields['taxonomy_index.tid'])) {
        // Check if this view will be displaying fieldable entities.
        if (!empty($entity_info['fieldable'])) {
            // Find all "tag-like" taxonomy fields associated with the view's
            // entities. If a particular entity type (i.e., bundle) has been
            // selected above, then we only search for taxonomy fields associated
            // with that bundle. Otherwise, we use all bundles.
            $bundles = array_keys($entity_info['bundles']);
            // Double check that this is a real bundle before using it (since above
            // we added a placeholder option 'all' to the bundle list on the form).
            if (isset($selected_bundle) && in_array($selected_bundle, $bundles)) {
                $bundles = array(
                    $selected_bundle,
                );
            }
            $tag_fields = array();
            foreach ($bundles as $bundle) {
                foreach (field_info_instances($this->entity_type, $bundle) as $instance) {
                    // We define "tag-like" taxonomy fields as ones that use the
                    // "Autocomplete term widget (tagging)" widget.
                    if ($instance['widget']['type'] == 'taxonomy_autocomplete') {
                        $tag_fields[] = $instance['field_name'];
                    }
                }
            }
            $tag_fields = array_unique($tag_fields);
            if (!empty($tag_fields)) {
                // If there is more than one "tag-like" taxonomy field available to
                // the view, we can only make our filter apply to one of them (as
                // described above). We choose 'field_tags' if it is available, since
                // that is created by the Standard install profile in core and also
                // commonly used by contrib modules; thus, it is most likely to be
                // associated with the "main" free-tagging vocabulary on the site.
                if (in_array('field_tags', $tag_fields)) {
                    $tag_field_name = 'field_tags';
                }
                else {
                    $tag_field_name = reset($tag_fields);
                }
                // Add the autocomplete textfield to the wizard.
                $form['displays']['show']['tagged_with'] = array(
                    '#type' => 'textfield',
                    '#title' => t('tagged with'),
                    '#autocomplete_path' => 'taxonomy/autocomplete/' . $tag_field_name,
                    '#size' => 30,
                    '#maxlength' => 1024,
                    '#field_name' => $tag_field_name,
                    '#element_validate' => array(
                        'views_ui_taxonomy_autocomplete_validate',
                    ),
                );
            }
        }
    }
}