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

51

Ich fange an, 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 diese Frage :

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 field_get_items()Funktion, die für Sie aussortiert, unter welchem ​​Sprachcode die Daten gespeichert sind.

Und jetzt weiß ich nicht, ob das, was ich benutze, irgendetwas kaputtmachen könnte.

Merrick
quelle

Antworten:

39

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

Mit dem Entitäts-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, ein böser Fehler und eine Ausnahme ausgegeben werden, anstatt eines Hinweises und eines falschen Verhaltens.

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

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

Oder Sie können verwenden, isset()welche EntityMetadataWrapperHandles intern:

$field_val = 'default/fallback value';
if (isset($node_wrapper->field_doesnt_exist)) {
  $field_val = $node_wrapper->field_doesnt_exist->value();
}
googletorp
quelle
Wurde diese Funktion entity_metadata_wrapper()abgelehnt? Ich habe versucht, dies in meinem Modul aufzurufen, und bekam Fatal error: Call to undefined function entity_metadata_wrapper()- ich habe auch eine Quellensuche in meiner Drupal 7.12-Installation in Dreamweaver durchgeführt und an einer anderen Stelle im Code 0 Ergebnisse gefunden!
Aditya MP
1
aditya - das ist im Entity API-Modul - nicht im Kern.
Lazysoundsystem
1
@adityamenon Wie faul sagt, ist dies nicht im Kern ... noch wird es wahrscheinlich für Drupal 8 sein. Die Entity-APIs werden zumindest stark verbessert. Es war nicht wirklich Zeit, alle für das Entity-System für Drupal 7 erforderlichen APIs zu erstellen. Daher versucht das Entity-API-Modul, dies zu erreichen.
googletorp
Vielen Dank, ich war dumm, die Antwort nicht richtig zu lesen und dem Link zur Entity API-Projektseite zu folgen :)
Aditya MP
1
Wenn ich mir den Quellcode für entity_metadata_wrapper ansehe und dem Kaninchenpfad durch alle Klassen folge, die instanziiert und erweitert werden, um mir die Feldmanipulation zu erleichtern, frage ich mich, ob sich alles lohnt. Wenn ich meinem Bootstrap weitere 3k + Codezeilen hinzufüge und mehr Speicherplatz für alle Variablenzuweisungen in Anspruch nehme ... gibt es etwas Leichteres? Es scheint nur, dass dies $node->field_name[LANGUAGE_NONE][0]['value'] = 'foo';der effizienteste Weg ist.
Charlie Schliesser
19

Zum Lesen sollten Sie immer in der Lage sein, field_get_items () zu verwenden , wodurch die richtige Sprache für Sie ausgewählt wird und auch geprüft wird, ob das Feld Werte enthält.

Leider ist die Feld-API in 7.x stark eingeschränkt. Es gibt keine Möglichkeit, z. B. das erste Feldelement abzurufen. Wagen Sie es nicht einmal, den Wert mit einem einzigen Funktionsaufruf abzurufen. Und es gibt keine field_set_items ( ) Gegenstück.

Ja, das Entity-API-Modul bietet eine schönere API mit dem Nachteil, dass es auch einiges an Aufwand mit sich bringt . Wenn Sie versuchen, einen Entity-Wrapper zu sichern, erhalten Sie normalerweise entweder nichts oder eine Wand aus unlesbaren Arrays.

Berdir
quelle
1
Ich habe den Eindruck, dass so etwas in Drupal 8 verbessert werden könnte. Wenn ja, wie kann man herausfinden, wie diese Art von Dingen voranschreitet? Abgesehen von den Modul-Seiten ist Do für mich wie ein Labyrinth! :)
Clive
1
Nun, es gibt immer Hoffnung :) Und es ist schwierig, auch nur einen Überblick darüber zu behalten, was in Drupal 8 vor sich geht. Eine Möglichkeit besteht darin, den Initiativen zu folgen. Dies ist jedoch kein direktes Ziel der bestehenden Richtlinien. Teile des Entity-API-Moduls werden in den Core verschoben (Es gibt jetzt die Entity-Klasse und vorhandene Entitäten werden in das neue System konvertiert). Es besteht also die Möglichkeit, dass wir beispielsweise Methoden direkt für diese Klassen erhalten, um mit Feldern umzugehen. Eine gute Ressource für festgeschriebene Änderungen ist das neue Änderungsaufzeichnungssystem (siehe drupal.org/list-changes/drupal) .
Berdir
Genial, genau das habe ich gesucht, vielen Dank! :) Ich hoffe, es macht dir nichts aus, wenn ich dich frage, dass ich weiß, dass die Site nicht wirklich zum Thema gehört. Ich würde mich gerne daran beteiligen, zum Kern beizutragen, aber da ich mich nie wirklich mit Open Source befasst habe, finde ich das Ganze ein bisschen entmutigend ... es ist schön, einen guten Startplatz zu haben :)
Clive
Clive: Schauen Sie sich drupalofficehours.org an - genau das soll den Leuten helfen, mit dem Spenden zu beginnen. Mehr Ressourcen dort. Ich würde auch empfehlen, zu einer Benutzergruppensitzung zu gehen, bei der Kernentwickler häufig oder mit größerer Wahrscheinlichkeit ein DrupalCamp besuchen, in dem ein oder zwei Kernentwickler sein werden. Suchen Sie Ihre lokale Gruppe auf groups.drupal.org, und Sie sollten in der Lage sein, dies herauszufinden. drupical.org kann auch nützlich sein.
Wizonesolutions
-2
$node = node_load($lot_id);
$field_language = field_language('node', $node, 'field_name');
$node->field_name[$field_language][0]['value'] = $custom_value;
Tanvir Ahmad
quelle
Können Sie eine kurze Erklärung hinzufügen, warum dies die Frage beantwortet?
Free Radical