metatag-8.x-1.x-dev/metatag_page_manager/metatag_page_manager.module
metatag_page_manager/metatag_page_manager.module
<?php
/**
* @file
* Contains metatag_page_manager.module.
*/
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\metatag\Entity\MetatagDefaults;
use Drupal\page_manager\Entity\PageVariant;
/**
* Implements hook_form_FORM_ID_alter().
*/
function metatag_page_manager_form_metatag_defaults_add_form_alter(&$form, FormStateInterface $form_state, $form_id) {
$variants_options['Page Variants'] = _metatag_page_manager_get_variants();
$form['id']['#options'] = array_merge($form['id']['#options'], $variants_options);
}
/**
* Returns all available page variants.
*
* @return string[]
* A list of page variants keyed by label.
*/
function _metatag_page_manager_get_variants() {
/** @var \Drupal\page_manager\Entity\PageVariant[] $variants */
$variants = PageVariant::loadMultiple();
$variant_options = [];
// Load all metatag defaults so we can filter the variants which already have
// a metatag default configured.
$metatag_defaults = MetatagDefaults::loadMultiple();
foreach ($variants as $key => $variant) {
$id = $variant->getEntityType()->id() . '__' . $key;
if (!isset($metatag_defaults[$id])) {
$label = $variant->getPage()->label() . ' : ' . $variant->label();
$variant_options[$id] = $label;
}
}
return $variant_options;
}
/**
* Implements hook_metatag_alter().
*/
function metatag_page_manager_metatags_alter(array &$metatags, array &$context) {
if (!$context['entity'] instanceof PageVariant) {
return;
}
$key = $context['entity']->getEntityType()->id() . '__' . $context['entity']->id();
$metatag_variant = MetatagDefaults::load($key);
if ($metatag_variant) {
$metatags = array_merge($metatags, $metatag_variant->get('tags'));
}
}
/**
* Implements hook_metatag_route_entity().
*/
function metatag_page_manager_metatag_route_entity(RouteMatchInterface $route_match) {
if ($variant = $route_match->getParameter('page_manager_page_variant')) {
return $variant;
}
if (strpos($route_match->getRouteName(), 'page_manager.page_view') === 0) {
$page_variant_id = $route_match->getRouteObject()->getDefault('_page_manager_page_variant');
return PageVariant::load($page_variant_id);
}
}
