2010-04-06 15 views
7

W Drupal można utworzyć własny nodetype w module niestandardowym. Robiąc to, możesz stworzyć własną formę, która jest bardzo przyjemna.Dodawanie js do formularza węzła Drupal

Jednak jeśli chcesz dodać js, formularze stają się nieco bardziej skomplikowane. Jeśli dodasz js w formularzu, js zostanie dodane tylko z formularza po załadowaniu. Jeśli użytkownik wysłałby formularz z błędami walidacji, funkcja formularza nie jest uruchamiana ponownie, a zatem js nie jest dodawany. Normalnie wystarczy utworzyć wywołanie zwrotne menu i dodać js, ale w przypadku formularza dodawania węzła nie będzie to możliwe.

Jakie jest zatem najlepsze rozwiązanie do dodawania js w formularzu dodawania węzła, aby utrzymać go w formie trwałej, gdy formularz nie zostanie zatwierdzony?

+0

To samo dotyczy Drupal Answers: http://drupal.stackexchange.com/questions/70015/adding-css-and-js-to-form-with-attachments – Nux

Odpowiedz

11

Próbuję różnych hacków, znalazłem dość proste rozwiązanie tego problemu, stwórz funkcję tematu dla formularza i dodaj js tam. To wyglądałoby mniej więcej tak:

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

To wywołuje domyślną funkcję kompozycji dla formularza dodawania węzła po dodaniu js. Gdy funkcja tematu jest wywoływana, nawet formularz jest buforowany, to działa ładnie. Aby to zadziałało, musisz również zaimplementować hook_theme.

Aktualizacja dla Drupal 7.

Drupal 7 sprawia, że ​​o wiele łatwiej, jak to jest możliwe do zrobienia

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

Przykładem zastosowania może to być:

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

Interesujące - jestem zaskoczony, że działa to bez tworzenia nieskończonej pętli, ponieważ wywołanie 'theme ('node_form')' może zakończyć się ponownym wywołaniem twojego nadpisania. Czy nie byłoby lepiej umieścić wywołanie 'drupal_add_js' w funkcji' theme_preprocess'? –

+2

@Henrik Opel: Myślę, że funkcja theme_preprocess też by wystraszyła, nie myślałem o tym w tym czasie. Funkcja theme_node_form jest funkcją, która byłaby wywoływana, gdyby nie istniał parametr content_type_node_form, więc nie sądzę, aby nieskończona pętla miała jakiekolwiek niebezpieczeństwo.Ale wydaje mi się, że jest nieco bardziej hackowskie niż użycie funkcji wstępnego przetwarzania tematycznego. – googletorp

+0

Możesz zrobić return theme_node_form ($ form); zamiast motywu powrotu ('node_form', $ form); aby uniknąć nieskończonej pętli. – rooby

2

Napisałem łatkę do modułu Smilies, która rozwiązuje ten problem: Smilies are not selectable when resubmitting a page

Łatka dodaje funkcję hook_nodeapi(), aby sprawdzić, czy operacja węzeł „zweryfikować”, a jeśli tak jest, to sprawdza czy węzła powinien mieć emotikony, a jeśli tak, wywołuje funkcję dodawania pliku javascript uśmieszki, który tworzy formularz wyboru.

Powinieneś po prostu zrobić to samo w twoim przypadku. Będzie to wymagało napisania bardzo prostego modułu, który implementuje funkcję hook_nodeapi i sprawdza aktualizacje w ten sam sposób, w jaki robi to naprawiony moduł Uśmieszki.

+0

Thanx za cynk. Skończyło się na tym, że użyłem funkcji tematu, ponieważ jest to nieco bardziej czyste w tym konkretnym przypadku. – googletorp

0

Możesz użyć użytkownika hook_nodeapi z obudową prepare:

Przykład:

/** 
* 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; 
    } 
} 

Teraz można dodać kod JavaScript w module folderu np myscript.js.

Powiązane problemy