View source
<?php
namespace Drupal\metatag_routes\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Routing\RouteProvider;
use Drupal\Core\Path\PathValidator;
use Drupal\Core\Routing\AdminContext;
class MetatagCustomCreateForm extends FormBase {
protected $entityTypeManager;
protected $routeProvider;
protected $pathValidator;
protected $adminContext;
public function __construct(EntityTypeManagerInterface $entity_type_manager, RouteProvider $route_provider, PathValidator $path_validator, AdminContext $admin_context) {
$this->entityTypeManager = $entity_type_manager;
$this->routeProvider = $route_provider;
$this->pathValidator = $path_validator;
$this->adminContext = $admin_context;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('entity_type.manager'), $container
->get('router.route_provider'), $container
->get('path.validator'), $container
->get('router.admin_context'));
}
public function getFormId() {
return 'ok_metatag_custom_create_form';
}
public function buildForm(array $form, FormStateInterface $form_state) {
$form['metatag_url'] = [
'#type' => 'textfield',
'#title' => $this
->t('Path'),
'#description' => $this
->t('Enter the path for which you want to add the metatags.'),
'#maxlength' => 200,
'#required' => TRUE,
];
$form['route_name'] = [
'#type' => 'hidden',
];
$form['submit'] = [
'#type' => 'submit',
'#value' => $this
->t('Submit'),
];
return $form;
}
public function validateForm(array &$form, FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
$url = trim($form_state
->getValue('metatag_url'));
if (strpos($url, '/') === FALSE) {
$form_state
->setErrorByName('metatag_url', $this
->t('The path must begin with /'));
return FALSE;
}
$url_object = $this->pathValidator
->getUrlIfValid($url);
if ($url_object) {
$route_name = $url_object
->getRouteName();
$route_object = $this->routeProvider
->getrouteByName($route_name);
if ($this->adminContext
->isAdminRoute($route_object)) {
$form_state
->setErrorByName('metatag_url', $this
->t('The admin routes should not have metatags.'));
return FALSE;
}
$params = $url_object
->getRouteParameters();
$entity_type = !empty($params) ? key($params) : NULL;
if (isset($entity_type) && in_array($entity_type, [
'node',
'taxonomy_term',
])) {
$form_state
->setErrorByName('metatag_url', $this
->t('The entities routes metatags must be added by fields. @entity_type - @id', [
'@entity_type' => $entity_type,
'@id' => $params[$entity_type],
]));
return FALSE;
}
$ids = $this->entityTypeManager
->getStorage('metatag_defaults')
->getQuery()
->condition('id', $route_name)
->execute();
if ($ids) {
$form_state
->setErrorByName('metatag_url', $this
->t('There are already metatags created for this route.'));
return FALSE;
}
$form_state
->setValue('route_name', $route_name);
}
else {
$form_state
->setErrorByName('metatag_url', $this
->t('The path does not exist as an internal Drupal route.'));
}
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$route_name = $form_state
->getValue('route_name');
$url = $form_state
->getValue('metatag_url');
if ($route_name && $url) {
$entity = $this->entityTypeManager
->getStorage('metatag_defaults')
->create([
'id' => $route_name,
'label' => $url,
]);
$entity
->save();
$this
->messenger()
->addStatus($this
->t('Created metatags for the path: @url. Internal route: @route.', [
'@url' => $url,
'@route' => $route_name,
]));
$form_state
->setRedirect('entity.metatag_defaults.edit_form', [
'metatag_defaults' => $route_name,
]);
}
else {
$this
->messenger()
->addError($this
->t('The metatags could not be created for the path: @url.', [
'@url' => $url,
]));
$form_state
->setRedirect('entity.metatag_defaults.collection');
}
}
}