2011-05-06 72 views
9

Tôi có biểu mẫu, là biểu mẫu quản trị chặn mặc định. Đó là dạng chuẩn mà mọi người sử dụng để chỉnh sửa nội dung khối, khả năng hiển thị, v.v. Khi người dùng lưu biểu mẫu, drupal chuyển hướng người dùng đến trang quản trị khối.Chuyển hướng tùy chỉnh sau khi gửi biểu mẫu

Bây giờ, tôi muốn đưa người dùng đến một trang khác, ví dụ: trang chủ, sau khi gửi biểu mẫu chặn quản trị. Có một số cách để đạt được điều này, nhưng drupal khuyến cáo sử dụng phương pháp hook_alter_form như mô tả here

Tôi đã viết một tập tin .module gọi là 'formdest' chứa sau:

function formdest_form_alter(&$form, $form_state, $form_id) { 
switch ($form_id) { 
case 'block-admin-configure': 
    $form_state['redirect'] = '/home'; 
    break; 
} 
} 

và tập tin .info để đi cùng với nó:

; $Id: custom.info,v 1.0 2011/01/01 21:55:00 author Exp $ 
name = formdest 
description = form destination 
package = Other 
core = 6.x 

version = "6.x" 
project = "custom" 
datestamp = "1229018427" 

Mô-đun tùy chỉnh của tôi hiển thị trong danh sách mô-đun và tôi có thể kích hoạt nó, do đó kích hoạt chuyển hướng. Nhưng khi tôi kiểm tra nó, drupal vẫn đưa tôi đến trang quản trị khối thay vì đến trang chủ ..

Không có thông báo lỗi trong cả bản ghi hệ thống hoặc tường lửa, vì vậy tôi hơi thất bại. Bất kỳ bạn mã hóa các vị thần có bất kỳ ý tưởng?

Trả lời

22

Thêm trình xử lý gửi vào hook_form_alter() và đặt ghi đè ở đó.

function mymodule_form_alter(&$form, &$form_state, $form_id) { 
    if ($form_id == 'my_form') { 
    $form['#submit'][] = 'my_submit_handler'; 
    } 
} 

function my_submit_handler(&$form, &$form_state) { 
    $form_state['redirect'] = 'home'; 
} 
+0

cảm ơn đề xuất Yorirou, tôi vừa sửa đổi mô-đun và thêm trình xử lý gửi. Nhưng chuyển hướng vẫn không đưa tôi về nhà, và một lần nữa không có lỗi. Tôi bắt đầu nghĩ rằng tôi có thể sử dụng id dạng sai hoặc một cái gì đó như thế, sẽ làm một số sửa lỗi hơn –

+1

chỉnh sửa - Phải, đoạn mã của Yorirou đã hoạt động (các phương pháp trước đây của tôi cũng có vẻ hoạt động), vấn đề là tôi không sử dụng dấu gạch dưới trong id biểu mẫu. Khi tôi thay thế dấu gạch nối với dấu gạch dưới, mọi thứ hoạt động như một nét duyên dáng. –

+2

mẹo nhỏ có thể tiết kiệm thời gian: nếu chuyển hướng biểu mẫu không hoạt động, hãy đảm bảo rằng $ form_state ["rebuild"] = FALSE; –

1

Tôi đã đấu tranh với làm một chuyển hướng năng động trong drupal 6 dựa trên nơi người dùng đến từ và đây là những gì tôi đã đưa ra, tôi hy vọng nó sẽ giúp người khác:

