Best Practice für Sprachschlüssel für "und" in hook_form_alter

30

Ich ändere ein Formular in meinem benutzerdefinierten Modul. Code sieht so aus:

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';

    }

}

Ich denke jedoch, dass Hardcodierung undschlecht ist. Wie sollten Formularfelder in diesem Fall ordnungsgemäß geändert werden?

Shafiul
quelle
Dieser Kommentar ist wahrscheinlich irrelevant, da er vor langer Zeit gefragt wurde. Eine einfache Methode, die ich mithilfe einer foreachSchleife verwende. Wenn es nur LANGUAGE_NONE ist, ist das ein einzelner Lauf. Im Sinne von form_alter sollte es die Sprache des Formulars technisch ändern.
AyeshK

Antworten:

40

Leider ist Ihre Selbstantwort nicht so universell. Feldsprache und Knotensprache sind nicht dasselbe.
Die Feldsprache wird nur benötigt, wenn Sie die Feldübersetzungs-API verwenden (z. B. Entitätsübersetzung ). Wenn Sie es verwenden, werden einige Felder in übersetzbar konvertiert.

Übersetzbare Felder haben einen Sprachcode, was wirklich Sinn macht. Ist das Feld jedoch nicht übersetzbar, lautet der Sprachcode immer (und für alle Inhaltstypen, Entitäten usw.) - LANGUAGE_NONE(am besten die Konstante LANGUAGE_NONEund nicht die Zeichenfolge 'und').
Mit Ihrer Lösung können Sie eine Situation erhalten, in der ein Knoten russisch ist, aber ein Feld des Knotens verwendet LANGUAGE_NONE.
Glücklicherweise werden Felder mit dem '#language'Schlüssel an das Formular angehängt , das immer den richtigen Sprachcode enthält.

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

Wenn Sie keinen Zugriff auf das angehängte Formular haben, können die API-Funktionen von Field Language hilfreich sein.

kalabro
quelle
4
Dies ist die einzig richtige Antwort in diesem Thread.
Bojan Zivanovic
Diese Methode kann auch verwendet werden, um den Bildfeldpfad eines Knotens / Inhaltstyps abzurufen. Vielen Dank
Jayaram R
10

Wenn Sie den Entitätstyp und das Bundle kennen, verwenden Sie den folgenden Code, der field_language () aufruft. .

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

Es wird die richtige Sprache herausfinden und auf mehrsprachigen Websites funktionieren.

Schauen Sie sich auch field_get_items () an .

Attiks
quelle
Dies korrekt als API-Weg.
Nikit
Was ist, wenn der Knoten nicht erstellt wurde?
AgA
@ Nikit Ich bin nicht sicher, weil Anzeigesprache und Formularsprache nicht identisch sind. Der Autor ändert eine Form und kann eine Form zum Erstellen eines neuen Knotens oder zum Hinzufügen einer neuen Übersetzung eines vorhandenen Knotens sein.
Kalabro
@kalabro - Anzeigesprache und Formularsprache - im aktuellen Kontext dasselbe.
Nikit
4

Das Ganze undist eines der nervigsten Dinge in Drupal 7, die in der Praxis nicht so gut funktionierten wie bei der Entwicklung.

Wie auch immer, Sie können die erste Sprache folgendermaßen erhalten array_keys:

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);
  }
}

Das sollte die ganze Zeit funktionieren.

googletorp
quelle
Danke für deine Antwort. Ich füge ein, was ich getan habe, um dieses Problem in einer anderen Antwort zu beheben. :)
Shafiul
Kann ich mit $ langs auch auf den Wert desselben Feldes im form_state zugreifen?
AgA
Ist das wirklich sicher? Können Sie sicher sein, dass $ langs [0] immer das richtige Array-Element ist?
Rooby
0

(Beantworte meine eigene Frage, falls es jemandem hilft. Die Antwort hat bei mir funktioniert.)

Ich kann folgende Zeile schreiben, um die Sprache zu erhalten:

$lang = $form['language']['#value'];    //  Instead of "und"
Shafiul
quelle
5
Das ist falsch. Siehe die Antwort von kalabro .
Bojan Zivanovic
0

Re: Kalabros Antwort

Sein Code hat bei mir nicht funktioniert - mein Code ist ein bisschen anders

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

[$ lang] [0] gab "u" zurück, aber der volle Wert von [$ lang] ist "und" und ich brauchte auch den ['value'] nicht, weil $ form ['FIELDNAME'] ['# language' ] war kein Array, es war eine Zeichenfolge.

decibel.places
quelle
1
Das 0. Zeichen von 'und' ist 'u'. Sie befinden sich in einem Labyrinth von verwinkelten kleinen Passagen, allesamt Arrays.
Chris Burgess