ai_content_lifecycle-1.0.0/ai_content_lifecycle.module
ai_content_lifecycle.module
<?php
/**
* @file
* Primary module hooks for ai_content_lifecycle module.
*/
use Drupal\Core\Render\Element;
use Drupal\user\UserInterface;
/**
* Implements hook_theme().
*/
function ai_content_lifecycle_theme(): array {
return [
'content_life_cycle' => ['render element' => 'elements'],
'ai_content_lifecycle_confirmation' => [
'variables' => ['confirmation' => NULL],
'template' => 'ai-content-lifecycle-confirmation',
],
];
}
/**
* Prepares variables for content life cycle templates.
*
* Default template: content-life-cycle.html.twig.
*
* @param array $variables
* An associative array containing:
* - elements: An associative array containing the content life cycle information and any
* fields attached to the entity.
* - attributes: HTML attributes for the containing element.
*/
function template_preprocess_content_life_cycle(array &$variables): void {
$variables['view_mode'] = $variables['elements']['#view_mode'];
foreach (Element::children($variables['elements']) as $key) {
$variables['content'][$key] = $variables['elements'][$key];
}
}
/**
* Implements hook_preprocess_HOOK() for ai_content_lifecycle_confirmation.
*/
function template_preprocess_ai_content_lifecycle_confirmation(array &$variables): void {
// Add necessary classes for styling.
if (!isset($variables['attributes'])) {
$variables['attributes'] = [];
}
if (!isset($variables['attributes']['class'])) {
$variables['attributes']['class'] = [];
}
$variables['attributes']['class'][] = 'ai-content-lifecycle-confirmation';
// Attach the CSS.
$variables['#attached']['library'][] = 'ai_content_lifecycle/confirmation';
}
/**
* Implements hook_user_cancel().
*/
function ai_content_lifecycle_user_cancel($edit, UserInterface $account, $method): void {
switch ($method) {
case 'user_cancel_reassign':
// Anonymize content life cycles.
$storage = \Drupal::entityTypeManager()->getStorage('content_life_cycle');
$content_life_cycle_ids = $storage->getQuery()
->condition('uid', $account->id())
->accessCheck(FALSE)
->execute();
foreach ($storage->loadMultiple($content_life_cycle_ids) as $content_life_cycle) {
$content_life_cycle->setOwnerId(0)->save();
}
break;
}
}
/**
* Implements hook_ENTITY_TYPE_predelete() for user entities.
*/
function ai_content_lifecycle_user_predelete(UserInterface $account): void {
// Delete content life cycles that belong to this account.
$storage = \Drupal::entityTypeManager()->getStorage('content_life_cycle');
$content_life_cycle_ids = $storage->getQuery()
->condition('uid', $account->id())
->accessCheck(FALSE)
->execute();
$storage->delete(
$storage->loadMultiple($content_life_cycle_ids)
);
// Delete old revisions.
$content_life_cycle_ids = $storage->getQuery()
->allRevisions()
->condition('uid', $account->id())
->accessCheck(FALSE)
->execute();
foreach (array_keys($content_life_cycle_ids) as $revision_id) {
$storage->deleteRevision($revision_id);
}
}
/**
* Implements hook_views_data_alter().
*/
function ai_content_lifecycle_views_data_alter(array &$data) {
// Get the actual table name for the content lifecycle entity
$entity_type_manager = \Drupal::entityTypeManager();
$entity_type = $entity_type_manager->getDefinition('content_life_cycle');
$base_table = $entity_type->getDataTable();
// Add node relationship
if (isset($data[$base_table])) {
$data[$base_table]['node_relationship'] = [
'title' => t('Node'),
'help' => t('Relationship to the node this lifecycle belongs to.'),
'relationship' => [
'base' => 'node_field_data',
'base field' => 'nid',
'field' => 'entity_id',
'id' => 'standard',
'label' => t('Node'),
'extra' => [
[
'left_field' => 'entity_type',
'value' => 'node',
'operator' => '=',
],
],
],
];
}
// Add reverse relationships from entities to lifecycle data
if (isset($data['node_field_data'])) {
$data['node_field_data']['content_lifecycle'] = [
'title' => t('Content Lifecycle'),
'help' => t('Content Lifecycle data for this node.'),
'relationship' => [
'base' => $base_table,
'base field' => 'entity_id',
'field' => 'nid',
'id' => 'standard',
'label' => t('Content Lifecycle'),
'extra' => [
[
// This is a field from the right table (content_life_cycle)
'field' => 'entity_type',
'value' => 'node',
'operator' => '=',
],
],
],
];
}
}
