it-swarm.com.de

Was ist die beste Vorgehensweise beim Arbeiten mit der Sprache [und]?

Ich beginne dieses Formular zu verwenden, um auf Daten in meinem Modul zuzugreifen. (Siehe Kommentar Nr. 1 .)

$node->field_test[$node->language][0]['value']

Ich dachte, das sieht nach einer ziemlich guten Lösung aus, aber weiter unten fand ich dieselbe Frage: this :

Nehmen Sie nicht an, dass 'und' für Felder von Entitäten ohne Sprache gilt, sondern auch für Felder, die nicht übersetzbar sind, und ohne das Entitätsübersetzungsmodul, bei dem es sich ausschließlich um Felder handelt. Darüber hinaus gibt es Unterschiede zwischen den verschiedenen 7.x-Versionen von Drupal.
Verwenden Sie besser die Funktion field_get_items(), die für Sie aussortiert, unter welchem ​​Sprachcode die Daten gespeichert sind.

Und jetzt weiß ich nicht, ob das, was ich benutze, etwas auf der Straße kaputt machen könnte.

51
Merrick

Ich finde, dass die Verwendung des Moduls Entity API eine große Hilfe ist und auch den Code lesbarer macht. Der obige Code funktioniert nicht immer, da die Sprache des Knotens und die Sprache des Feldes unterschiedlich sein können.

Mit dem Entity-API-Modul und seinem Wrapper können Sie den folgenden Code verwenden:

 $node_wrapper = entity_metadata_wrapper('node', $node);
 $field_val = $node_wrapper->field_test->value();

Dies sollte kugelsicher sein. Eine Sache bei der Verwendung des Entitätsmoduls ist, dass beim Versuch, auf ein nicht vorhandenes Feld zuzugreifen, anstelle eines Hinweises und eines falschen Verhaltens ein böser Fehler und eine Ausnahme ausgelöst werden.

Um dies zu vermeiden, können Sie dies versuchen/fangen

try {
  $field_val = $node_wrapper->field_doesnt_exist->value();
} catch (EntityMetadataWrapperException $e) {
  $field_val = 'default/fallback value';
}

Oder Sie können isset() verwenden, das EntityMetadataWrapper intern verarbeitet:

$field_val = 'default/fallback value';
if (isset($node_wrapper->field_doesnt_exist)) {
  $field_val = $node_wrapper->field_doesnt_exist->value();
}
39
googletorp

Zum Lesen sollten Sie immer field_get_items () verwenden können, um die richtige Sprache für Sie auszuwählen und zu überprüfen, ob das Feld Werte enthält.

Leider ist die Feld-API in 7.x sehr eingeschränkt, es gibt keine Möglichkeit, z. Das erste Feldelement, trauen Sie sich nicht einmal, mit einem einzigen Funktionsaufruf nach dem Wert zu fragen ... Und es gibt kein Gegenstück zu field_set_items ().

Ja, das Entity-API-Modul bietet eine schönere API mit dem Nachteil, dass es auch einen erheblichen Overhead mit sich bringt (es konvertiert im Grunde jeden einzelnen Wert in Wrapper-Objekte, an die Tonnen von verschachtelten Eigenschaftsinfo-Arrays angehängt sind). Wenn Sie versuchen, einen Entity-Wrapper zu sichern, erhalten Sie normalerweise entweder nichts oder eine Wand aus unlesbaren Arrays.

19
Berdir