Ho un modulo personalizzato che visualizza un modulo.
Al momento dell'invio del modulo, desidero reindirizzare l'utente a una pagina diversa.
Come lo posso fare?
Ho un modulo personalizzato che visualizza un modulo.
Al momento dell'invio del modulo, desidero reindirizzare l'utente a una pagina diversa.
Come lo posso fare?
Risposte:
Nel gestore di invio lo fai
Drupal 7:
$form_state['redirect'] = 'url';
Drupal 8:
$form_state->setRedirect('route', $args, $options);
$form_state->setRedirectUrl(\Drupal\Core\Url);
/my-form?destination=node/123
.
Va notato che ci sono diversi trigger che possono impedire un reindirizzamento:
$form_state['redirect'] === FALSE
: Se impostato, la funzione di creazione del modulo o il gestore di convalida / invio del modulo non desidera che un utente venga reindirizzato, il che significa che drupal_goto()
non viene invocato. Per la maggior parte dei moduli, la logica di reindirizzamento sarà la stessa indipendentemente dal fatto che $form_state['redirect']
non sia definita o FALSE. Tuttavia, nel caso in cui non sia stato definito e la richiesta corrente contenga una stringa di query "destinazione", drupal_goto()
verrà invece reindirizzata a quella destinazione specificata. Solo l'impostazione $form_state['redirect']
su FALSE
impedisce qualsiasi reindirizzamento.$form_state['no_redirect'] === TRUE
: Se impostato, il callback che ha originariamente creato il modulo non consente esplicitamente alcun reindirizzamento, indipendentemente dal valore di reindirizzamento in $form_state['redirect']
. Ad esempio, ajax_get_form()
definisce $form_state['no_redirect']
quando si crea un modulo in un callback AJAX per impedire il reindirizzamento. $form_state['no_redirect']
NON deve essere modificato dalle funzioni del generatore di moduli o dai gestori di convalida / invio dei moduli.$form_state['programmed'] === TRUE
: significa che l'invio del modulo è stato solitamente invocato tramite drupal_form_submit()
, quindi qualsiasi reindirizzamento interromperebbe lo script che ha invocato drupal_form_submit()
.$form_state['rebuild'] === TRUE
: significa che il modulo deve essere ricostruito senza reindirizzamento.Per Drupal 7, l'ho provato su un modulo personalizzato e funziona. Può anche essere usato in un tema:
function my_theme_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'contact_site_form') {
$form['#submit'][] = 'contact_form_submit_handler';
}
}
function contact_form_submit_handler(&$form, &$form_state) {
$form_state['redirect'] = 'thank-you-page-alias';
}
A proposito, ho trovato questo frammento qui: https://gist.github.com/postrational/5768796
Per reindirizzare a un URL esterno in Drupal 8, usa la TrustedRedirectResponse
classe, come nel seguente codice.
$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);
use
parola chiave e il suo spazio dei nomi:use Drupal\Core\Routing\TrustedRedirectResponse;
Su D8 mi è piaciuto questo (ma questo non funzionerà ... vedi sotto):
/**
* Implements hook_form_FORM_ID_alter().
*/
function MYMODULE_form_FORM_ID_form_alter( array &$form, FormStateInterface $form_state, $form_id ) {
// Force redirect to "/thankyou" page
$url = "/thankyou";
$path = \Drupal::service('path.alias_manager')->getPathByAlias($url);
if(preg_match('/node\/(\d+)/', $path, $matches)) {
$form_state->setRedirect('entity.node.canonical',
array('node' => $matches[1])
);
}
}
Modificare/
Mi mancava che setRedirect / setRedirectUrl funzioni DOPO che il modulo è stato inviato, quindi questa è la mia soluzione di lavoro su D8:
/**
* Implements hook_form_FORM_ID_alter().
*/
function MYMODULE_form_FORM_ID_form_alter( array &$form, FormStateInterface $form_state, $form_id ) {
$form['actions']['submit']['#submit'][] = 'MYFORM_redirect_handler';
}
function MYFORM_redirect_handler($form, FormStateInterface $form_state) {
// Force redirect to "/sent"
$dest_url = "/sent";
$url = Url::fromUri('internal:' . $dest_url);
$form_state->setRedirectUrl( $url );
}
Spero che questo possa aiutare