YoastSeoConfigForm.php in Real-time SEO for Drupal 8
File
src/Form/YoastSeoConfigForm.php
View source
<?php
namespace Drupal\yoast_seo\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
class YoastSeoConfigForm extends FormBase {
public function getFormId() {
return 'yoast_seo_config_form';
}
public function buildForm(array $form, FormStateInterface $form_state) {
$yoast_seo_manager = \Drupal::service('yoast_seo.manager');
$entity_types = $this
->getAvailableEntityTypes();
foreach ($entity_types as $entity_type => $entity_label) {
$options = $yoast_seo_manager
->getAvailableBundles($entity_type);
$enabled_bundles = $yoast_seo_manager
->getEnabledBundles($entity_type);
$form[$entity_type] = array(
'#type' => 'checkboxes',
'#title' => $this
->t('@label', array(
'@label' => $entity_label,
)),
'#options' => $options,
'#required' => FALSE,
'#default_value' => $enabled_bundles,
);
}
$form['actions'] = array(
'#type' => 'actions',
);
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => $this
->t('Save'),
);
return $form;
}
public function validateForm(array &$form, FormStateInterface $form_state) {
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$yoast_seo_manager = \Drupal::service('yoast_seo.manager');
$entity_types = $this
->getAvailableEntityTypes();
$values = $form_state
->getValues();
$to_attach = [];
$to_detach = [];
foreach ($entity_types as $entity_type_id => $entity_type_label) {
$bundles = $yoast_seo_manager
->getAvailableBundles($entity_type_id);
$enabled_bundles = $yoast_seo_manager
->getEnabledBundles($entity_type_id);
foreach ($bundles as $bundle_id => $bundle_label) {
if (isset($values[$entity_type_id][$bundle_id]) && $values[$entity_type_id][$bundle_id] !== 0 && !in_array($bundle_id, $enabled_bundles)) {
$to_attach[$entity_type_id][] = $bundle_id;
}
elseif (isset($values[$entity_type_id][$bundle_id]) && $values[$entity_type_id][$bundle_id] === 0 && in_array($bundle_id, $enabled_bundles)) {
$to_detach[$entity_type_id][] = $bundle_id;
}
}
}
if (!empty($to_attach)) {
$yoast_seo_manager
->attachFieldHandlerToContentView();
foreach ($to_attach as $entity_type_id => $bundles) {
foreach ($bundles as $bundle_id) {
$yoast_seo_manager
->attachYoastSeoFields($entity_type_id, $bundle_id);
}
}
}
if (!empty($to_detach)) {
if (!empty($to_detach['node'])) {
$node_enabled_bundles = $yoast_seo_manager
->getEnabledBundles('node');
if (count($node_enabled_bundles) == count($to_detach['node'])) {
$yoast_seo_manager
->detachFieldHandlerFromContentView();
}
}
foreach ($to_detach as $entity_type_id => $bundles) {
foreach ($bundles as $bundle_id) {
$yoast_seo_manager
->detachYoastSeoFields($entity_type_id, $bundle_id);
}
}
}
\Drupal::messenger()
->addMessage($this
->t('Real-time SEO configuration by bundles has been saved successfully.'));
}
protected function getAvailableEntityTypes() {
return [
'node' => 'Node',
];
}
}