Warum ist es manchmal $ node-> field_name [0] und manchmal $ node-> field_name ['und'] [0]?

8

Entschuldigung für den Code im Titel, ich könnte mir keinen klareren Weg vorstellen, ihn zu fragen.

Ich habe mehrere Knoten des locationInhaltstyps 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_phonedas 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 unddas 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.phpDatei 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?

75. Posaune
quelle
Ich habe meine Antwort bearbeitet. Ich glaube, Sie sollten verwenden field_view_value()und das Delta auf das $itemübergeben.
Chris Rockwell
Auch dann , wenn field_link_imagemehrere Werte annehmen?
Chris Rockwell
@ 75. Posaune Ich habe genau das gleiche Problem, hast du die Lösung gefunden?
September
@ 75. Posaune Haben Sie in diesem bestimmten Projekt das Nodeblock- Modul verwendet ?
September

Antworten:

8

Das Fehlen der 'und'oder LANGUAGE_NONELevel-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

  1. Haben Sie ein defektes Contrib-Modul, das Felddaten neu anordnet und nicht besser weiß, als manchmal die Sprachstufe zu entfernen.
  2. Ihre Feldeinstellungen sind gerade irgendwo auf dem Weg kaputt gegangen. Möglicherweise aus einem ähnlichen Grund wie oben.

Tritt das Problem weiterhin bei neu erstellten Feldern auf?

Können Sie bei einer Neuinstallation reproduzieren?

Letharion
quelle
2
Ich habe dies gesehen, aber nicht lange, daher kann ich nicht auf einen Schuldigen hinweisen.
mpdonadio
Alles, woran ich dann wirklich denken kann, ist, die schwere Artillerie einzubringen und die Feld-API zu debuggen, die ein ziemlich komplizierter Code ist.
Letharion
2
Über ein Jahr später fand ich endlich heraus, was dieses Problem ist oder zumindest ein Teil davon. Es ist, wenn ich dpm()in node - Whatever.tpl.php für einen Inhaltstyp verwende, der in einer Ansicht verwendet wird. Es ist dpm() selbst . Wenn ich nicht ausführe dpm(), sind alle $nodeInstanzen in der Ansicht korrekt. Wenn ich das tue, haben alle bis auf die ersten das Sprachniveau entfernt. Verrückt.
75. Posaune
Nur, wow .. Danke @ 75thTrombone für das Follow-up. Ich habe das gerade viel zu lange debuggt.
Enzipher
@ 75. Posaune ist richtig! Das gleiche Problem hier, danke
Unglaublich
3

Ich glaube, Sie brauchen eine Kombination aus field_get_items()und field_view_value().

In Ihrem Fall (ich kann das nicht testen):

$item = field_get_items('node', $node, 'field_phone'); // unsafe to print
$output = field_view_value('node', $node, 'field_phone', $item[0]);
print $output;

BEARBEITEN: Im obigen Code, Zeile 2 ( $output = ...), habe ich hinzugefügt, $item[0]weil ich nicht gesehen habe, $itemdass ein Delta erforderlich ist. Auf diese Weise können Felder mit mehreren Werten durchlaufen und durchlaufen werden field_view_value(). Ich glaube, Sie überspringen den wichtigen Schritt der Verwendung field_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.

Chris Rockwell
quelle
Ich denke, Sie haben eine $image, die sein muss $item, aber field_get_itemsgenau das ist, was ich brauchte. Das Ergebnis ist das safe_value(nicht nur das value), das sicher gedruckt werden sollte, oder? Ich brauche nicht, field_view_valueweil ich die Variable direkt ausgeben möchte, nicht mit der renderFunktion.
75. Posaune
Dieses Ergebnis wäre sicher zu drucken, aber ich bin mir ziemlich sicher, dass Sie sich nicht darauf verlassen können 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.
Chris Rockwell
Nun, dies schien auf der letzten Site zu funktionieren, auf der ich es ausprobiert habe, aber ich sehe mir eine Instanz an, bei der es gerade fehlschlägt. Ich öffne diese Frage erneut. siehe meine Bearbeitung oben.
75. Posaune
Sie erwähnen field_get_items()in Ihrer Bearbeitung, aber nicht field_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?
Chris Rockwell
0

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, foreachdas Ergebnis zu überprüfen.

function get_field($field, $lang = 'en', $fallback = 'en') {
    $var = FALSE;
    if(!empty($field[$lang])) {
        $var = $field[$lang];
    } elseif(!empty($field[$fallback])) {
        $var = $field[$fallback];
    } elseif(!empty($field['und'])) {
        $var = $field['und'];
    } elseif(!empty($field)) {
        $var = $field;
    }

    if(empty($var)) {
        return false;
    }

    if(!empty($var[0])) {
        return $var;
    } else {
        return array($var);
    }
}
75. Posaune
quelle
-3

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.

jdu
quelle
2
Ich verstehe nicht, wie mir das hilft oder meine Frage beantwortet. Es bringt mir irgendwie nicht die undkostenlose 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.
75. Posaune