Score:2

Convert an existing entity type to revisionable

in flag

I am trying to make an existing entity type (knowledge), from the Knowledge Project, revisionable. I followed these instructions Converting a content entity type to be revisionable. A new table, knowledge_revision, is not created, and and the fields are added to the knowledge table. I am lost on what to do next.

update code


use Drupal\Core\Field\BaseFieldDefinition;

$definition_update_manager = \Drupal::entityDefinitionUpdateManager();

// Add the published entity key and revisionable metadata fields to the
// knowledge entity type.
$entity_type = $definition_update_manager->getEntityType('knowledge');
$entity_type_id = $entity_type->id();

$revision_metadata_keys = [
  'revision_user' => 'revision_user',
  'revision_created' => 'revision_created',
  'revision_log_message' => 'revision_log_message'
];
$entity_type->set('revision_metadata_keys', $revision_metadata_keys);

$entity_type->set('show_revision_ui', TRUE);

$definition_update_manager->updateEntityType($entity_type);

// Add the revision metadata fields.
$revision_created = BaseFieldDefinition::create('created')
  ->setLabel(t('Revision create time'))
  ->setDescription(t('The time that the current revision was created.'))
  ->setRevisionable(TRUE);
$definition_update_manager->installFieldStorageDefinition('revision_created', $entity_type_id, $entity_type_id, $revision_created);

$revision_user = BaseFieldDefinition::create('entity_reference')
  ->setLabel(t('Revision user'))
  ->setDescription(t('The user ID of the author of the current revision.'))
  ->setSetting('target_type', 'user')
  ->setRevisionable(TRUE);
$definition_update_manager->installFieldStorageDefinition('revision_user', $entity_type_id, $entity_type_id, $revision_user);

$revision_log_message = BaseFieldDefinition::create('string_long')
  ->setLabel(t('Revision log message'))
  ->setDescription(t('Briefly describe the changes you have made.'))
  ->setRevisionable(TRUE)
  ->setDefaultValue('')
  ->setDisplayOptions('form', [
    'type' => 'string_textarea',
    'weight' => 25,
    'settings' => [
      'rows' => 4,
    ],
  ]);
$definition_update_manager->installFieldStorageDefinition('revision_log_message', $entity_type_id, $entity_type_id, $revision_log_message);

Drupal\knowledge\Entity\Knowledge

/**
 * Defines the knowledge entity class.
 *
 * @ContentEntityType(
 *   id = "knowledge",
 *   label = @Translation("Knowledge"),
 *   label_singular = @Translation("knowledge"),
 *   label_plural = @Translation("knowledge"),
 *   label_count = @PluralTranslation(
 *     singular = "@count knowledge",
 *     plural = "@count knowledge",
 *   ),
 *   bundle_label = @Translation("Knowledge type"),
 *   handlers = {
 *     "storage" = "Drupal\knowledge\KnowledgeStorage",
 *     "storage_schema" = "Drupal\knowledge\KnowledgeStorageSchema",
 *     "access" = "Drupal\knowledge\KnowledgeAccessControlHandler",
 *     "list_builder" = "Drupal\Core\Entity\EntityListBuilder",
 *     "view_builder" = "Drupal\knowledge\KnowledgeViewBuilder",
 *     "views_data" = "Drupal\knowledge\KnowledgeViewsData",
 *     "form" = {
 *       "default" = "Drupal\knowledge\KnowledgeForm",
 *       "delete" = "Drupal\knowledge\Form\DeleteForm",
 *       "unlink" = "Drupal\knowledge\Form\UnlinkForm",
 *     },
 *   },
 *   base_table = "knowledge",
 *   revision_table = "knowledge_revision",
 *   show_revision_ui = TRUE,
 *   uri_callback = "knowledge_uri",
 *   translatable = FALSE,
 *   entity_keys = {
 *     "id" = "kid",
 *     "bundle" = "knowledge_type",
 *     "uuid" = "uuid",
 *     "published" = "status",
 *     "owner" = "uid",
 *     "revision" = "revision_id",
 *   },
 *   revision_metadata_keys = {
 *     "revision_user" = "revision_user",
 *     "revision_created" = "revision_created",
 *     "revision_log_message" = "revision_log_message",
 *   },
 *   links = {
 *     "canonical" = "/knowledge/{knowledge}",
 *     "delete-form" = "/knowledge/{knowledge}/delete",
 *     "delete-multiple-form" = "/admin/content/knowledge/delete",
 *     "edit-form" = "/knowledge/{knowledge}/edit",
 *     "create" = "/knowledge",
 *     "unlink-form" = "/knowledge/{knowledge}/unlink",
 *   },
 *   bundle_entity_type = "knowledge_type",
 *   field_ui_base_route  = "entity.knowledge_type.edit_form",
 * )
 */
