2010-04-06 39 views
7

Trong Drupal, bạn có thể tạo nodetype của riêng mình trong một mô-đun tùy chỉnh. Làm điều này bạn sẽ có được để tạo ra hình thức của riêng bạn mà là tất cả rất tốt đẹp.Thêm js vào biểu mẫu nút drupal

Tuy nhiên, nếu bạn muốn thêm js, mọi thứ trở nên phức tạp hơn một chút. Nếu bạn thêm js vào biểu mẫu, js sẽ chỉ được thêm vào biểu mẫu khi nó được tải. Nếu người dùng sẽ đăng biểu mẫu có lỗi xác thực, thì hàm biểu mẫu sẽ không chạy lại và do đó js không được thêm vào. Thông thường bạn chỉ cần tạo một menu gọi lại và thêm js ở đó, nhưng đối với nút thêm biểu mẫu, đây sẽ không phải là một giải pháp khả thi.

Vì vậy, giải pháp tốt nhất để thêm js vào biểu mẫu thêm nút là gì, để giữ cho nó tồn tại khi biểu mẫu không xác thực?

+0

Tương tự trên các câu trả lời của Drupal: http://drupal.stackexchange.com/questions/70015/adding-css-and-js-to-form-with-attachments – Nux

Trả lời

11

Thử một số lỗ hổng khác nhau, tôi đã tìm thấy một giải pháp khá đơn giản cho vấn đề này, tạo ra một chức năng chủ đề cho biểu mẫu và thêm các js vào đó. Điều đó sẽ trông giống như sau:

function theme_content_type_node_form($form) { 
    drupal_add_js(...); 
    return theme('node_form', $form); 
} 

Điều này chỉ gọi chức năng chủ đề mặc định cho biểu mẫu thêm nút sau khi thêm js. Vì chức năng chủ đề được gọi ngay cả khi biểu mẫu được lưu vào bộ nhớ cache, nó hoạt động độc đáo. Bạn cũng cần phải thực hiện hook_theme để thực hiện công việc này.

Cập nhật cho Drupal 7.

Drupal 7 làm cho điều này dễ dàng hơn nhiều vì nó có thể làm

$form['#attached']['js'][] = 'path_to_js_file; 

Một ví dụ của việc sử dụng này có thể là:

$form['#attached']['js'][] = drupal_get_path('module', 'foo') . '/js/foo.form.js'; 
+4

Thú vị - Tôi ngạc nhiên rằng điều này làm việc mà không tạo ra một vòng lặp vô hạn, như lời gọi đến 'chủ đề ('node_form')' có thể kết thúc cuộc gọi của bạn override một lần nữa. Sẽ không tốt hơn nếu đặt lệnh 'drupal_add_js' trong một hàm' theme_preprocess'? –

+2

@Henrik Opel: Tôi đoán rằng một chức năng theme_preprocess sẽ làm được điều này, tôi không nghĩ về nó vào thời điểm đó. Hàm theme_node_form là hàm sẽ được gọi nếu content_type_node_form không tồn tại, vì vậy tôi không nghĩ rằng một vòng lặp vô hạn là bất kỳ mối nguy hiểm nào.Nhưng tôi đoán nó là một chút hackish hơn là chỉ sử dụng chức năng preprocess chủ đề s. – googletorp

+0

Bạn có thể trả về theme_node_form ($ form); thay vì trả về chủ đề ('node_form', $ form); để tránh lặp vô hạn. – rooby

2

tôi đã đăng một bản vá để module Smilies điều này khắc phục vấn đề này: Smilies are not selectable when resubmitting a page

Các miếng vá thêm một chức năng hook_nodeapi() để kiểm tra xem các hoạt động nút là "xác minh" và nếu có, nó sẽ kiểm tra nếu nút được cho là có mặt cười và nếu như vậy gọi hàm để thêm tệp javascript smileys.js tạo ra biểu mẫu lựa chọn.

Bạn chỉ cần thực hiện tương tự trong trường hợp của mình. Điều này sẽ yêu cầu bạn viết một mô-đun rất đơn giản, thực hiện hàm hook_nodeapi và kiểm tra các bản cập nhật theo cách tương tự như mô-đun Smileys vá.

+0

Thanx cho mẹo. Tôi đã kết thúc bằng cách sử dụng một chức năng chủ đề để làm các trick vì nó sạch hơn một chút trong trường hợp cụ thể này. – googletorp

0

Bạn có thể sử dụng hook_nodeapi với trường hợp prepare:

Ví dụ:

/** 
* Implementation of hook_nodeapi 
*/ 

function mymodulename_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { 
    switch($op) {  
    case 'prepare': 
     $module_path = drupal_get_path('module' , 'mymodulename'); 
     drupal_add_js($module_path."/myscript.js"); 
     break; 
    } 
} 

Bây giờ bạn có thể thêm mã javascript vào thư mục mô-đun của mình, ví dụ: myscript.js.

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