diff --git a/modules/entity_reference_override_revisions/entity_reference_override_revisions.info.yml b/modules/entity_reference_override_revisions/entity_reference_override_revisions.info.yml new file mode 100644 index 0000000000000000000000000000000000000000..246c10b416316dd1fcf17a9dc24373739a0d89c3 --- /dev/null +++ b/modules/entity_reference_override_revisions/entity_reference_override_revisions.info.yml @@ -0,0 +1,8 @@ +name: Entity Reference Override - Entity Reference Revisions integration +type: module +description: Entity reference revisions with overridable title +core: 8.x +package: Custom +dependencies: + - entity_reference_override + - entity_reference_revisions \ No newline at end of file diff --git a/modules/entity_reference_override_revisions/entity_reference_override_revisions.module b/modules/entity_reference_override_revisions/entity_reference_override_revisions.module new file mode 100644 index 0000000000000000000000000000000000000000..cdb732db242a9b2c35059f54d6318783ffb92265 --- /dev/null +++ b/modules/entity_reference_override_revisions/entity_reference_override_revisions.module @@ -0,0 +1,34 @@ +<?php + +/** + * @file + * Contains entity_reference_override_revisions.module. + */ + +use Drupal\Core\Routing\RouteMatchInterface; + +/** + * Implements hook_help(). + */ +function entity_reference_override_revisions_help($route_name, RouteMatchInterface $route_match) { + switch ($route_name) { + // Main module help for the entity_reference_override_revisions module. + case 'help.page.entity_reference_override_revisions': + $output = ''; + $output .= '<h3>' . t('About') . '</h3>'; + $output .= '<p>' . t('Entity reference revisions with overridable title') . '</p>'; + return $output; + + default: + } +} + +/** + * Implements hook_field_formatter_info_alter(). + */ +function entity_reference_override_revisions_field_formatter_info_alter(&$info) { + // Update the entity_reference_override formatters for + // entity_reference_override_revisions use. + $info['entity_reference_override_entity']['field_types'][] = 'entity_reference_override_revisions'; + $info['entity_reference_override_label']['field_types'][] = 'entity_reference_override_revisions'; +} diff --git a/modules/entity_reference_override_revisions/src/Plugin/Field/FieldType/EntityReferenceOverrideRevisions.php b/modules/entity_reference_override_revisions/src/Plugin/Field/FieldType/EntityReferenceOverrideRevisions.php new file mode 100644 index 0000000000000000000000000000000000000000..537e191ae2af0df1c31d5e71091caa5f2dcc2cac --- /dev/null +++ b/modules/entity_reference_override_revisions/src/Plugin/Field/FieldType/EntityReferenceOverrideRevisions.php @@ -0,0 +1,86 @@ +<?php + +namespace Drupal\entity_reference_override_revisions\Plugin\Field\FieldType; + +use Drupal\Core\Field\FieldStorageDefinitionInterface; +use Drupal\Core\TypedData\DataDefinition; +use Drupal\Core\Form\FormStateInterface; +use Drupal\entity_reference_revisions\Plugin\Field\FieldType\EntityReferenceRevisionsItem; + +/** + * Implementation of the 'entity_reference_override_revisions' field type. + * + * @FieldType( + * id = "entity_reference_override_revisions", + * label = @Translation("Entity reference revisions w/custom text"), + * description = @Translation("An entity field containing an entity reference by revision with custom text"), + * category = @Translation("Reference revisions"), + * default_widget = "entity_reference_override_revisions_autocomplete", + * default_formatter = "entity_reference_override_label", + * list_class = "\Drupal\entity_reference_revisions\EntityReferenceRevisionsFieldItemList" + * ) + */ +class EntityReferenceOverrideRevisions extends EntityReferenceRevisionsItem { + + /** + * {@inheritdoc} + */ + public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) { + $properties = parent::propertyDefinitions($field_definition); + $override_definition = DataDefinition::create('string') + ->setLabel($field_definition->getSetting('override_label')) + ->setRequired(FALSE); + $properties['override'] = $override_definition; + return $properties; + } + + /** + * {@inheritdoc} + */ + public static function schema(FieldStorageDefinitionInterface $field_definition) { + $schema = parent::schema($field_definition); + $schema['columns']['override'] = array( + 'type' => 'varchar', + 'length' => 255, + 'not null' => FALSE, + ); + return $schema; + } + + /** + * {@inheritdoc} + */ + public static function defaultFieldSettings() { + return array( + 'override_label' => t('Custom text'), + ) + parent::defaultFieldSettings(); + } + + /** + * {@inheritdoc} + */ + public function fieldSettingsForm(array $form, FormStateInterface $form_state) { + $elements = parent::fieldSettingsForm($form, $form_state); + + $elements['override_label'] = [ + '#type' => 'textfield', + '#title' => t('Custom text label'), + '#default_value' => $this->getSetting('override_label'), + '#description' => t('Also used as a placeholder in multi-value instances.') + ]; + + return $elements; + } + +// /** +// * {@inheritdoc} +// */ +// public static function getPreconfiguredOptions() { +// // In the base EntityReference class, this is used to populate the +// // list of field-types with options for each destination entity type. +// // Too much work, we'll just make people fill that out later. +// // Also, keeps the field type dropdown from getting too cluttered. +// return array(); +// } + +} \ No newline at end of file diff --git a/modules/entity_reference_override_revisions/src/Plugin/Field/FieldWidget/EntityReferenceOverrideRevisionsAutocompleteWidget.php b/modules/entity_reference_override_revisions/src/Plugin/Field/FieldWidget/EntityReferenceOverrideRevisionsAutocompleteWidget.php new file mode 100644 index 0000000000000000000000000000000000000000..8edd07304ffde85c604c002325ecda657490b45d --- /dev/null +++ b/modules/entity_reference_override_revisions/src/Plugin/Field/FieldWidget/EntityReferenceOverrideRevisionsAutocompleteWidget.php @@ -0,0 +1,70 @@ +<?php + +namespace Drupal\entity_reference_override_revisions\Plugin\Field\FieldWidget; + +use Drupal\Core\Field\FieldItemListInterface; +use Drupal\Core\Field\Plugin\Field\FieldWidget\EntityReferenceAutocompleteWidget; +use Drupal\Core\Form\FormStateInterface; + +/** + * Plugin implementation of the 'entity_reference_autocomplete' widget. + * + * @FieldWidget( + * id = "entity_reference_override_revisions_autocomplete", + * label = @Translation("Autocomplete"), + * description = @Translation("An autocomplete text field."), + * field_types = { + * "entity_reference_override_revisions" + * } + * ) + */ +class EntityReferenceOverrideRevisionsAutocompleteWidget extends EntityReferenceAutocompleteWidget { + + /** + * {@inheritdoc} + */ + public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) { + $widget = array( + '#attributes' => ['class' => ['form--inline', 'clearfix']], + '#theme_wrappers' => ['container'], + ); + $widget['target_id'] = parent::formElement($items, $delta, $element, $form, $form_state)['target_id']; + $widget['override'] = array( + '#type' => 'textfield', + '#default_value' => isset($items[$delta]) ? $items[$delta]->override : '', + '#size' => 40, + '#weight' => 10, + ); + + if ($this->fieldDefinition->getFieldStorageDefinition()->isMultiple()) { + $widget['override']['#placeholder'] = $this->fieldDefinition->getSetting('override_label'); + } + else { + $widget['override']['#title'] = $this->fieldDefinition->getSetting('override_label'); + } + + return $widget; + } + + /** + * {@inheritdoc} + */ + public function massageFormValues(array $values, array $form, FormStateInterface $form_state) { + $entity_type = $this->fieldDefinition->getFieldStorageDefinition()->getSetting('target_type'); + foreach ($values as $key => $value) { + if ($value['target_id']) { + $entity = \Drupal::entityTypeManager()->getStorage($entity_type)->load($value['target_id']); + // Add the current revision ID. + $values[$key]['target_revision_id'] = $entity->getRevisionId(); + } + // The entity_autocomplete form element returns an array when an entity + // was "autocreated", so we need to move it up a level. + if (is_array($value['target_id'])) { + unset($values[$key]['target_id']); + $values[$key] += $value['target_id']; + } + } + return $values; + } + +}