ajax_widget_checkboxes.inc in Ajax facets 7.2
Same filename and directory in other branches
The facetapi_links and facetapi_checkbox_links widget plugin classes.
File
plugins/facetapi/ajax_widget_checkboxes.incView source
<?php
/**
* @file
* The facetapi_links and facetapi_checkbox_links widget plugin classes.
*/
/**
* Widget that renders facets as a list of clickable links.
*
* Links make it easy for users to narrow down their search results by clicking
* on them. The render arrays use theme_item_list() to generate the HTML markup.
*/
class FacetapiAjaxWidgetCheckboxes extends FacetapiAjaxWidget {
public $update_result;
/**
* Overrides FacetapiWidgetCheckboxLinks::init().
*/
public function init() {
parent::init();
ajax_facets_add_ajax_js($this->facet);
}
/**
* Overrides FacetapiWidget::settingsForm().
*/
function settingsForm(&$form, &$form_state) {
parent::settingsForm($form, $form_state);
if ($this->facet['hierarchy callback']) {
$form['widget']['widget_settings']['links'][$this->id]['show_expanded'] = array(
'#type' => 'checkbox',
'#title' => t('Expand hierarchy'),
'#default_value' => !empty($this->settings->settings['show_expanded']),
'#description' => t('Show the entire tree regardless of whether the parent items are active.'),
'#states' => array(
'visible' => array(
'select[name="widget"]' => array(
'value' => $this->id,
),
),
),
);
}
$form['widget']['widget_settings']['links'][$this->id]['soft_limit'] = array(
'#type' => 'select',
'#title' => t('Soft limit'),
'#default_value' => $this->settings->settings['soft_limit'],
'#options' => array(
0 => t('No limit'),
) + drupal_map_assoc(array(
50,
40,
30,
20,
15,
10,
5,
3,
)),
'#description' => t('Limits the number of displayed facets via JavaScript.'),
'#states' => array(
'visible' => array(
'select[name="widget"]' => array(
'value' => $this->id,
),
),
),
);
$last = end($form['widget']['widget_settings']['links']);
foreach ($form['widget']['widget_settings']['links'] as $id => $element) {
if ($last != $element) {
$form['widget']['widget_settings']['links'][$id]['#attributes']['style'] = 'display: none;';
}
}
}
/**
* Overrides FacetapiWidget::getDefaultSettings().
*/
function getDefaultSettings() {
return array(
'soft_limit' => 20,
'show_expanded' => 0,
'checkboxes_update_results' => 1,
'checkboxes_show_reset_link' => 0,
);
}
/**
* Transforms the render array for use with theme_item_list().
*
* The recursion allows this function to act on the various levels of a
* hierarchical data set.
*
* @param array $build
* The items in the facet's render array being transformed.
*
* @return array
* The "items" parameter for theme_item_list().
*/
function buildListItems($build) {
$have_active = FALSE;
// Builds rows.
$items = array();
$items_count = count($build);
$active_items = array();
foreach ($build as $value => $item) {
$row = array(
'class' => array(),
);
$attributes = array(
'class' => array(
'facet-multiselect-checkbox',
),
'data-facet' => $this->settings->facet,
);
// Respect current selection.
if ($item['#active']) {
$attributes['checked'] = 'checked';
$have_active = TRUE;
$active_items[] = $this->key . ':' . $item['#markup'];
}
$checkbox = array(
'#id' => 'ajax-facets-checkboxes-' . str_replace(array(
'_',
' ',
':',
), '-', $this->key) . '-' . drupal_strtolower($value),
'#name' => urlencode($this->key) . ':' . $value,
'#type' => 'checkbox',
'#title' => $item['#markup'] . theme('facetapi_count', array(
'count' => $item['#count'],
)),
'#attributes' => $attributes,
);
$row['data'] = drupal_render($checkbox);
if ($items_count == 1) {
$row['class'][] = 'single-leaf';
}
if (!empty($item['#item_children'])) {
if ($item['#active'] || !empty($this->settings->settings['show_expanded'])) {
$row['class'][] = 'expanded';
$row['children'] = $this
->buildListItems($item['#item_children']);
}
else {
$row['class'][] = 'collapsed';
}
}
$items[] = $row;
}
$this->jsSettings['haveActiveSelection'] = $this->settings->settings['have_active_selection'] = $have_active;
sort($active_items);
$this->jsSettings['activeItems'] = $active_items;
// Generate reset path on server side to make possible to use aliases.
if ($have_active) {
$this->jsSettings['resetPath'] = ajax_facets_facet_build_reset_path($this->facet
->getFacet(), $this->facet
->getAdapter());
}
return $items;
}
/**
* Implements FacetapiWidget::execute().
*
* Transforms the render array into something that can be themed by
* theme_item_list().
*
* @see FacetapiWidgetLinks::setThemeHooks()
* @see FacetapiWidgetLinks::buildListItems()
*/
public function execute() {
$element =& $this->build[$this->facet['field alias']];
// Sets each item's theme hook, builds item list.
$this
->setThemeHooks($element);
$item_list = array(
'#theme' => 'item_list',
'#items' => $this
->buildListItems($element),
'#attributes' => $this->build['#attributes'],
);
$reset_link = '';
if (!empty($this->settings->settings['show_reset_link']) && $this->settings->settings['show_reset_link']) {
$reset_link = '<a class="reset-link" href="#">' . t('Reset filter') . '</a>';
}
$element = array(
'#markup' => '<div class="facet-wrapper-checkboxes ' . $this->build['#attributes']['id'] . '">' . $reset_link . render($item_list) . '</div>',
);
}
}
Classes
Name | Description |
---|---|
FacetapiAjaxWidgetCheckboxes | Widget that renders facets as a list of clickable links. |