function mymodule_form_alter(&$form, &$form_state, $form_id){ 
    if($need_to_redirect){ 
     /*add a form field to the form, you could also add this value to a 
       session or cookie,but if the user is logged in/out based on this 
       action the session will be rebuilt*/ 
     $form['my_redirect']=array(
      '#type' => 'hidden', 
      '#value'=>isset($form_state['post']['my_redirect'])?$form_state['post']['my_redirect']:trim(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_PATH),'/') 
     ); 
    } 
    if(isset($form_state['post']['my_redirect'])){ 
     /*if there is a redirect set for the form add an extra submit handler, 
       this ensures that in cases like a node form our redirect will get 
       set last*/ 
     $form['#submit'][]='my_custom_redirect'; 
     //unset this so it doesn't override our custom redirect 
     if(isset($form['#redirect'])) unset($form['#redirect']); 
    } 
} 
function my_custom_redirect($form,&$form_state){ 
    $router_item = menu_get_item($form_state['values']['my_redirect']); 
    //make sure the user has access to this menu item, if not just ignore it 
    if ($router_item && $router_item['access']) { 
     $form_state['redirect']=$form_state['values']['my_redirect']; 
    } 
}; 

Rõ ràng là $need_to_redirect nên được thay thế bằng một công tắc hoặc nếu kiểm tra tùy thuộc vào sở thích của bạn form_alter

+0

Giải pháp hoàn hảo như thay đổi biểu mẫu sẽ không ảnh hưởng đến việc gửi biểu mẫu theo cùng một biểu mẫu ở các địa điểm khác – killbill

3

của nó đơn giản như 1 2 3

  1. Tạo trang Tùy chỉnh chỉ với tiêu đề, tức là Cảm ơn bạn đã liên hệ với chúng tôi. Bây giờ, hãy chuyển đến "Cài đặt đường dẫn URL" của trang này và bỏ chọn "Bí danh tự động" và nhập url trang tùy chỉnh của bạn tức là cảm ơn bạn.

  2. Xóa bí danh URL mặc định cho biểu mẫu web tức là [nút: tiêu đề] và lưu cài đặt. Vì vậy, trang url của bạn sẽ là site.com/thank-you

  3. Chỉnh sửa biểu mẫu web đó -> Chuyển đến tab Cài đặt biểu mẫu, trong phần "Vị trí chuyển hướng" đặt "URL tùy chỉnh" làm trang mới được tạo ở bước 1 .

Tận hưởng!

-2

Điều gì đó khiến tôi phát điên và thậm chí tức giận tôi một chút trong câu trả lời của mọi người là sử dụng form_alter để chuyển hướng THAY THẾ hành động gửi và không đơn giản là PHỤ LỤC chức năng mới của tôi. Trong trường hợp của tôi (và khá nhiều chủ đề khác tôi đọc), tôi vẫn cần thực hiện hành động biểu mẫu. Tôi chỉ muốn chuyển hướng nó ở một nơi khác sau đó. Chuyển hướng của tôi đã hoạt động tốt, nhưng biểu mẫu của tôi không được gửi hoặc dữ liệu được lưu.

Khi tôi quay trở lại và đọc lại tài liệu form_alter, tôi nhận ra rằng $ form ['actions'] là một mảng và do đó có thể chấp nhận các hành động khác vào mảng của nó!Đối với bất kỳ ai khác đang đấu tranh với điều này, không sử dụng số điện thoại

$ [[action]] ['submit'] ['# submit'] [] = 'myform_redirect_to_myfunction';

Thay vì chỉ đơn giản là thêm callback của bạn đến các mảng $ form sử dụng array_shift hoặc array_unshift (tùy thuộc vào thứ tự những gì bạn muốn các chức năng để thực hiện:

array_shift ($ form [ '# submit'], 'myform_redirect_to_myfunction');

tôi hy vọng điều này sẽ giúp người khác

+2

Chỉ cần giải thích lý do tại sao điều này đã được giảm giá: (a) Câu trả lời ở trên KHÔNG thay thế các hành động gửi hiện tại (nếu đó là những gì đã xảy ra với bạn) nó sai); (b) những gì bạn đang đề xuất - thay đổi/thêm chức năng #submit trên nút gửi - khác với việc thay đổi/thêm vào các hàm #submit trên biểu mẫu chính; Và (c) nhận được tất cả cảm xúc là vô ích (đặc biệt là khi bạn không chính xác). – Adaddinsane

Các vấn đề liên quan