View source
<?php
namespace Drupal\avatars\Form;
use Drupal\avatars\Entity\AvatarKitService;
use Drupal\avatars\Entity\AvatarKitServiceInterface;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class AvatarKitServicesForm extends ConfigFormBase {
protected $preferenceCacheBackend;
public function __construct(ConfigFactoryInterface $config_factory, CacheBackendInterface $preferenceCacheBackend) {
parent::__construct($config_factory);
$this->preferenceCacheBackend = $preferenceCacheBackend;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('config.factory'), $container
->get('cache.avatars.entity_preference'));
}
protected function getEditableConfigNames() : array {
return [];
}
public function getFormId() : string {
return 'avatars_settings';
}
public function buildForm(array $form, FormStateInterface $form_state) : array {
$headers = [
'label' => $this
->t('Service'),
'plugin' => $this
->t('Plugin'),
'weight' => $this
->t('Weight'),
'operations' => $this
->t('Operations'),
];
$table_drag_group = 'avatar-service-weight';
$form['services'] = [
'#type' => 'table',
'#header' => $headers,
'#empty' => $this
->t('No avatar service instances found.'),
'#tabledrag' => [
[
'action' => 'order',
'relationship' => 'sibling',
'group' => $table_drag_group,
],
],
'#default_value' => [],
];
$instances = AvatarKitService::loadMultiple();
uasort($instances, [
AvatarKitService::class,
'sort',
]);
foreach ($instances as $instance) {
$row = [];
$row['#attributes']['class'][] = 'draggable';
$row['label']['#plain_text'] = $instance
->label();
$definition = $instance
->getPlugin()
->getPluginDefinition();
$row['plugin']['#plain_text'] = $definition['label'] ?? '';
$row['weight'] = [
'#type' => 'weight',
'#title' => $this
->t('Weight'),
'#title_display' => 'invisible',
'#default_value' => $instance
->getWeight(),
'#attributes' => [
'class' => [
$table_drag_group,
],
],
];
$row['operations'] = [
'#type' => 'operations',
'#links' => $this
->getOperations($instance),
];
$id = $instance
->id();
$form['services'][$id] = $row;
}
return parent::buildForm($form, $form_state);
}
public function submitForm(array &$form, FormStateInterface $form_state) : void {
parent::submitForm($form, $form_state);
$this->preferenceCacheBackend
->invalidateAll();
foreach ($form_state
->getValue('services') as $id => $row) {
$instance = AvatarKitService::load($id);
$instance
->setWeight($row['weight'])
->save();
}
}
protected function getOperations(AvatarKitServiceInterface $instance) : array {
$operations = [];
if ($instance
->access('update')) {
$operations['edit'] = [
'title' => $this
->t('Edit'),
'weight' => 10,
'url' => $instance
->toUrl('edit-form'),
];
}
if ($instance
->access('delete')) {
$operations['delete'] = [
'title' => $this
->t('Delete'),
'weight' => 100,
'url' => $instance
->toUrl('delete-form'),
];
}
return $operations;
}
}