วิธีการเปลี่ยนเส้นทางไปยังหน้าเว็บที่กำหนดเองหลังจากที่โหนดบันทึกหรือลบ?


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)
สุมิตร Aggarwal

1
คุณแน่ใจหรือว่าฟังก์ชั่นการส่งที่กำหนดเองของคุณถูกเรียกใช้
Eyal

1
อาจเป็นได้ว่าฟังก์ชันส่งอื่นแทนที่การเปลี่ยนเส้นทางที่กำหนดเองในภายหลัง
Eyal

คำตอบ:


7

โดยทั่วไปรหัสจะใช้สำหรับส่งการกระทำเพียงอย่างเดียว แต่รูปแบบการบันทึกโหนด drupal มีการดำเนินการหลายอย่างฉันคิดว่าคุณจะเข้าสู่ระบบในฐานะผู้ดูแลระบบและลองใช้งานจากนั้นทำตามรหัสด้านล่าง

หากคุณต้องการให้สิ่งนี้สามารถใช้กับการกระทำอื่น ๆ ได้นั่นหมายถึงการเข้าสู่ระบบในฐานะผู้ดูแลระบบและเห็นปุ่มบันทึกโหนดคุณจะมีตัวเลือก "บันทึกและเผยแพร่", "บันทึกและยกเลิกการเผยแพร่" ดังกล่าว

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 คุณจะต้องทำสองสิ่ง

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

หากคุณต้องการใช้หน้า Landing Page ที่กำหนดเองคุณเพียงแทนที่การเปลี่ยนเส้นทางด้วยรหัสที่คุณใช้อยู่แล้ว:

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

โปรดทราบว่าสิ่งนี้จะไม่แทนที่เมื่อมีพารามิเตอร์ "ปลายทาง" $ _GET เช่นที่หน้า / admin / เนื้อหา

หากต้องการลบพารามิเตอร์ปลายทางออกจากหน้า / admin / เนื้อหาคุณจะต้องยกเลิกการเลือกช่องทำเครื่องหมาย "ปลายทาง" ภายใต้ "เนื้อหา: ลิงค์การดำเนินงาน (การดำเนินการ)" ในฟิลด์มุมมองนั้น

ป้อนคำอธิบายรูปภาพที่นี่


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

ทำงานให้ฉันด้วย
Insasse

0

ฉันไม่พบสิ่งผิดปกติกับรหัสต้นฉบับดังนั้นอาจมีบางอย่างผิดปกติ มันใช้งานได้ดีสำหรับฉัน

อย่างไรก็ตามcustom.landing.pageต้องเป็นเส้นทางที่กำหนดไว้และพารามิเตอร์ (หากมี) ที่จะต้องผ่านในลักษณะดังนี้:

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

ดูFormState :: setRedirect ()สำหรับรายละเอียด


0

ฉันมักจะใช้โมดูลNode Save Redirectสำหรับฟังก์ชั่นนี้ มันเพิ่มตัวเลือกให้กับประเภทเนื้อหาที่ระบุว่า "จะทำอย่างไรหลังจากบันทึกเนื้อหาใหม่"

นี่คืออะไร?

โมดูลนี้มีวิธีการระบุตำแหน่งเพื่อนำผู้ใช้หลังจากบันทึกเนื้อหาบางส่วน


โมดูลนี้ยังไม่ได้รับการพอร์ตไปยัง Drupal 8 อย่างสมบูรณ์
dxvargas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.