availability_calendar_alter_field_filter.inc in Availability Calendars 7.5
File
availability_calendar_alter_field_filter.inc
View source
<?php
class AvailabilityCalendarAlterFieldFilter extends SearchApiAbstractAlterCallback {
public function supportsIndex(SearchApiIndex $index) {
return $index->item_type === 'availability_calendar_calendar';
}
public function alterItems(array &$items) {
if ($this->index->item_type === 'availability_calendar_calendar') {
$fields = $this->options['fields'];
foreach ($items as $id => $item) {
$referring_field = availability_calendar_get_referring_field($id, $fields);
if ($this->options['default'] === 'exclude' && !empty($referring_field) || $this->options['default'] === 'include' && !$referring_field) {
unset($items[$id]);
}
}
}
}
public function configurationForm() {
if ($this->index->item_type === 'availability_calendar_calendar') {
$options = drupal_map_assoc($this
->get_fields_by_type('availability_calendar'));
$form = array(
'default' => array(
'#type' => 'radios',
'#title' => t('Which items should be indexed?'),
'#default_value' => isset($this->options['default']) ? $this->options['default'] : 'exclude',
'#options' => array(
'exclude' => t('All but those from one of the selected fields'),
'include' => t('Only those from the selected fields'),
),
),
'fields' => array(
'#type' => 'select',
'#title' => t('Fields'),
'#default_value' => isset($this->options['fields']) ? $this->options['fields'] : array(),
'#options' => $options,
'#size' => min(3, count($options)),
'#multiple' => TRUE,
),
);
}
else {
$form = array(
'forbidden' => array(
'#markup' => '<p>' . t("This index doesn't index availability calendars and therefore cannot be filtered on referring availability calendar fields here.") . '</p>',
),
);
}
return $form;
}
protected function get_fields_by_type($type) {
$result = array();
$fields = field_info_fields();
foreach ($fields as $field_name => $field) {
if ($field['type'] === $type && $field['deleted'] == 0) {
$result[] = $field_name;
}
}
return $result;
}
}