arch-8.x-1.x-dev/modules/compare/src/Form/CompareConfigForm.php
modules/compare/src/Form/CompareConfigForm.php
<?php
namespace Drupal\arch_compare\Form;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Config\TypedConfigManagerInterface;
use Drupal\Core\Entity\EntityDisplayRepositoryInterface;
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Path\PathValidatorInterface;
use Drupal\Core\Routing\RequestContext;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Provides settings for arch_compare module.
*/
class CompareConfigForm extends ConfigFormBase {
public function __construct(
ConfigFactoryInterface $config_factory,
protected PathValidatorInterface $pathValidator,
protected RequestContext $requestContext,
protected EntityDisplayRepositoryInterface $entityDisplayRepository,
protected TypedConfigManagerInterface $typedConfigManager,
) {
parent::__construct(
$config_factory,
$typedConfigManager
);
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('config.factory'),
$container->get('path.validator'),
$container->get('router.request_context'),
$container->get('entity_display.repository'),
$container->get('config.typed'),
);
}
/**
* {@inheritdoc}
*/
public function getFormId() {
return 'arch_compare_config_form';
}
/**
* {@inheritdoc}
*/
protected function getEditableConfigNames() {
return [
'arch_compare.settings',
];
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state) {
$config = $this->config('arch_compare.settings');
$form['limit'] = [
'#type' => 'select',
'#options' => $this->getLimitOptions(),
'#title' => $this->t('Compare max limit', [], ['context' => 'arch_compare_settings']),
'#default_value' => $config->get('limit'),
'#description' => $this->t('Compare queue max limit.', [], ['context' => 'arch_compare_settings']),
];
$form['view_mode'] = [
'#type' => 'select',
'#options' => $this->getViewModeOptions(),
'#title' => $this->t('Product display', [], ['context' => 'arch_compare_settings']),
'#default_value' => $config->get('view_mode'),
'#description' => $this->t('Display view mode on compare page.', [], ['context' => 'arch_compare_settings']),
];
$form['compare_selection_preservation_time'] = [
'#title' => $this->t('Preserve compare selection for', [], ['context' => 'arch_compare_settings']),
'#type' => 'select',
'#options' => $this->timeLimitOptions(),
'#default_value' => $config->get('compare_selection_preservation_time'),
];
return parent::buildForm($form, $form_state);
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
$this->config('arch_compare.settings')
->set('limit', (int) $form_state->getValue('limit'))
->set('compare_selection_preservation_time', (int) $form_state->getValue('compare_selection_preservation_time'))
->set('view_mode', $form_state->getValue('view_mode'))
->save();
parent::submitForm($form, $form_state);
}
/**
* Get limit options.
*
* @return array
* Limit options.
*/
protected function getLimitOptions() {
$options = range(2, 10);
return array_combine($options, $options);
}
/**
* Get view mode options.
*
* @return string[]
* View mode options.
*/
protected function getViewModeOptions() {
$view_modes = $this->entityDisplayRepository->getViewModes('product');
$view_mode_options = [];
foreach ($view_modes as $view_mode_key => $view_mode) {
$view_mode_options[$view_mode_key] = $view_mode['label'];
}
return $view_mode_options;
}
/**
* Get time limit options.
*
* @return array
* Time limit options.
*/
protected function timeLimitOptions() {
$options = [];
$options[0] = $this->t('- Selection not expire -', [], ['context' => 'arch_compare_settings']);
// One day is 60 * 60 * 24 = 8640 seconds.
for ($days = 1; $days <= 7; $days++) {
$options[86400 * $days] = $this->formatPlural(
$days,
'1 day',
'@days days',
['@days' => $days],
['context' => 'arch_compare_settings']
);
}
return $options;
}
}
