You are here

class FlexiformElementField_entityreference in Flexiform 7

Class for entityreference Field API elements.

Hierarchy

Expanded class hierarchy of FlexiformElementField_entityreference

File

includes/element/fields/entityreference.inc, line 10
Contains FlexiformElementField_entityreference class.

View source
class FlexiformElementField_entityreference extends FlexiformElementField {

  /**
   * {@inheritdoc}
   */
  public function form($form, &$form_state, $entity, $language = LANGUAGE_NONE) {
    $form = parent::form($form, $form_state, $entity, $language);
    if ($this
      ->getWidgetType() == 'entityreference_autocomplete') {
      foreach (element_children($form[$this->element_namespace][$language]) as $delta) {
        $element =& $form[$this->element_namespace][$language][$delta]['target_id'];
        $this
          ->formAlterAutocompleteElement($element, $entity);
      }
    }
    else {
      if ($this
        ->getWidgetType() == 'entityreference_autocomplete_tags') {
        $this
          ->formAlterAutocompleteElement($form[$this->element_namespace][$language], $entity);
      }
    }
    return $form;
  }

  /**
   * Alter the selection element.
   */
  protected function formAlterAutocompleteElement(&$element, $entity) {
    $ac_path = $this
      ->getWidgetType() == 'entityreference_autocomplete' ? 'flexiform/entityreference/autocomplete/single' : 'flexiform/entityreference/autocomplete/tags';
    $element['#autocomplete_path'] = $ac_path . '/' . $this->flexiform->form . '/' . $this->element_namespace;
    if ($entity_id = entity_id($this->entity_type, $entity)) {
      $element['#autocomplete_path'] .= "/{$entity_id}";
    }
    else {
      $element['#autocomplete_path'] .= "/NULL";
    }
    foreach ($element['#element_validate'] as &$callback) {
      if ($callback == '_entityreference_autocomplete_validate') {
        $callback = array(
          $this,
          'autocompleteValidate',
        );
      }
      if ($callback == '_entityreference_autocomplete_tags_validate') {
        $callback = array(
          $this,
          'autocompleteTagsValidate',
        );
      }
    }
  }

  /**
   * {@inheritdoc}
   */
  public function formSubmit($form, &$form_state, $entity, $language = LANGUAGE_NONE) {
    parent::formSubmit($form, $form_state, $entity, $language);

    // Make us compatible with the inline_entity_form module.
    // @todo: Consider just invoking this by default.
    if (module_exists('inline_entity_form')) {
      inline_entity_form_field_attach_submit($this
        ->getEntityType(), $entity, $this
        ->extractFormElements($form), $form_state);
    }
    return $form;
  }

  /**
   * Validate any autocomplete input.
   *
   * @see _entityreference_autocomplete_validate
   */
  public function autocompleteValidate($element, &$form_state, $form) {
    $value = '';
    if (!empty($element['#value'])) {

      // Take "label (entity id)", match the id from parenthesis
      if (preg_match("/.+\\((\\d+)\\)/", $element['#value'], $matches)) {
        $value = $matches[1];
      }
      else {

        // Try to get a match from the input string when the user didn't use the
        // autocomplete but filled in a value manually.
        $field = $this
          ->getField();
        $instance = $this
          ->getInstance();
        $handler = entityreference_get_selection_handler($field, $instance, $element['#entity_type'], $element['#entity']);
        $value = $handler
          ->validateAutocompleteInput($element['#value'], $element, $form_state, $form);
      }
    }
    form_set_value($element, $value, $form_state);
  }

  /**
   * Validate tags autocomplete input.
   *
   * @see _entityreference_autocomplete_tags_validate
   */
  public function autocompleteTagsValidate($element, &$form_state, $form) {
    $value = array();

    // If a value was entered into the autocomplete...
    if (!empty($element['#value'])) {
      $entities = drupal_explode_tags($element['#value']);
      foreach ($entities as $entity) {
        if (preg_match("/.+\\((\\d+)\\)/", $entity, $matches)) {
          $value[] = array(
            'target_id' => $matches[1],
          );
        }
        else {
          $field = $this
            ->getField();
          $instance = $this
            ->getInstance();
          $handler = entityreference_get_selection_handler($field, $instance, $element['#entity_type'], $element['#entity']);
          $value[] = array(
            'target_id' => $handler
              ->validateAutocompleteInput($entity, $element, $form_state, $form),
          );
        }
      }
    }
    form_set_value($element, $value, $form_state);
  }

}

Members