class Knowledge extends EditorialContentEntityBase implements KnowledgeInterface {
 ...
  /**
   * {@inheritdoc}
   */
  public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
    /** @var \Drupal\Core\Field\BaseFieldDefinition[] $fields */
    $fields = parent::baseFieldDefinitions($entity_type);
    // $fields += static::publishedBaseFieldDefinitions($entity_type);
    $fields += static::ownerBaseFieldDefinitions($entity_type);

    $fields['kid']->setLabel(t('Knowledge ID'))
      ->setDescription(t('The knowledge ID.'));

    $fields['uuid']->setDescription(t('The knowledge UUID.'));

    $fields['knowledge_type']->setLabel(t('Knowledge Type'))
      ->setDescription(t('The knowledge type.'));

    // Set the default value callback for the status field.
    $fields['status']->setDefaultValueCallback('Drupal\knowledge\Entity\Knowledge::getDefaultStatus');

    $fields['uid']
      ->setDescription(t('The user ID of the knowledge author.'));

    $fields['field_name'] = BaseFieldDefinition::create('string')
      ->setLabel(t('Knowledge field name'))
      ->setRequired(TRUE)
      ->setDescription(t('The field name through which this knowledge was added.'))
      ->setSetting('is_ascii', TRUE)
      ->setSetting('max_length', FieldStorageConfig::NAME_MAX_LENGTH);

    $fields['entity_type'] = BaseFieldDefinition::create('string')
      ->setLabel(t('Entity type'))
      ->setRequired(TRUE)
      ->setRevisionable(TRUE)
      ->setDescription(t('The entity type to which this knowledge is attached.'))
      ->setSetting('is_ascii', TRUE)
      ->setSetting('max_length', EntityTypeInterface::ID_MAX_LENGTH);

    $fields['entity_id'] = BaseFieldDefinition::create('entity_reference')
      ->setLabel(t('Entity ID'))
      ->setDescription(t('The ID of the entity of which this knowledge is a reply.'))
      ->setRevisionable(TRUE)
      ->setRequired(TRUE);

    $fields['incident_type'] = BaseFieldDefinition::create('string')
      ->setLabel(t('Incident type'))
      ->setRequired(TRUE)
      ->setDescription(t('The entity type to which this knowledge is attached.'))
      ->setSetting('is_ascii', TRUE)
      ->setSetting('max_length', EntityTypeInterface::ID_MAX_LENGTH);

    $fields['incident_id'] = BaseFieldDefinition::create('entity_reference')
      ->setLabel(t('Incident Id'))
      ->setDescription(t('The ID of the support case.'))
      ->setDisplayConfigurable('form', TRUE)
      ->setDisplayConfigurable('view', TRUE)
      ->setRequired(TRUE);

    $fields['citation'] = BaseFieldDefinition::create('boolean')
      ->setLabel(t('Citation'))
      ->setDescription(t("The owner linked to another's articled."))
      ->setDisplayConfigurable('form', TRUE)
      ->setDisplayConfigurable('view', TRUE)
      ->setRevisionable(TRUE)
      ->setRequired(TRUE);

    $fields['created'] = BaseFieldDefinition::create('created')
      ->setLabel(t('Created'))
      ->setDescription(t('The time that the knowledge was created.'))
      ->setTranslatable(TRUE);

    $fields['changed'] = BaseFieldDefinition::create('changed')
      ->setLabel(t('Changed'))
      ->setDescription(t('The time that the knowledge was last edited.'))
      ->setRevisionable(TRUE)
      ->setTranslatable(TRUE);

    return $fields;
  }
...
}
I sit in a Tesla and translated this thread with Ai:

mangohost

Post an answer

Most people don’t grasp that asking a lot of questions unlocks learning and improves interpersonal bonding. In Alison’s studies, for example, though people could accurately recall how many questions had been asked in their conversations, they didn’t intuit the link between questions and liking. Across four studies, in which participants were engaged in conversations themselves or read transcripts of others’ conversations, people tended not to realize that question asking would influence—or had influenced—the level of amity between the conversationalists.