Entschuldigung für den Code im Titel, ich könnte mir keinen klareren Weg vorstellen, ihn zu fragen.
Ich habe mehrere Knoten des location
Inhaltstyps und eine Ansicht, in der Teaser dieser Knoten ausgegeben werden. Ich möchte einige benutzerdefinierte Dinge tun node--location.tpl.php
, um die Teaser überall dort zu beeinflussen, wo sie angezeigt werden. Wenn ich einfach dpm($node)
an die Variablen komme, befinden sich einige Feldwerte nicht immer an derselben Stelle.
Zum Beispiel habe ich field_phone
das nur identisch formatierte Telefonnummern. Für den ersten Knoten in dieser Ansicht ist dieses Feld wie folgt strukturiert $node->field_phone['und'][0]['safe_value']
. Aber für den zweiten Knoten ist es einfach $node->field_phone[0]['safe_value']
.
Ich weiß, dass und
das mit Übersetzungen zu tun hat und vielleicht "undefiniert" bedeutet. Ich mache nichts mit Übersetzungen oder Lokalisierung oder Sprachen auf der Site, daher unterscheidet sich dieser Knoten auf diese Weise nicht von anderen Knoten.
Was verursacht dies und gibt es eine Funktion oder etwas, das mir helfen kann, den Wert leicht zu testen und zu ermitteln, oder muss ich meinen eigenen rollen?
EDIT : Chris Rockwell unten weist darauf hin field_get_items()
. Dies schien mein Problem auf der Website zu lösen, an der ich neulich arbeitete. Aber jetzt, auf einer anderen Seite, scheitert es genau aus dem Grund, den ich hier anspreche.
Ich habe eine Ansicht, die drei Knoten ausgibt. Aus irgendeinem Grund erhalte ich dpm($node)
in der node--node-type.tpl.php
Datei sechs variable Dumps. Der erste hat $node->field_link_image['und'][0]
, während alle fünf anderen - EINSCHLIESSLICH des Duplikats desselben Knotens - nur haben $node->field_link_image[0]
. Und jetzt field_get_items()
schlägt es stillschweigend fehl und gibt auf diesen letzten fünf Knoten false zurück.
Also gehe ich zurück zu meiner ursprünglichen Frage: Was verursacht diesen Unterschied zwischen einigen Knotenvariablen und anderen und was kann ich dagegen tun?
field_view_value()
und das Delta auf das$item
übergeben.field_link_image
mehrere Werte annehmen?Antworten:
Das Fehlen der
'und'
oderLANGUAGE_NONE
Level-Daten scheint darauf hinzudeuten, dass das Feld nicht mehr übersetzt werden kann. Ich bin noch nie auf ein solches Feld gestoßen.field_get_items()
Wie bereits erwähnt, ist dies der kanonische Weg, um Felddaten sicher abzurufen. Alle Felder, die nicht mit field_get_items funktionieren, sollten als fehlerhaft betrachtet werden.Ich würde eine Vermutung riskieren, dass Sie auch
Tritt das Problem weiterhin bei neu erstellten Feldern auf?
Können Sie bei einer Neuinstallation reproduzieren?
quelle
dpm()
in node - Whatever.tpl.php für einen Inhaltstyp verwende, der in einer Ansicht verwendet wird. Es istdpm()
selbst . Wenn ich nicht ausführedpm()
, sind alle$node
Instanzen in der Ansicht korrekt. Wenn ich das tue, haben alle bis auf die ersten das Sprachniveau entfernt. Verrückt.Ich glaube, Sie brauchen eine Kombination aus
field_get_items()
undfield_view_value()
.In Ihrem Fall (ich kann das nicht testen):
BEARBEITEN: Im obigen Code, Zeile 2 (
$output = ...
), habe ich hinzugefügt,$item[0]
weil ich nicht gesehen habe,$item
dass ein Delta erforderlich ist. Auf diese Weise können Felder mit mehreren Werten durchlaufen und durchlaufen werdenfield_view_value()
. Ich glaube, Sie überspringen den wichtigen Schritt der Verwendungfield_view_value()
.Wenn die Verwendung des obigen Codes (einschließlich
field_view_value()
) dies nicht löst, würde ich weitere Informationen benötigen. zB sehen Sie Ihre node.tpl.php und möglicherweise einen Inhaltstyp-Export.quelle
$image
, die sein muss$item
, aberfield_get_items
genau das ist, was ich brauchte. Das Ergebnis ist dassafe_value
(nicht nur dasvalue
), das sicher gedruckt werden sollte, oder? Ich brauche nicht,field_view_value
weil ich die Variable direkt ausgeben möchte, nicht mit derrender
Funktion.safe_value
, anwesend zu sein. Ich müsste allerdings ein bisschen graben, um das zu bestätigen. Vielen Dank für die Erwähnung des Tippfehlers, behoben.field_get_items()
in Ihrer Bearbeitung, aber nichtfield_view_value()
- verwenden Sie es?field_view_value()
ist ein renderbares Array, daher sollten Sie in der Lage sein, den Wert direkt daraus abzurufen. Warum sollte jemand die Antwort ablehnen, die das ursprüngliche Problem gelöst hat, aber für das neue Problem nicht zu funktionieren scheint?Hier ist die Funktion, die ich verwende, bis ich eine bessere Antwort finde. Zusätzlich zur Behebung des Sprachproblems sollte immer ein numerisches Array zurückgegeben werden, damit Sie sicher sein können,
foreach
das Ergebnis zu überprüfen.quelle
Wenn Sie sich diese https://api.drupal.org/api/drupal/includes%21bootstrap.inc/constant/LANGUAGE_NONE/7 ansehen
Dies ist ein sicherer Wert und funktioniert für jede definierte Sprache, einschließlich keiner Sprache.
quelle
und
kostenlose Version, wenn ich danach frage.$node->field_location[LANGUAGE_NONE][0]['safe_value']
wird für diesen zweiten Knoten genauso fehlschlagen wie$node->field_location['und'][0]
wird.