Redirecionar para uma página personalizada depois que um nó foi adicionado ou editado

15

Usando hook_form_alter, como redirecionar um usuário para uma página personalizada após criar ou editar um nó em vez do nó que foi criado ou editado?

O código atual para hook_form_alter()é o seguinte:

function custom_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#id'] == 'custom-node-form') {
    $form['actions']['submit']['#value'] = t('Add Entry');
    $form['field_custom_email']['und'][0]['value']['#element_validate'] = array('_custom_form_validate_email');
  }
}
Citricguy
fonte
"Existe um módulo para isso": Destino do Nó ( drupal.org/project/node_destination ), mas ele está disponível apenas para o D6. Talvez possa ser adaptado.
Benj

Respostas:

16
function custom_form_node_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#node']->type == 'custom') {
    $form['actions']['submit']['#value'] = t('Add Entry');
    $form['field_custom_email']['und'][0]['value']['#element_validate'] = array('_custom_form_validate_email');
    $form['#submit'][] = 'custom_node_submit';
  }
}

function custom_node_submit($form, &$form_state) {
  $form_state['redirect'] = 'choose/your/path';
}

O código redireciona o formulário independentemente do botão clicado para enviar o formulário. Se você deseja redirecionar um formulário apenas quando um botão de envio específico é clicado, use o código a seguir.

function custom_form_node_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#node']->type == 'custom') {
    $form['actions']['submit']['#value'] = t('Add Entry');
    $form['field_custom_email']['und'][0]['value']['#element_validate'] = array('_custom_form_validate_email');
    $form['actions']['submit']['#submit'][] = 'custom_node_submit';
  }
}

function custom_node_submit($form, &$form_state) {
  $form_state['redirect'] = 'choose/your/path';
}

 

  • O ID do formulário não contém hífens. O ID do formulário é o nome da função PHP que gera o formulário (também conhecido como construtor de formulários), e uma função PHP não pode conter hífens em seu nome.
  • O ID do formulário é passado para as implementações de hook_form_alter () , hook_form_BASE_FORM_ID_alter () e hook_form_FORM_ID_alter () . hook_form_FORM_ID_alter()realmente não precisa dele, pois é chamado para um formulário específico, enquanto os outros dois ganchos são chamados para mais de um formulário.
  • A primeira função é a implementação de hook_form_BASE_FORM_ID_alter () ; nesse caso, o ID do formulário base é "node_form", que é o formulário base para o formulário de edição do nó.
  • O formulário de edição do nó contém $form['#node'], que é o objeto do nó que está sendo editado; "custom" é o ID curto do tipo de conteúdo que você deseja redirecionar os usuários depois que eles editam um nó.
  • Mudar $form_state['redirect']de hook_form_alter()não tem nenhum efeito; ele precisa ser definido a partir de um manipulador de envio.
kiamlaluno
fonte
Obrigado por isso. Observe que o &in function custom_node_submit($form, &$form_state) {é muito importante. Caso contrário, você não está passando o estado como referência e as edições feitas manualmente não serão afetadas.
Bram15:
9

Este código funciona em um site Drupal 7.

/**
 * Implements hook_form_alter()
 */

function custom_form_alter(&$form, &$form_state, $form_id) {    
  if ($form_id == 'article_node_form') {
    $form['actions']['submit']['#submit'][] = 'mysubmit_node_submit';
  }     
}

function mysubmit_node_submit($form, &$form_state) {
  $form_state['redirect'] = '/homepage';
}
sea26.2
fonte
Qual resposta você está se referindo como # 4?
Елин Й.
por que isso não está funcionando para mim? Estou usando o mesmo código
ruby
Limpou seu cache @ruby?
Coderama
Para nós existentes, é melhor garantir a desativação do destino primeiro, que normalmente é adicionado ao URL quando você clica no botão editar na admin/contentpágina: drupal.stackexchange.com/a/192271/15055 .
Leymannx
4

Isso pode ser feito configurando $form_state['redirect'], por exemplo, usando uma das seguintes linhas.

$form_state['redirect'] = "some-internal-path";
$form_state['redirect'] = array($path, $options_array, $http_code);

São os mesmos argumentos para os quais você passaria drupal_goto().

Shoaib Nawaz
fonte
Obrigado pelo feedback @Shoaib Nawaz. Adicionei o $ form_state ['redirect'] ao hook_form_alter hook sem sorte.
Citricguy
Durante toda a minha vida, não consigo fazer com que $ form_state ['redirect'] entre em vigor em qualquer lugar.
Citricguy
Isso não funcionará se você tentar redirecionar após um nó ter sido adicionado ou editado. Para ver o porquê, consulte o envio do formulário do nó . Qualquer valor que você atribuir $form_state['redirect']será substituído se for ($node->nid)avaliado como TRUE.
Free Radical
2

Não tenho certeza se essa é uma opção para você, mas se esse é um tipo de conteúdo, você pode conseguir isso rapidamente, usando o módulo Regras, definindo uma regra a ser acionada na atualização ou criação de um determinado tipo de conteúdo.

Aaron Ortega
fonte