Düğüm kaydedildikten veya silindikten sonra özel sayfaya nasıl yönlendirme yapılır?


10

Ne yapmaya çalışıyorum, hala / node / {id} yönlendirilir:

function hook_form_alter(&$form, $form_state, $form_id) {
  $form['actions']['submit']['#submit'][] = 'callback_set_redirect';
}
function callback_set_redirect($form, FormStateInterface $form_state) {
  $form_state->setRedirect('custom.landing.page');
}

2
Ben buldum /core/modules/node/src/NodeForm.php If saving is an option, privileged users get dedicated form submit buttons to adjust the publishing status while saving in one go. @todo This adjustment makes it close to impossible for contributed modules to integrate with "the Save operation" of this form. Modules need a way to plug themselves into 1) the ::submit() step, and 2) the ::save() step, both decoupled from the pressed form button.
olsav

1
[ Drupal.org/project/rulesülür(Rules) modülünü kullanabilirsiniz .
Sumit Aggarwal

1
Özel gönderme işlevinizin bile çağrıldığından emin misiniz?
Eyal

1
Başka bir gönderme işlevi de daha sonra özel yönlendirmenizi geçersiz kılabilir.
Eyal

Yanıtlar:


7

Temelde kod sadece eylem göndermek için çalışacaktır, ancak drupal düğüm kaydetme formunun birçok eylemi vardır, bence yönetici olarak oturum açmış ve deniyorsunuz, sonra aşağıdaki kodu takip edersiniz.

bunun diğer eylemler için de çalışmasını istiyorsanız, Yönetici olarak giriş yapın ve düğüm kaydet düğmesini görün, "kaydet ve yayınla", "kaydet ve yayından kaldır" seçeneğini seçmiş olursunuz. söylendiği gibi

use Drupal\Core\Form\FormStateInterface;

//hook_form_alter
function hook_form_alter(&$form, $form_state, $form_id) {
  foreach (array_keys($form['actions']) as $action) {
    if ($action != 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
      $form['actions'][$action]['#submit'][] = 'callback_submit';
    }
  }
}


function callback_submit($form, FormStateInterface $form_state) {
  $form_state->setRedirect('custom.page');
}

4

Hook_form_alter kullanarak iki şey yapmanız gerekir

1) bunun bir düğüm formu olduğundan emin olun 2) her gönderme düğmesine özel bir gönderme işleyicisi ekleyin.

function mymodule_form_alter(&$form, FormStateInterface $form_state, $form_id) {

  if (isset($form['#entity_type']) && $form['#entity_type'] == 'node') {
    foreach (array_keys($form['actions']) as $action) {
      if ($action != 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
        $form['actions'][$action]['#submit'][] = 'mymodule_node_form_submit';
      }
    }
  }
}

Sonra gönderme fonksiyonu için, istediğiniz mantığı kullanabilirsiniz. Geçerli kullanıcının erişim izinlerine göre kanonik düğüm sayfasına veya ön sayfaya gönderdiği NodeForm :: save ile karşılaştırabilirsiniz.

Bu davranışı geçerli düğüm formunda kalacak şekilde değiştirmek istiyorsanız, bunu yapabilirsiniz:

function mymodule_node_form_submit($form, FormStateInterface $form_state) {
  $node = $form_state->getFormObject()->getEntity();
  if ($node->id()) {
    if ($node->access('edit')) {
      $form_state->setRedirect(
        'entity.node.edit_form',
        ['node' => $node->id()]
      );
    }
    else {
      $form_state->setRedirect('<front>');
    }
  }
}

Özel açılış sayfanızı kullanmak istiyorsanız, yönlendirmeyi yalnızca kullandığınız kodla değiştirmeniz yeterlidir:

$form_state->setRedirect('custom.landing.page');

/ Admin / content sayfasındaki gibi bir "hedef" $ _GET parametresi olduğunda bunun geçersiz olmayacağını unutmayın.

Destination parametresini / admin / content sayfasından kaldırmak için, bu görünüm alanlarındaki "İçerik: İşlem bağlantıları (İşlemler)" altındaki "hedef" onay kutusunun işaretini kaldırmak istersiniz.

resim açıklamasını buraya girin


1

Symfony RedirectResponse'yi kullanarak başarılı oldum:

function callback_set_redirect($form, FormStateInterface $form_state) {
  $url = Url::fromRoute("custom.landing.page")->toString();
  $response = new RedirectResponse($url);
  $response->send();
}

Gerekirse, fareyle üzerine gelme modüllerinin yönlendirmeyi değiştirmesine izin vermediği için bir yanıt kullanmamalısınız.
kiamlaluno

Benim için de çalıştı.
Insasse

0

Başka bir şey muhtemelen yanlış olduğunu böylece orijinal kod ile yanlış bir şey bulamıyorum. Benim için iyi çalışıyor.

Ancak, custom.landing.pagetanımlı bir rota olmalı ve (eğer varsa) parametrelerin şu şekilde aktarılması gerekir:

  $form_state->setRedirect("custom.landing.page", [
    'parameter1' => 42,
  ]);

Ayrıntılar için bkz. FormState :: setRedirect () .


0

Bu işlevsellik için her zaman Node Save Redirect modülünü kullanıyorum. Bir içerik türüne "yeni içeriği kaydettikten sonra ne yapmalı" yazan bir seçenek ekler.

Bu nedir?

Bu modül, bir içerik parçasını kaydettikten sonra kullanıcıyı alacak bir konum belirlemek için bir yöntem sağlar.


Bu modül henüz Drupal 8'e tam olarak taşınmadı.
dxvargas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.