Same name and namespace in other branches
  1. 8.x-1.x entity_redirect.module \entity_redirect_submit() 1 comment

Submit function to handle the redirection per entity create/edit action.

1 call to entity_redirect_submit()
entity_redirect_new in ./entity_redirect.module
Submit function to handle the redirection per entity create/edit action.
1 string reference to 'entity_redirect_submit'
entity_redirect_form_alter in ./entity_redirect.module
Implements hook_form_alter().

File

./entity_redirect.module, line 200

Code

function entity_redirect_submit($form, FormStateInterface $form_state) {
    
    /** @var \Drupal\Core\Entity\EntityFormInterface $form_object */
    $form_object = $form_state->getFormObject();
    if (!is_a($form_object, '\\Drupal\\Core\\Entity\\EntityFormInterface')) {
        return;
    }
    $entity = $form_object->getEntity();
    if (is_a($entity, '\\Drupal\\Core\\Entity\\ContentEntityBase')) {
        
        /** @var \Drupal\Core\Entity\ContentEntityBase $entity */
        $entity_type = $entity->getEntityType();
        if (!($bundle_type = $entity_type->getBundleEntityType())) {
            return;
        }
        
        /** @var \Drupal\Core\Config\Entity\ConfigEntityBundleBase $bundle */
        $bundle = \Drupal::entityTypeManager()->getStorage($bundle_type)
            ->load($entity->bundle());
        if (!($options = $bundle->getThirdPartySetting('entity_redirect', 'redirect'))) {
            return;
        }
        $user = \Drupal::currentUser();
        if ($user->isAnonymous() && !empty($options['anonymous']['active'])) {
            $settings = $options['anonymous'];
        }
        elseif (is_a($form_object, 'Drupal\\Core\\Entity\\ContentEntityDeleteForm')) {
            if (empty($options['delete']['active'])) {
                return;
            }
            $settings = $options['delete'];
        }
        elseif ($form_state->has('entity_redirect_new')) {
            if (empty($options['add']['active'])) {
                return;
            }
            $entity->save();
            $settings = $options['add'];
        }
        else {
            if (empty($options['edit']['active'])) {
                return;
            }
            $settings = $options['edit'];
        }
        if ($settings['destination'] != 'default') {
            // Remove the default destination parameter.
            \Drupal::request()->query
                ->remove('destination');
        }
        switch ($settings['destination']) {
            case 'add_form':
                $route_provider = \Drupal::service('router.route_provider');
                $routes = array_keys($route_provider->getRoutesByNames([
                    "{$entity_type->id()}.add",
                    "entity.{$entity_type->id()}.add_form",
                ]));
                $form_state->setRedirect($routes[0], [
                    $bundle_type => $bundle->id(),
                ]);
                break;
            case 'edit_form':
                $route_provider = \Drupal::service('router.route_provider');
                $routes = array_keys($route_provider->getRoutesByNames([
                    "{$entity_type->id()}.edit",
                    "entity.{$entity_type->id()}.edit_form",
                ]));
                $form_state->setRedirect($routes[0], [
                    $entity_type->id() => $entity->id(),
                ]);
                break;
            case 'created':
                $form_state->setRedirect("entity.{$entity_type->id()}.canonical", [
                    $entity_type->id() => $entity->id(),
                ]);
                break;
            case 'url':
                if (empty($settings['url'])) {
                    return;
                }
                $form_state->setRedirectUrl(Url::fromUri('internal:' . $settings['url']));
                break;
            case 'previous_page':
                $http_referer = $form_state->getValue('http_referer');
                $pos = strpos($http_referer, \Drupal::request()->getHost());
                $referer_path = substr($http_referer, $pos + strlen(\Drupal::request()->getHost()));
                $form_state->setRedirectUrl(Url::fromUri('internal:' . $referer_path));
                break;
            case 'layout_builder':
                $form_state->setRedirectUrl(Url::fromUri('internal:' . $entity->toUrl()
                    ->toString() . '/layout'));
                break;
            case 'external':
                if (empty($settings['external'])) {
                    return;
                }
                $response = new TrustedRedirectResponse($settings['external']);
                $form_state->setResponse($response);
        }
    }
}