View source
<?php
namespace Drupal\auto_entitylabel\Form;
use Drupal\auto_entitylabel\AutoEntityLabelManager;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Routing\RouteMatchInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class AutoEntityLabelForm extends ConfigFormBase {
protected $configFactory;
protected $entityTypeManager;
protected $routeMatch;
private $moduleHandler;
private $user;
protected $entityType;
protected $entityBundle;
protected $entityTypeBundleOf;
public function __construct(ConfigFactoryInterface $config_factory, EntityTypeManagerInterface $entity_type_manager, RouteMatchInterface $route_match, ModuleHandlerInterface $moduleHandler, AccountInterface $user) {
parent::__construct($config_factory);
$this->entityTypeManager = $entity_type_manager;
$this->routeMatch = $route_match;
$route_options = $this->routeMatch
->getRouteObject()
->getOptions();
$array_keys = array_keys($route_options['parameters']);
$this->entityType = array_shift($array_keys);
$entity_type = $this->routeMatch
->getParameter($this->entityType);
$this->entityBundle = $entity_type
->id();
$this->entityTypeBundleOf = $entity_type
->getEntityType()
->getBundleOf();
$this->moduleHandler = $moduleHandler;
$this->user = $user;
}
protected function getEditableConfigNames() {
return [
'auto_entitylabel.settings',
];
}
public function getFormId() {
return 'auto_entitylabel_settings_form';
}
public static function create(ContainerInterface $container) {
return new static($container
->get('config.factory'), $container
->get('entity_type.manager'), $container
->get('current_route_match'), $container
->get('module_handler'), $container
->get('current_user'));
}
protected function getConfigName() {
return 'auto_entitylabel.settings.' . $this->entityTypeBundleOf . '.' . $this->entityBundle;
}
public function buildForm(array $form, FormStateInterface $form_state) {
$config = $this
->config($this
->getConfigName());
$options = [
AutoEntityLabelManager::DISABLED => $this
->t('Disabled'),
AutoEntityLabelManager::ENABLED => $this
->t('Automatically generate the label and hide the label field'),
AutoEntityLabelManager::OPTIONAL => $this
->t('Automatically generate the label if the label field is left empty'),
AutoEntityLabelManager::PREFILLED => $this
->t('Automatically prefill the label'),
];
$options_description = [
AutoEntityLabelManager::DISABLED => [
'#description' => $this
->t('Selecting this option will disable the auto labels for the entity.'),
],
AutoEntityLabelManager::ENABLED => [
'#description' => $this
->t('Selecting this option will hide the title field and will generate a new option based on the pattern provided below.'),
],
AutoEntityLabelManager::OPTIONAL => [
'#description' => $this
->t('Selecting this option will make the label field optional and will generate a label if the label field is left empty.'),
],
AutoEntityLabelManager::PREFILLED => [
'#description' => $this
->t('Selecting this option will prefills the label field with the generated pattern provided below. This option provides limited token support because it only prefills the label and it will not be able to replace all the tokens like current node based tokens for ex: [node:nid] because that token has not been generated yet.'),
],
];
$invisible_state = [
'invisible' => [
':input[name="status"]' => [
'value' => AutoEntityLabelManager::DISABLED,
],
],
];
$form['auto_entitylabel'] = [
'#type' => 'fieldset',
'#title' => $this
->t('Automatic label generation for @type', [
'@type' => $this->entityBundle,
]),
'#weight' => 0,
];
$form['auto_entitylabel']['status'] = [
'#type' => 'radios',
'#default_value' => $config
->get('status') ?: 0,
'#options' => $options,
];
$form['auto_entitylabel']['status'] += $options_description;
$form['auto_entitylabel']['pattern'] = [
'#type' => 'textarea',
'#title' => $this
->t('Pattern for the label'),
'#description' => $this
->t('Leave blank for using the per default generated label. Otherwise this string will be used as label. Use the syntax [token] if you want to insert a replacement pattern.'),
'#default_value' => $config
->get('pattern') ?: '',
'#attributes' => [
'class' => [
'pattern-label',
],
],
'#states' => $invisible_state,
];
if ($this->moduleHandler
->moduleExists('token')) {
$token_type = strtr($this->entityTypeBundleOf, [
'taxonomy_' => '',
]);
$form['auto_entitylabel']['token_help'] = [
'#type' => 'container',
'#states' => $invisible_state,
'token_link' => [
'#theme' => 'token_tree_link',
'#token_types' => [
$token_type,
],
'#dialog' => TRUE,
],
];
}
else {
$form['auto_entitylabel']['pattern']['#description'] .= ' ' . $this
->t('To get a list of available tokens install <a href=":drupal-token" target="blank">Token</a> module.', [
':drupal-token' => 'https://www.drupal.org/project/token',
]);
}
$form['auto_entitylabel']['escape'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Remove special characters.'),
'#description' => $this
->t('Check this to remove all special characters.'),
'#default_value' => $config
->get('escape'),
'#states' => $invisible_state,
];
$form['auto_entitylabel']['preserve_titles'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Preserve already created node titles.'),
'#description' => $this
->t('Check this to preserve the titles of the nodes that were already created.'),
'#default_value' => $config
->get('preserve_titles'),
'#states' => [
'visible' => [
':input[name="status"]' => [
'value' => AutoEntityLabelManager::ENABLED,
],
],
],
];
$form['#attached']['library'][] = 'auto_entitylabel/auto_entitylabel.admin';
$form['auto_entitylabel']['save'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Re-save'),
'#description' => $this
->t('Re-save all labels.'),
'#default_value' => $config
->get('save'),
];
$form['auto_entitylabel']['chunk'] = [
'#type' => 'number',
'#title' => $this
->t('Chunk size'),
'#description' => $this
->t('Number of entities to be processed per batch operation.'),
'#default_value' => 50,
'#min' => 1,
];
return parent::buildForm($form, $form_state);
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$config = $this->configFactory
->getEditable($this
->getConfigName());
$form_state
->cleanValues();
foreach ([
'status',
'pattern',
'escape',
'preserve_titles',
'save',
'chunk',
] as $key) {
$config
->set($key, $form_state
->getValue($key));
}
$storage = $this->entityTypeManager
->getStorage($this->entityType);
$entity_type = $storage
->getEntityType();
$prefix = $entity_type
->getConfigPrefix();
$bundle = $entity_type
->getBundleOf();
$config
->set('dependencies', [
'config' => [
$prefix . '.' . $this->entityBundle,
],
]);
$config
->save();
if ($config
->get('save')) {
$this
->setBatch($this->entityBundle, $bundle, $config
->get('chunk'));
}
parent::submitForm($form, $form_state);
}
protected function setBatch($entity_type, $bundle, $chunk) {
$ids = $this
->getIds($entity_type, $bundle);
$chunks = array_chunk($ids, $chunk);
$num_chunks = count($chunks);
$operations = [];
for ($chunk_iterator = 0; $chunk_iterator < $num_chunks; $chunk_iterator++) {
$operations[] = [
'\\Drupal\\auto_entitylabel\\Batch\\ResaveBatch::batchOperation',
[
$chunks[$chunk_iterator],
[
$bundle,
],
],
];
}
$batch = [
'title' => $this
->t('Re-saving labels'),
'progress_message' => $this
->t('Completed @current out of @total chunks.'),
'finished' => '\\Drupal\\auto_entitylabel\\Batch\\ResaveBatch::batchFinished',
'operations' => $operations,
];
batch_set($batch);
}
public function getIds($entity_type, $bundle) {
$query = $this->entityTypeManager
->getStorage($bundle)
->getQuery();
switch ($bundle) {
case 'taxonomy_term':
return $query
->condition('vid', $entity_type, 'IN')
->execute();
case 'media':
return $query
->condition('bundle', $entity_type, 'IN')
->execute();
case 'comment':
return $query
->condition('comment_type', $entity_type, 'IN')
->execute();
default:
return $query
->condition('type', $entity_type, 'IN')
->execute();
}
}
}