なぜ$ node-> field_name [0]と$ node-> field_name ['und'] [0]になるのですか?


8

タイトルのコードでごめんなさい、私はそれを尋ねる明確な方法を考えることができませんでした。

locationコンテンツタイプのいくつかのノードと、それらのノードのティーザーを出力するビューがあります。node--location.tpl.phpティーザーが表示されているすべての場所に影響を与えるために、いくつかのカスタム設定を行いたいです。dpm($node)変数を取得するのが簡単な場合、一部のフィールド値が常に同じ場所にあるとは限りません。

たとえば、私にfield_phoneは同じ形式の電話番号しかありません。このビューの最初のノードでは、そのフィールドはのように構成されてい$node->field_phone['und'][0]['safe_value']ます。しかし、2番目のノードの場合は単純$node->field_phone[0]['safe_value']です。

私はそれundが翻訳に関係していることを知っており、おそらく「未定義」を意味します。サイトの翻訳やローカリゼーション、言語については何もしていません。そのため、このノードが他のノードとまったく異なっているわけではありません。

これは何が原因で、簡単にテストして値を取得するのに役立つ関数や何かがありますか、それとも自分でロールする必要がありますか?

編集:以下のクリスロックウェルが指摘していfield_get_items()ます。これで、先日作業していたサイトの問題が解決したようです。しかし今、別のサイトでは、私がここで取り上げた理由のために失敗しています。

3つのノードを出力するビューがあります。私はいくつかの理由から、dpm($node)node--node-type.tpl.phpのファイル、私が取得6つの変数ダンプを。最初の一つは持っている$node->field_link_image['und'][0]-すべての5人ながら、含むこの同じノードの複製は-ちょうど持っています$node->field_link_image[0]。そして今、field_get_items()これらの最後の5つのノードで静かに失敗し、falseを返します。

だから私は私の元の質問に戻ります:一部のノード変数と他のノード変数の間のこの違いの原因は何ですか、そしてそれに対して何ができますか?


回答を編集しました。私はあなたが使用すべきでfield_view_value()あり、$itemそれに渡されたデルタを信じるべきです。
クリスロックウェル

また、field_link_image複数の値を受け入れますか?
クリスロックウェル

@ 75番トロンボーンまったく同じ問題がありますが、解決策は見つかりましたか?
sepehr 2013年

@ 75th-trombone その特定のプロジェクトでnodeblockモジュールを使用しましたか?
sepehr 2013年

回答:


8

欠如'und'、またはLANGUAGE_NONEレベルのデータは、フィールドを変換する能力を失ったことを示しているようです。私はそのような分野に出会ったことがありません。

field_get_items()すでに指摘したように、フィールドデータを安全に取得するための標準的な方法です。field_get_itemsで機能しないフィールドはすべて壊れていると見なされます。

私はあなたのどちらかだと思います

  1. フィールドデータを再配置し、時々言語レベルを削除するよりもよく分からない壊れたcontribモジュールがあります。
  2. フィールド設定が途中で壊れています。上記と同様の理由が考えられます。

問題は新しく作成されたフィールドで引き続き発生しますか?

クリーンインストールで再現できますか?


2
私はこれが起こるのを見てきましたが、長い間ではないので、原因を特定することはできません。
mpdonadio

私が実際に考えることができるのは、重砲を持ち込み、フィールドAPIをデバッグすることだけです。これは、非常に複雑なコードです。
Letharion 2013

2
1年以上後、ようやくこの問題が何であるか、または少なくともその一部であることがわかりました。それは私dpm()がノードで使用するときです-ビューで使用されるコンテンツタイプのwhatever.tpl.php。それdpm() 自体です。を実行しない場合、ビュー内のdpm()すべての$nodeインスタンスが正しいです。私が行うとき、最初のものを除くすべての言語レベルが取り除かれています。クレイジー。
第75トロンボーン

ただ、すごい..フォローアップをありがとう@ 75thTrombone。私はこれをあまりにも長い間デバッグしてきました。
エンジッパー、2015

@ 75番目のトロンボーンは正しいです!ここで同じ問題、ありがとう
信じられないほどの

3

私はあなたがの組み合わせが必要と考えているfield_get_items()field_view_value()

あなたの場合(私はこれをテストすることはできません):

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

編集:上記のコードの2行目($output = ...)では、デルタ$item[0]$item必要であることを確認できなかったので追加しました。これにより、複数の値を持つフィールドを反復して通過させることができますfield_view_value()。を使用する重要なステップをスキップしていると思いますfield_view_value()

上記のコード(を含むfield_view_value())を使用してもこれを解決できない場合は、詳細情報が必要です。たとえば、node.tpl.phpとコンテンツタイプのエクスポートを確認します。


私はあなたが持っていると思う$imageする必要があること$item、しかし、field_get_items私がまさに必要です。その結果にはsafe_value(だけでなくvalue)があり、これは印刷しても安全なはずです。関数field_view_valueではなく変数を直接出力したいので、必要ありませんrender
75番目のトロンボーン

その結果は安全に印刷できますが、あなたがsafe_value出席することに依存することはできません。でも確認のために掘り下げなければならない。タイプミスに言及していただきありがとうございます。修正しました。
クリスロックウェル

さて、これは私がそれを試した最後のサイトで動作するように見えましたが、私はそれが今失敗する例を見ています。この質問を再開します。上記の私の編集を参照してください。
75番目のトロンボーン

あなたはfield_get_items()編集で言及しますが、あなたfield_view_value()はそれを使用していませんか?field_view_value()はレンダリング可能な配列なので、そこから直接値を取得できるはずです。さらに、元の問題を解決した回答に反対票を投じたのに、新しい問題に対してうまくいかなかったのはなぜですか?
Chris Rockwell

0

これが、より良い答えが見つかるまで使用している関数です。言語の問題を修正することに加えて、常に数値配列を返す必要があるためforeach、結果を確実に確認できます。

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

-3

これを見てみるとhttps://api.drupal.org/api/drupal/includes%21bootstrap.inc/constant/LANGUAGE_NONE/7

これは使用するのにより安全な値であり、言語を含め、定義された言語で機能します。


2
それがどのように役立つか、または私の質問に答えるのかわかりません。私がundそれを要求した場合、それはどういうわけか私に-freeバージョンを取得しません。$node->field_location[LANGUAGE_NONE][0]['safe_value']その2番目のノードでは、できるだけ多く失敗します$node->field_location['und'][0]
75番目のトロンボーン、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.