Najlepsza praktyka dla klucza języka dla „und” w hook_form_alter


30

Modyfikuję w formularzu w moim module niestandardowym. Kod wygląda następująco:

function my_module_form_alter(&$form, &$form_state, $form_id) {

    if ($form_id == "someID") {

        $form['field_charity_author']['und'][0]['value']['#value'] = arg(3);
        //$form['field_charity_author']['#type'] = 'hidden';

    }

}

Myślę jednak, że kodowanie undjest złe. Jaki powinien być właściwy sposób prawidłowej modyfikacji pól formularza w tym przypadku?


Ten komentarz jest prawdopodobnie nieistotny, ponieważ został zadany dawno temu. Jednym prostym sposobem jest użycie go za pomocą foreachpętli. Jeśli jest to po prostu LANGUAGE_NONE, to jest to pojedynczy przebieg. W sensie form_alter powinno ono technicznie zmieniać bez względu na język formy.
AyeshK

Odpowiedzi:


40

Niestety twoja odpowiedź nie jest tak uniwersalna. Język pola i język węzła to nie to samo.
Język pola jest potrzebny tylko wtedy, gdy używasz interfejsu API tłumaczenia pola (na przykład Tłumaczenie encji ). Kiedy zaczniesz go używać, niektóre pola są konwertowane na możliwe do przetłumaczenia.

Pola do tłumaczenia mają kod języka, co naprawdę ma sens. Ale jeśli pola nie można przetłumaczyć, kod języka zawsze będzie (i dla wszystkich typów treści, encji itp.) -LANGUAGE_NONE (najlepiej użyć stałej, LANGUAGE_NONEa nie ciągu 'und').
Dzięki temu rozwiązaniu możesz uzyskać sytuację, gdy węzeł jest rosyjski, ale korzysta z niego pole LANGUAGE_NONE.
Na szczęście pola są dołączane do formularza za pomocą '#language'klucza, który zawsze zawiera poprawny kod języka.

$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang][0]['value']['#value'] = $value;

Jeśli nie masz dostępu do załączonego formularza, funkcje interfejsu API języka polowego mogą być przydatne.


4
To jedyna poprawna odpowiedź w tym wątku.
Bojan Zivanovic

Tej metody można również użyć podczas przywracania ścieżki pola obrazu węzła / typu treści. Dzięki
Jayaram R

10

Jeśli znasz typ jednostki i pakiet, użyj czegoś takiego jak następujący kod, który wywołuje field_language () .

$field_language = field_language('node', $node, 'field_charity_author');  
$form['field_charity_author'][$field_language][0]['value']['#value'] = arg(3);

Wypracuje właściwy język i będzie działał w witrynach wielojęzycznych.

Zobacz także field_get_items () .


To poprawny sposób interfejsu API.
Nikit

Co jeśli węzeł nie został utworzony?
AgA

@Nikit Nie jestem pewien, ponieważ język wyświetlania i język formularza nie są takie same. Autor zmienia formę i może być formą do utworzenia nowego węzła lub dodania nowego tłumaczenia istniejącego węzła.
kalabro

@kalabro - język wyświetlania i język formularza - to samo w obecnym kontekście.
Nikit

4

Całość und sprawa jest jedną z bardziej irytujących rzeczy w Drupal 7, która nie działała tak dobrze w praktyce, jak wtedy, gdy została zaprojektowana.

W każdym razie możesz uzyskać pierwszy język, używając array_keystakiego:

function my_module_form_alter(&$form, &$form_state, $form_id) {

  if ($form_id == "someID") {
      $langs = array_keys($form['field_charity_author']);
      $form['field_charity_author'][$langs[0]][0]['value']['#value'] = arg(3);
  }
}

To powinno działać cały czas.


Dzięki za odpowiedź. Wklejam to, co zrobiłem, aby rozwiązać ten problem, w innej odpowiedzi. :)
Shafiul

Czy mogę używać $ langs do uzyskiwania dostępu do wartości tego samego pola w formularzu?
AgA

Czy to naprawdę bezpieczne? Czy możesz być pewien, że $ langs [0] jest zawsze właściwym elementem tablicy?
rooby

0

(Odpowiadając na moje pytanie, na wypadek, gdyby to komuś pomogło. Odpowiedź zadziałała dla mnie).

Mogę napisać następujący wiersz, aby uzyskać język:

$lang = $form['language']['#value'];    //  Instead of "und"

5
To jest źle. Zobacz odpowiedź kalabro .
Bojan Zivanovic

0

re: odpowiedź kalabro

jego kod nie działał dla mnie - mój kod jest trochę inny

$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang]['#value'] = $value;

[$ lang] [0] zwrócił „u”, ale pełna wartość [$ lang] to „und” i ja też nie potrzebowałem [„wartości”], ponieważ $ form ['FIELDNAME'] ['# język' ] nie był tablicą, był łańcuchem.


1
0 znak „und” to „u”. Jesteś w labiryncie krętych małych pasaży, wszystkie tablice.
Chris Burgess,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.