funder_field-1.1.0-alpha1/src/Form/FunderFieldUninstallValidatorForm.php
src/Form/FunderFieldUninstallValidatorForm.php
<?php
namespace Drupal\funder_field\Form;
use Drupal\Core\Form\FormStateInterface;
use Drupal\field\Entity\FieldConfig;
use Symfony\Component\HttpFoundation\RedirectResponse;
class FunderFieldUninstallValidatorForm extends \Drupal\Core\Form\ConfigFormBase
{
/**
* @var ItemsToDelete
*/
protected $items_to_delete;
/**
* {@interitdoc}
*/
public function getFormId() {
return 'funder_field_uninstall_settings';
}
/**
* {@interitdoc}
*/
protected function getEditableConfigNames() {
return [
'funder_field.uninstall_settings'
];
}
/**
* Shows the fields that are required to be deleted before the funder field can be unstallled
*
* {@interitdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state) {
$weight = 0;
$form['title'] = [
'#markup' => $this->t('<div><b>FUNDER FIELDS</b></div>'),
'#weight' => $weight++,
];
$form['break1'] = [
'#markup' => '<hr>',
'#weight' => $weight++,
];
$entityTypeManager = \Drupal::service('entity_type.manager');
$contentTypes = $entityTypeManager->getStorage('node_type')->loadMultiple();
foreach ($contentTypes as $contentType) {
$type = $contentType->id();
$fields = array_filter(
\Drupal::service('entity_field.manager')->getFieldDefinitions('node', $type),
function ($fieldDefinition) {
return $fieldDefinition instanceof \Drupal\field\FieldConfigInterface;
}
);
// String to search in entity_reference_revisions
$searchStr = 'funder';
foreach ($fields as $key => $definition) {
if($definition->getType() == "funder_field") {
$this->items_to_delete[$type][] = $key;
}
if($definition->getType() == "entity_reference_revisions" && str_contains($key, $searchStr)) {
$this->items_to_delete[$type][] = $key;
}
}
}
$body = "<br/><ul>";
if(isset($this->items_to_delete)) {
foreach ($this->items_to_delete as $type => $fieldsArray) {
foreach ($fieldsArray as $fieldName) {
$body .= "<li> $fieldName ($type) </li>";
}
}
}
$body .= "</ul>";
$form['body'] = [
'#markup' => $this->t("<div>
$body<br/>
This action cannot be undone.<br/>
Make a backup of your database if you want to be able to restore these items.
</div>"),
'#weight' => $weight++,
];
$form['actions']['submit_cancel'] = [
'#type' => 'submit',
'#weight' => $weight++,
'#value' => t('Cancel'),
'#submit' => [[static::class, '_custom_form_cancel']],
'#limit_validation_errors' => [],
];
return parent::buildForm($form, $form_state);
}
/**
* Cancel Button on the form
* {@interitdoc}
*/
public static function _custom_form_cancel(array &$form, FormStateInterface $form_state) {
$host = \Drupal::request()->getSchemeAndHttpHost();
$path = $host.'/admin/modules/uninstall';
$response = new RedirectResponse($path);
$response->send();
return;
}
/**
* On submit, execute delete operation of the fields shown on form
* {@interitdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state)
{
// Deleting field.
// FieldConfig::loadByName('node', 'page', 'field_funder_page')->delete();
// Deleting field storage.
// FieldStorageConfig::loadByName('node', 'field_funder2')->delete();
$is_deleted = FALSE;
if(isset($this->items_to_delete)) {
foreach ($this->items_to_delete as $type => $fieldsArray) {
foreach ($fieldsArray as $fieldName) {
$is_deleted = TRUE;
$field = FieldConfig::loadByName('node', $type, $fieldName);
if ($field) {
// Delete field.
$field->delete();
}
}
}
if($is_deleted) {
// Run cron job to clean up the fields
$cron = \Drupal::service('cron');
$cron->run();
}
$this->messenger()->addMessage($this->t('All funder fields deleted'));
}
else {
$this->messenger()->addMessage($this->t('Nothing to delete'));
}
$host = \Drupal::request()->getSchemeAndHttpHost();
$path = $host.'/drupal/admin/modules/uninstall';
$response = new RedirectResponse($path);
$response->send();
return;
parent::submitForm($form, $form_state);
}
}