Namesort descending Modifiers Type Description Overrides
FlexiformElement::$bundle protected property The bundle this is on.
FlexiformElement::$element_namespace protected property The namespace of this element.
FlexiformElement::$entity_namespace protected property The entity namespace of the entity this element is acting on.
FlexiformElement::$entity_type protected property The entity type this field is on.
FlexiformElement::$flexiform protected property The flexiform entity this element is one.
FlexiformElement::$settings protected property The settings for this element.
FlexiformElement::$weight protected property The weight of this element.
FlexiformElement::createElement public static function Create an element object.
FlexiformElement::getCtoolsContexts public function Get an array of ctools context for the flexiform.
FlexiformElement::getCtoolsSubstitutionsList public function Build a list of possible ctools substitutions.
FlexiformElement::getElement public static function Get an element object.
FlexiformElement::getElementNamespace public function Get the element namespace for this form element.
FlexiformElement::getEntityNamespace public function Get the entity namespace for this form element.
FlexiformElement::getEntityType public function Get the entity type for this element.
FlexiformElement::getSettings public function Get the settings.
FlexiformElement::getWeight public function Get the weight of this form element.
FlexiformElement::makeElementNamespace public function Make namespace for the element. 1
FlexiformElement::name public function Get the name for this form element.
FlexiformElement::removeForm public function Build the remove form for the element.
FlexiformElement::removeFormSubmit public function Submit the remove form for the element.
FlexiformElement::removeFormValidate public function Validate the remove form for the element.
FlexiformElement::replaceCtoolsSubstitutions public function Replace ctools substitutions with their values.
FlexiformElementField::$field protected property The field settings for the field.
FlexiformElementField::$field_name protected property The field name of the field.
FlexiformElementField::$instance protected property The instance settings for the field
FlexiformElementField::checkWidgetBehavior public function Check widget behavior.
FlexiformElementField::configureFieldSettingsForm public function Add the Field Settings section to the config form.
FlexiformElementField::configureForm public function Overrides FlexiformElement::configureForm(). Overrides FlexiformElement::configureForm 1
FlexiformElementField::configureFormSubmit public function Overrides FlexiformElement::configureFormSubmit(). Overrides FlexiformElement::configureFormSubmit
FlexiformElementField::configureFormValidate public function Overrides FlexiformElement::configureFormValidate(). Overrides FlexiformElement::configureFormValidate
FlexiformElementField::diffArrays public function Get the Difference of two settings arrays.
FlexiformElementField::extractFormElements function Extract the form element from $form and give it the correct key.
FlexiformElementField::fieldInvoke protected function Invoke field hooks on a specific field.
FlexiformElementField::fieldInvokeDefault protected function Invoke default field hooks on this element.
FlexiformElementField::formExtractValues function Overrides FlexiformElement::formExtractValues(). Overrides FlexiformElement::formExtractValues
FlexiformElementField::formIsEmpty function Overrides FlexiformElement::formIsEmpty(). Overrides FlexiformElement::formIsEmpty
FlexiformElementField::formValidate public function Validate this element. Overrides FlexiformElement::formValidate
FlexiformElementField::getField public function Get the field array. Overrides FlexiformElementFieldAPIInterface::getField
FlexiformElementField::getInstance public function Get the instance array. Overrides FlexiformElementFieldAPIInterface::getInstance
FlexiformElementField::getWidgetLabel public function Get the widget label from the instance settings.
FlexiformElementField::getWidgetType public function Get the widget type from the instance settings.
FlexiformElementField::label public function Overrides FlexiformElement::label(). Overrides FlexiformElement::label
FlexiformElementField::setLabel public function Overrides FlexiformElement::setLabel(). Overrides FlexiformElement::setLabel
FlexiformElementField::setWeight public function Set the weight of this form element. Overrides FlexiformElement::setWeight
FlexiformElementField::toSettingsArray public function Overrides FlexifromElement::toSettingsArray(); Overrides FlexiformElement::toSettingsArray
FlexiformElementField::type public function Return the type. Overrides FlexiformElement::type
FlexiformElementField::__construct public function Overrides FlexiformElement::__construct(). Overrides FlexiformElement::__construct
FlexiformElementField_entityreference::autocompleteTagsValidate public function Validate tags autocomplete input.
FlexiformElementField_entityreference::autocompleteValidate public function Validate any autocomplete input.
FlexiformElementField_entityreference::form public function Return the form element for this FlexiformElement. Overrides FlexiformElementField::form
FlexiformElementField_entityreference::formAlterAutocompleteElement protected function Alter the selection element.
FlexiformElementField_entityreference::formSubmit public function Submit callback for this form. Overrides FlexiformElementField::formSubmit