bibcite_entity.module in Bibliography & Citation 8
Same filename and directory in other branches
Module hooks.
File
modules/bibcite_entity/bibcite_entity.moduleView source
<?php
/**
* @file
* Module hooks.
*/
use Drupal\bibcite_entity\Entity\ReferenceType;
use Drupal\bibcite_entity\Form\ReferencePreviewForm;
use Drupal\Component\Utility\Xss;
use Drupal\Core\Database\Query\AlterableInterface;
use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\Element;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Template\Attribute;
use Drupal\Core\Url;
use Drupal\field\FieldStorageConfigInterface;
/**
* Implements hook_views_data_alter().
*/
function bibcite_entity_views_data_alter(array &$data) {
$data['bibcite_reference__keywords']['keywords_target_id']['filter']['id'] = 'bibcite_keyword_id';
}
/**
* Implements hook_field_views_data_alter().
*
* @see taxonomy_field_views_data_alter()
*/
function bibcite_entity_field_views_data_alter(array &$data, FieldStorageConfigInterface $field_storage) {
if ($field_storage
->getType() == 'entity_reference' && $field_storage
->getSetting('target_type') == 'bibcite_keyword') {
foreach ($data as $table_name => $table_data) {
foreach ($table_data as $field_name => $field_data) {
if (isset($field_data['filter']) && $field_name != 'delta') {
$data[$table_name][$field_name]['filter']['id'] = 'bibcite_keyword_id';
}
}
}
}
}
/**
* Implements hook_entity_operation().
*/
function bibcite_entity_entity_operation(EntityInterface $entity) {
$operations = [];
if ($entity
->hasLinkTemplate('bibcite-merge-form')) {
$operations['bibcite_merge'] = [
'title' => t('Merge'),
'weight' => 10,
'url' => $entity
->toUrl('bibcite-merge-form'),
];
}
return $operations;
}
/**
* Implements hook_preprocess_links().
*
* Destination query element break redirect between forms.
*/
function bibcite_entity_preprocess_links__dropbutton__operations(&$variables) {
if (isset($variables['links']['bibcite_merge']['link']['#options']['query']['destination'])) {
unset($variables['links']['bibcite_merge']['link']['#options']['query']['destination']);
}
}
/**
* Implements hook_theme().
*/
function bibcite_entity_theme($existing, $type, $theme, $path) {
return [
'bibcite_reference' => [
'render element' => 'elements',
],
'bibcite_reference__table' => [
'render element' => 'elements',
'base hook' => 'bibcite_reference',
],
'bibcite_contributor' => [
'render element' => 'elements',
],
'bibcite_keyword' => [
'render element' => 'elements',
],
];
}
/**
* Implements hook_query_TAG_alter().
*/
function bibcite_entity_query_bibcite_reference_access_alter(AlterableInterface $query) {
// Read meta-data from query, if provided.
if (!($account = $query
->getMetaData('account'))) {
$account = \Drupal::currentUser();
}
if (!($op = $query
->getMetaData('op'))) {
$op = 'view';
}
// Not alter query if admin or if operation isn't 'view'.
if ($account
->hasPermission('administer bibcite') || $op !== 'view') {
return;
}
$base_table = $query
->getMetaData('base_table');
if ($base_table) {
if ($account
->hasPermission('view own unpublished bibcite_reference')) {
$allow_unpublished = TRUE;
// Construct condition to get unpublished References created by current user (unpublished own condition in next comments).
$unpublished_condition = $query
->andConditionGroup()
->condition('base_table.status', 0)
->condition('base_table.uid', $account
->id());
}
if ($account
->hasPermission('view bibcite_reference')) {
$allow_published = TRUE;
}
if ($allow_unpublished && $allow_published) {
// Add conditions to query to get published and unpublished own References.
$query
->condition($query
->orConditionGroup()
->condition('base_table.status', 1)
->condition($unpublished_condition));
}
elseif ($allow_published) {
// Add condition to get only published References.
$query
->condition('base_table.status', 1);
}
elseif ($allow_unpublished) {
// Add condition to get unpublished own References.
$query
->condition($unpublished_condition);
}
else {
// Return nothing by limit 0 if user has no permissions.
$query
->range(0, 0);
}
}
}
/**
* Implements hook_theme_suggestions_bibcite_reference().
*/
function bibcite_entity_theme_suggestions_bibcite_reference(array $variables) {
$suggestions = [];
/** @var EntityInterface $entity */
$entity = $variables['elements']['#bibcite_reference'];
$sanitized_view_mode = strtr($variables['elements']['#view_mode'], '.', '_');
$suggestions[] = 'bibcite_reference__' . $sanitized_view_mode;
$suggestions[] = 'bibcite_reference__' . $entity
->bundle();
$suggestions[] = 'bibcite_reference__' . $entity
->bundle() . '__' . $sanitized_view_mode;
$suggestions[] = 'bibcite_reference__' . $entity
->id();
$suggestions[] = 'bibcite_reference__' . $entity
->id() . '__' . $sanitized_view_mode;
return $suggestions;
}
/**
* Prepares variables for reference templates.
*
* Default template: bibcite-reference.html.twig.
*
* @param array $variables
* An associative array containing:
* - elements: An array of elements to display in view mode.
* - attributes: HTML attributes for the containing element.
* - bibcite_reference: The reference object.
* - view_mode: View mode; e.g., 'default', 'citation', etc.
*/
function template_preprocess_bibcite_reference(&$variables) {
$variables['view_mode'] = $variables['elements']['#view_mode'];
$variables['bibcite_reference'] = $variables['elements']['#bibcite_reference'];
$variables += [
'content' => [],
];
foreach (Element::children($variables['elements']) as $key) {
$variables['content'][$key] = $variables['elements'][$key];
}
$variables['attributes']['class'][] = 'bibcite-reference';
}
/**
* Prepares variables for reference, themed as table.
*
* Default template: bibcite-reference--table.html.twig.
*
* @param array $variables
* An associative array containing:
* - elements: An array of elements to display in view mode.
* - attributes: HTML attributes for the containing element.
* - bibcite_reference: The reference object.
* - view_mode: View mode; e.g., 'full', 'teaser', etc.
* - rows: Data rows for table view mode.
*
* @see template_preprocess_bibcite_reference()
*/
function template_preprocess_bibcite_reference__table(&$variables) {
$variables['rows'] = [];
foreach (Element::children($variables['elements']) as $key) {
// Do not output empty values.
if (Element::children($variables['elements'][$key])) {
$title = '';
if (isset($variables['elements'][$key]['#title']) && $variables['elements'][$key]['#label_display'] != 'hidden') {
$title = $variables['elements'][$key]['#title'];
}
$variables['elements'][$key]['#title'] = '';
$variables['rows'][] = [
'title' => [
'#markup' => $title,
],
'element' => $variables['elements'][$key],
'attributes' => new Attribute([]),
];
}
}
$variables['attributes']['class'][] = 'bibcite-reference-table';
}
/**
* Implements hook_theme_suggestions_bibcite_contributor().
*/
function bibcite_entity_theme_suggestions_bibcite_contributor(array $variables) {
$suggestions = [];
/** @var EntityInterface $entity */
$entity = $variables['elements']['#bibcite_contributor'];
$sanitized_view_mode = strtr($variables['elements']['#view_mode'], '.', '_');
$suggestions[] = 'bibcite_contributor__' . $sanitized_view_mode;
$suggestions[] = 'bibcite_contributor__' . $entity
->id();
$suggestions[] = 'bibcite_contributor__' . $entity
->id() . '__' . $sanitized_view_mode;
return $suggestions;
}
/**
* Prepares variables for contributor templates.
*
* Default template: bibcite-contributor.html.twig.
*
* @param array $variables
* An associative array containing:
* - elements: An array of elements to display in view mode.
* - attributes: HTML attributes for the containing element.
* - bibcite_contributor: The contributor object.
* - view_mode: View mode.
*/
function template_preprocess_bibcite_contributor(array &$variables) {
$variables['view_mode'] = $variables['elements']['#view_mode'];
$variables['bibcite_contributor'] = $variables['elements']['#bibcite_contributor'];
$variables += [
'content' => [],
];
foreach (Element::children($variables['elements']) as $key) {
$variables['content'][$key] = $variables['elements'][$key];
}
$variables['attributes']['class'][] = 'bibcite-contributor';
}
/**
* Implements hook_theme_suggestions_bibcite_keyword().
*/
function bibcite_entity_theme_suggestions_bibcite_keyword(array $variables) {
$suggestions = [];
/** @var EntityInterface $entity */
$entity = $variables['elements']['#bibcite_keyword'];
$sanitized_view_mode = strtr($variables['elements']['#view_mode'], '.', '_');
$suggestions[] = 'bibcite_keyword__' . $sanitized_view_mode;
$suggestions[] = 'bibcite_keyword__' . $entity
->id();
$suggestions[] = 'bibcite_keyword__' . $entity
->id() . '__' . $sanitized_view_mode;
return $suggestions;
}
/**
* Prepares variables for keyword templates.
*
* Default template: bibcite-keyword.html.twig.
*
* @param array $variables
* An associative array containing:
* - elements: An array of elements to display in view mode.
* - attributes: HTML attributes for the containing element.
* - bibcite_keyword: The keyword object.
* - view_mode: View mode.
*/
function template_preprocess_bibcite_keyword(array &$variables) {
$variables['view_mode'] = $variables['elements']['#view_mode'];
$variables['bibcite_keyword'] = $variables['elements']['#bibcite_keyword'];
$variables += [
'content' => [],
];
foreach (Element::children($variables['elements']) as $key) {
$variables['content'][$key] = $variables['elements'][$key];
}
$variables['attributes']['class'][] = 'bibcite-keyword';
}
/**
* Implements hook_entity_extra_field_info().
*/
function bibcite_entity_entity_extra_field_info() {
$extra = [];
$storage = \Drupal::entityTypeManager()
->getStorage('bibcite_reference_type');
foreach ($storage
->loadMultiple() as $bundle) {
$extra['bibcite_reference'][$bundle
->id()]['display']['citation'] = [
'label' => t('Citation'),
'description' => t('Reference rendered as citation'),
'weight' => 100,
];
$extra['bibcite_reference'][$bundle
->id()]['display']['bibcite_links'] = [
'label' => t('Links'),
'description' => t('Render all available reference links'),
'weight' => 100,
];
$extra['bibcite_reference'][$bundle
->id()]['display']['bibcite_type'] = [
'label' => t('Reference type'),
'description' => t('Reference type, for example Journal Article'),
'weight' => 100,
];
}
return $extra;
}
/**
* Implements hook_preprocess_page().
*/
function bibcite_entity_preprocess_page(&$variables) {
$current_route = \Drupal::routeMatch()
->getRouteName();
if ($current_route === 'entity.bibcite_reference.version_history') {
$variables['#attached']['library'][] = 'bibcite_entity/reference.admin';
}
}
/**
* Implements hook_bibcite_reference_view_alter().
*/
function bibcite_entity_bibcite_reference_view_alter(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display) {
if ($component = $display
->getComponent('bibcite_links')) {
/** @var \Drupal\Component\Plugin\PluginManagerInterface $manager */
$manager = \Drupal::service('plugin.manager.bibcite_link');
$config = \Drupal::config('bibcite_entity.reference.settings');
$build['bibcite_links'] = [
'#type' => 'container',
'#attributes' => [
'class' => [
'bibcite-links',
],
],
'#weight' => $component['weight'],
'links' => [
'#theme' => 'item_list',
'#attributes' => [
'class' => [
'inline',
],
],
'#items' => [],
],
];
$default_link_attributes = [
'enabled' => TRUE,
'weight' => 0,
];
foreach ($manager
->getDefinitions() as $plugin_id => $definition) {
$plugin_config = $config
->get("links.{$plugin_id}") ?: [];
$plugin_config = $plugin_config + $default_link_attributes;
if ($plugin_config['enabled']) {
$instance = $manager
->createInstance($plugin_id);
if ($link = $instance
->build($entity)) {
$build['bibcite_links']['links']['#items'][] = $link + [
'#weight' => $plugin_config['weight'],
];
}
}
}
uasort($build['bibcite_links']['links']['#items'], 'Drupal\\Component\\Utility\\SortArray::sortByWeightProperty');
}
if ($component = $display
->getComponent('bibcite_type')) {
$bundle = ReferenceType::load($entity
->bundle());
$build['bibcite_type'] = [
'#type' => 'container',
'#attributes' => [
'class' => [
'bibcite-type',
],
],
'#weight' => $component['weight'],
'type' => [
'#markup' => Xss::filterAdmin($bundle ? $bundle
->label() : $entity
->bundle()),
],
];
}
}
/**
* Implements hook_form_bibcite_reference_form_alter().
*
* Override reference entity fields attributes and regroups them.
*/
function bibcite_entity_form_bibcite_reference_form_alter(&$form, FormStateInterface $form_state, $form_id) {
/** @var \Drupal\Core\Entity\EntityForm $form_object */
$form_object = $form_state
->getFormObject();
$entity = $form_object
->getEntity();
/* @var \Drupal\bibcite_entity\UIOverrideProvider $override_provider */
$override_provider = \Drupal::service('bibcite.ui_override_provider');
$override_provider
->referenceFormFieldsOverride($form, $entity
->bundle());
$override_provider
->referenceFormTabsRestructure($form);
}
/**
* Implements hook_inline_entity_form_entity_form_alter().
*
* Override fields attributes and regroup them to details.
*/
function bibcite_entity_inline_entity_form_entity_form_alter(&$entity_form, &$form_state) {
if ($entity_form['#entity_type'] === 'bibcite_reference') {
$override_provider = \Drupal::service('bibcite.ui_override_provider');
$override_provider
->referenceFormFieldsOverride($entity_form, $entity_form['#bundle']);
// @todo Make normal tabs in IEF.
$override_provider
->referenceFormDetailsRestructure($entity_form);
}
}
/**
* Implements hook_entity_view_alter().
*
* Override fields titles.
*/
function bibcite_entity_entity_view_alter(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display) {
if ($entity
->getEntityTypeId() == 'bibcite_reference') {
/* @var \Drupal\bibcite_entity\UIOverrideProvider $override_provider */
$override_provider = \Drupal::service('bibcite.ui_override_provider');
$override_provider
->referenceViewFieldsOverride($build, $entity
->bundle());
}
}
/**
* Implements hook_form_entity_view_display_edit_form_alter().
*
* Override fields titles. And label options.
*/
function bibcite_entity_form_entity_view_display_edit_form_alter(&$form, FormStateInterface $form_state, $form_id) {
if ($form['#entity_type'] == 'bibcite_reference') {
/** @var \Drupal\field_ui\Form\EntityViewDisplayEditForm $object */
$object = $form_state
->getBuildInfo()['callback_object'];
$mode = $object
->getEntity()
->getMode();
if ($mode == 'table') {
foreach ($form['fields'] as $key => $value) {
if (is_array($value) && array_key_exists('label', $value)) {
$form['fields'][$key]['label']['#options'] = [
'above' => 'Visible',
'hidden' => '- Hidden -',
];
}
}
}
}
}
/**
* Implements hook_form_entity_form_display_edit_form_alter().
*
* Override fields titles.
*/
function bibcite_entity_form_entity_form_display_edit_form_alter(&$form, FormStateInterface $form_state, $form_id) {
if ($form['#entity_type'] == 'bibcite_reference') {
$bundle_id = $form['#bundle'];
$overrider = \Drupal::service('bibcite.ui_override_provider');
$overrider
->referenceDisplayFormFieldsOverride($form, $bundle_id);
}
}
/**
* Implements hook_modules_installed().
*
* Clear bundles cache after module is installed.
* For some reason bundles does not cached after module installation.
*
* @todo Find what is caused this issue
*/
function bibcite_entity_modules_installed($modules) {
if (in_array('bibcite_entity', $modules)) {
\Drupal::service('entity_type.bundle.info')
->clearCachedBundles();
}
}
/**
* Implements hook_page_top().
*/
function bibcite_entity_page_top(array &$page) {
// Add 'Back to content editing' link on preview page.
$route_match = \Drupal::routeMatch();
if ($route_match
->getRouteName() == 'entity.bibcite_reference.preview') {
$page['page_top']['bibcite_reference_preview'] = [
'#type' => 'container',
'#attributes' => [
'class' => [
'reference-preview-container',
'container-inline',
],
],
];
$form = \Drupal::formBuilder()
->getForm(ReferencePreviewForm::class, $route_match
->getParameter('bibcite_reference_preview'));
$page['page_top']['bibcite_reference_preview']['view_mode'] = $form;
}
}
/**
* Implements hook_help().
*/
function bibcite_entity_help($route_name, RouteMatchInterface $route_match) {
switch ($route_name) {
case 'help.page.bibcite_entity':
$links = [
':ref' => Url::fromRoute('bibcite_entity.reference.settings')
->toString(),
':ref_links' => Url::fromRoute('bibcite_entity.reference.settings.links')
->toString(),
':ref_types' => Url::fromRoute('entity.bibcite_reference_type.collection')
->toString(),
':contrib' => Url::fromRoute('bibcite_entity.contributor.settings')
->toString(),
':contrib_cat' => Url::fromRoute('entity.bibcite_contributor_category.collection')
->toString(),
':contrib_role' => Url::fromRoute('entity.bibcite_contributor_role.collection')
->toString(),
':csl_map' => Url::fromRoute('bibcite_entity.mapping', [
'bibcite_format' => 'csl',
])
->toString(),
];
$module = 'bibcite_entity';
return \Drupal::service('bibcite.help_service')
->getHelpMarkup($links, $route_name, $module);
}
}