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?

Shafiul
źródło
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.

kalabro
źródło
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 () .

Attiks
źródło
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.

googletorp
źródło
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"
Shafiul
źródło
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.

decibel.places
źródło
1
0 znak „und” to „u”. Jesteś w labiryncie krętych małych pasaży, wszystkie tablice.
Chris Burgess,