Як виконати переадресацію на користувацьку сторінку після збереження чи видалення вузла?


10

Те, що я намагаюся зробити, не працює, я все одно переспрямовуюсь до / node / {id}:

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
Це я знайшов у /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 снимки ( Rules) .
Суміт Агарвал

1
Ви впевнені, що ваша спеціальна функція подання навіть викликається?
Eyal

1
Можливо також, що інша функція надсилання перекриє ваш власний переадресацію пізніше.
Eyal

Відповіді:


7

В основному код буде працювати лише для подання дій, але у формі збереження для друз-вузлів є багато дій, я думаю, ви б увійшли як адміністратор і спробували його, а потім дотримуйтесь коду нижче.

якщо ви хочете, щоб це працювало і для інших дій, це означає, що увійдіть як адміністратор і побачите кнопку збереження вузла, у вас буде опція вибору "зберегти та опублікувати", "зберегти та скасувати публікацію". як вже згадувалось

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

Використовуючи гачку_форму_алтер, вам потрібно буде зробити дві речі

1) переконайтеся, що це форма вузла 2) додайте користувальницький обробник подання до кожної кнопки подання.

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';
      }
    }
  }
}

Тоді для функції подання ви можете використовувати будь-яку логіку, яку ви хочете. Ви можете порівняти з NodeForm :: save, де він надсилає вас або на сторінку канонічного вузла, або на головну сторінку, виходячи з поточних прав доступу користувача.

Якщо ви хотіли змінити цю поведінку, щоб вона залишалася у поточній формі вузла, ви можете зробити це:

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>');
    }
  }
}

Якщо ви хочете скористатися власною цільовою сторінкою, ви просто заміните переспрямування кодом, який ви вже використовуєте:

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

Зауважте, що це не буде замінено, якщо є параметр $ _GET "призначення", наприклад, на сторінці / admin / content.

Щоб видалити параметр призначення зі сторінки / admin / content, вам потрібно зняти прапорець "призначення" у розділі "Зміст: Посилання операцій (Операції)" у цих полях перегляду.

введіть тут опис зображення


1

Я мав успіх у використанні Symfony RedirectResponse:

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

Не слід використовувати відповідь, оскільки це не дозволяє модулям наведення курсора змінювати переадресацію, якщо це необхідно.
kiamlaluno

Працював і для мене.
Інсасс

0

Я не можу знайти щось неправильне з оригінальним кодом, тому щось інше, мабуть, не так. Це прекрасно працює для мене.

Однак custom.landing.pageповинен бути визначений маршрут та параметри (якщо такі є) потрібно пропустити так:

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

Докладніше див. У FormState :: setRedirect () .


0

Я завжди використовую модуль Node Save Redirect для цієї функціональності. Він додає опцію до типу вмісту, який говорить "що робити після збереження нового вмісту".

Що це?

Цей модуль надає метод визначення місця для користувача після збереження фрагмента вмісту.


Цей модуль ще не був повністю перенесений на Drupal 8.
dxvargas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.