danielebarchiesi@4: field = $field; danielebarchiesi@4: $this->instance = $instance; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements EntityReferenceHandler::settingsForm(). danielebarchiesi@4: */ danielebarchiesi@4: public static function settingsForm($field, $instance) { danielebarchiesi@4: $view_settings = empty($field['settings']['handler_settings']['view']) ? '' : $field['settings']['handler_settings']['view']; danielebarchiesi@4: $displays = views_get_applicable_views('entityreference display'); danielebarchiesi@4: // Filter views that list the entity type we want, and group the separate danielebarchiesi@4: // displays by view. danielebarchiesi@4: $entity_info = entity_get_info($field['settings']['target_type']); danielebarchiesi@4: $options = array(); danielebarchiesi@4: foreach ($displays as $data) { danielebarchiesi@4: list($view, $display_id) = $data; danielebarchiesi@4: if ($view->base_table == $entity_info['base table']) { danielebarchiesi@4: $options[$view->name . ':' . $display_id] = $view->name . ' - ' . $view->display[$display_id]->display_title; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: // The value of the 'view_and_display' select below will need to be split danielebarchiesi@4: // into 'view_name' and 'view_display' in the final submitted values, so danielebarchiesi@4: // we massage the data at validate time on the wrapping element (not danielebarchiesi@4: // ideal). danielebarchiesi@4: $form['view']['#element_validate'] = array('entityreference_view_settings_validate'); danielebarchiesi@4: danielebarchiesi@4: if ($options) { danielebarchiesi@4: $default = !empty($view_settings['view_name']) ? $view_settings['view_name'] . ':' . $view_settings['display_name'] : NULL; danielebarchiesi@4: $form['view']['view_and_display'] = array( danielebarchiesi@4: '#type' => 'select', danielebarchiesi@4: '#title' => t('View used to select the entities'), danielebarchiesi@4: '#required' => TRUE, danielebarchiesi@4: '#options' => $options, danielebarchiesi@4: '#default_value' => $default, danielebarchiesi@4: '#description' => '
' . t('Choose the view and display that select the entities that can be referenced.
Only views with a display of type "Entity Reference" are eligible.') . '
' . t('No eligible views were found. Create a view with an Entity Reference display, or add such a display to an existing view.', array( danielebarchiesi@4: '@create' => url('admin/structure/views/add'), danielebarchiesi@4: '@existing' => url('admin/structure/views'), danielebarchiesi@4: )) . '
', danielebarchiesi@4: ); danielebarchiesi@4: } danielebarchiesi@4: return $form; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: protected function initializeView($match = NULL, $match_operator = 'CONTAINS', $limit = 0, $ids = NULL) { danielebarchiesi@4: $view_name = $this->field['settings']['handler_settings']['view']['view_name']; danielebarchiesi@4: $display_name = $this->field['settings']['handler_settings']['view']['display_name']; danielebarchiesi@4: $args = $this->field['settings']['handler_settings']['view']['args']; danielebarchiesi@4: $entity_type = $this->field['settings']['target_type']; danielebarchiesi@4: danielebarchiesi@4: // Check that the view is valid and the display still exists. danielebarchiesi@4: $this->view = views_get_view($view_name); danielebarchiesi@4: if (!$this->view || !isset($this->view->display[$display_name]) || !$this->view->access($display_name)) { danielebarchiesi@4: watchdog('entityreference', 'The view %view_name is no longer eligible for the %field_name field.', array('%view_name' => $view_name, '%field_name' => $this->instance['label']), WATCHDOG_WARNING); danielebarchiesi@4: return FALSE; danielebarchiesi@4: } danielebarchiesi@4: $this->view->set_display($display_name); danielebarchiesi@4: danielebarchiesi@4: // Make sure the query is not cached. danielebarchiesi@4: $this->view->is_cacheable = FALSE; danielebarchiesi@4: danielebarchiesi@4: // Pass options to the display handler to make them available later. danielebarchiesi@4: $entityreference_options = array( danielebarchiesi@4: 'match' => $match, danielebarchiesi@4: 'match_operator' => $match_operator, danielebarchiesi@4: 'limit' => $limit, danielebarchiesi@4: 'ids' => $ids, danielebarchiesi@4: ); danielebarchiesi@4: $this->view->display_handler->set_option('entityreference_options', $entityreference_options); danielebarchiesi@4: return TRUE; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements EntityReferenceHandler::getReferencableEntities(). danielebarchiesi@4: */ danielebarchiesi@4: public function getReferencableEntities($match = NULL, $match_operator = 'CONTAINS', $limit = 0) { danielebarchiesi@4: $display_name = $this->field['settings']['handler_settings']['view']['display_name']; danielebarchiesi@4: $args = $this->field['settings']['handler_settings']['view']['args']; danielebarchiesi@4: $result = array(); danielebarchiesi@4: if ($this->initializeView($match, $match_operator, $limit)) { danielebarchiesi@4: // Get the results. danielebarchiesi@4: $result = $this->view->execute_display($display_name, $args); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: $return = array(); danielebarchiesi@4: if ($result) { danielebarchiesi@4: $target_type = $this->field['settings']['target_type']; danielebarchiesi@4: $entities = entity_load($target_type, array_keys($result)); danielebarchiesi@4: foreach($entities as $entity) { danielebarchiesi@4: list($id,, $bundle) = entity_extract_ids($target_type, $entity); danielebarchiesi@4: $return[$bundle][$id] = $result[$id]; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: return $return; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements EntityReferenceHandler::countReferencableEntities(). danielebarchiesi@4: */ danielebarchiesi@4: function countReferencableEntities($match = NULL, $match_operator = 'CONTAINS') { danielebarchiesi@4: $this->getReferencableEntities($match, $match_operator); danielebarchiesi@4: return $this->view->total_items; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function validateReferencableEntities(array $ids) { danielebarchiesi@4: $display_name = $this->field['settings']['handler_settings']['view']['display_name']; danielebarchiesi@4: $args = $this->field['settings']['handler_settings']['view']['args']; danielebarchiesi@4: $result = array(); danielebarchiesi@4: if ($this->initializeView(NULL, 'CONTAINS', 0, $ids)) { danielebarchiesi@4: // Get the results. danielebarchiesi@4: $entities = $this->view->execute_display($display_name, $args); danielebarchiesi@4: $result = array_keys($entities); danielebarchiesi@4: } danielebarchiesi@4: return $result; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements EntityReferenceHandler::validateAutocompleteInput(). danielebarchiesi@4: */ danielebarchiesi@4: public function validateAutocompleteInput($input, &$element, &$form_state, $form) { danielebarchiesi@4: return NULL; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements EntityReferenceHandler::getLabel(). danielebarchiesi@4: */ danielebarchiesi@4: public function getLabel($entity) { danielebarchiesi@4: return entity_label($this->field['settings']['target_type'], $entity); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements EntityReferenceHandler::entityFieldQueryAlter(). danielebarchiesi@4: */ danielebarchiesi@4: public function entityFieldQueryAlter(SelectQueryInterface $query) { danielebarchiesi@4: danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function entityreference_view_settings_validate($element, &$form_state, $form) { danielebarchiesi@4: // Split view name and display name from the 'view_and_display' value. danielebarchiesi@4: if (!empty($element['view_and_display']['#value'])) { danielebarchiesi@4: list($view, $display) = explode(':', $element['view_and_display']['#value']); danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: form_error($element, t('The views entity selection mode requires a view.')); danielebarchiesi@4: return; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: // Explode the 'args' string into an actual array. Beware, explode() turns an danielebarchiesi@4: // empty string into an array with one empty string. We'll need an empty array danielebarchiesi@4: // instead. danielebarchiesi@4: $args_string = trim($element['args']['#value']); danielebarchiesi@4: if ($args_string === '') { danielebarchiesi@4: $args = array(); danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: // array_map is called to trim whitespaces from the arguments. danielebarchiesi@4: $args = array_map('trim', explode(',', $args_string)); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: $value = array('view_name' => $view, 'display_name' => $display, 'args' => $args); danielebarchiesi@4: form_set_value($element, $value, $form_state); danielebarchiesi@4: }