আমার একটি কাস্টম মডিউল রয়েছে যা একটি ফর্ম প্রদর্শন করে।
ফর্মটি জমা দেওয়ার পরে, আমি ব্যবহারকারীকে একটি ভিন্ন পৃষ্ঠাতে পুনর্নির্দেশ করতে চাই।
আমি এটা কিভাবে করবো?
আমার একটি কাস্টম মডিউল রয়েছে যা একটি ফর্ম প্রদর্শন করে।
ফর্মটি জমা দেওয়ার পরে, আমি ব্যবহারকারীকে একটি ভিন্ন পৃষ্ঠাতে পুনর্নির্দেশ করতে চাই।
আমি এটা কিভাবে করবো?
উত্তর:
জমা হ্যান্ডলারে আপনি করেন do
ড্রুপাল 7:
$form_state['redirect'] = 'url';
ড্রুপাল 8:
$form_state->setRedirect('route', $args, $options);
$form_state->setRedirectUrl(\Drupal\Core\Url);
/my-form?destination=node/123
।
এটি লক্ষ্য করা উচিত যে এখানে বেশ কয়েকটি ট্রিগার রয়েছে যা একটি পুনঃনির্দেশকে আটকাতে পারে:
$form_state['redirect'] === FALSE
: যদি সেট করা থাকে তবে ফর্ম বিল্ডার ফাংশন বা ফর্মের বৈধতা / জমা হ্যান্ডলার কোনও ব্যবহারকারীকে পুনঃনির্দেশিত করতে চায় না, যার অর্থ হল যে অনুরোধ drupal_goto()
করা হয়নি। বেশিরভাগ ফর্মের জন্য, পুনর্নির্দেশের যুক্তি $form_state['redirect']
অপরিজ্ঞাত বা মিথ্যা কিনা তা নির্বিশেষে একই হবে । তবে, যদি এটি সংজ্ঞায়িত না হয় এবং বর্তমান অনুরোধটিতে একটি 'গন্তব্য' ক্যোয়ারী স্ট্রিং রয়েছে, drupal_goto()
পরিবর্তে সেই প্রদত্ত গন্তব্যটিতে পুনর্নির্দেশ করা হবে। শুধু সেটিং $form_state['redirect']
করার FALSE
কোনো ফেরৎ প্রতিরোধ করবে।$form_state['no_redirect'] === TRUE
: সেট করা থাকলে, কলব্যাক যা মূলত ফর্মটি তৈরি করেছিল তাতে কোনও পুনঃনির্দেশকে স্পষ্টভাবে মঞ্জুরি দেয় না, এর মধ্যে পুনঃনির্দেশ মান নির্বিশেষে $form_state['redirect']
। উদাহরণস্বরূপ, কোনও পুনর্নির্দেশ রোধ করতে একটি এজেএক্স কলব্যাকে ফর্ম তৈরি করার সময় ajax_get_form()
সংজ্ঞা দেয় $form_state['no_redirect']
। $form_state['no_redirect']
ফর্ম বিল্ডার ফাংশন বা ফর্ম বৈধকরণ / জমা হ্যান্ডলারগুলি দ্বারা পরিবর্তন করা উচিত নয়।$form_state['programmed'] === TRUE
: মানে ফর্ম জমা দেওয়ার মাধ্যমে সাধারণত অনুরোধ করা drupal_form_submit()
হত, সুতরাং যে কোনও পুনর্নির্দেশটি হ'ল স্ক্রিপ্টটি ভেঙে ফেলবে drupal_form_submit()
।$form_state['rebuild'] === TRUE
: এর অর্থ ফর্মটি পুনঃনির্দেশ ছাড়াই পুনর্নির্মাণ করা দরকার।ড্রুপাল 7 এর জন্য, আমি এটি একটি কাস্টম মডিউলে চেষ্টা করেছি এবং এটি কাজ করে। এটি একটি থিম ব্যবহার করা যেতে পারে:
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';
}
বিটিডাব্লু, আমি এই স্নিপেটটি এখানে পেয়েছি: https://gist.github.com/postrational/5768796
ড্রুপাল 8 এ একটি বাহ্যিক URL এ পুনঃনির্দেশ করতে, TrustedRedirectResponse
নিম্নোক্ত কোড হিসাবে ক্লাসটি ব্যবহার করুন ।
$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);
use
কীওয়ার্ড এবং এর নাম use Drupal\Core\Routing\TrustedRedirectResponse;
ডি 8 এ আমি এটি পছন্দ করেছি (তবে এটি কাজ করবে না ... নীচে দেখুন):
/**
* 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])
);
}
}
/ সম্পাদনা
আমি অনুপস্থিত ছিল যে মডিউলটি জমা দেওয়ার পরে setRedirect / setRedirectUrl কাজ করে, সুতরাং এটি ডি 8-তে আমার কার্যনির্বাহী সমাধান:
/**
* 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 );
}
আশা করি এটি সাহায্য করতে পারে