web-dev-qa-db-ja.com

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

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

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

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

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

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

[〜#〜] edit [〜#〜]:以下のChris Rockwellがfield_get_items()を指摘しています。これで、先日作業していたサイトの問題が解決したようです。しかし今、別のサイトでは、私がここで取り上げた理由のために失敗しています。

3つのノードを出力するビューがあります。何らかの理由で、_node--node-type.tpl.php_ファイルでdpm($node)を実行すると、six変数ダンプが表示されます。 firstには_$node->field_link_image['und'][0]_があり、他の5つはすべて[〜#〜] include [〜#〜] =この同じノードの複製— _$node->field_link_image[0]_のみが含まれます。そして今、field_get_items()は最後の5つのノードで静かに失敗し、falseを返します。

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

8
75th Trombone

_'und'_または_LANGUAGE_NONE_レベルのデータがないことは、フィールドが翻訳できなくなったことを示しているようです。私はそのような分野に出会ったことがありません。

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

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

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

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

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

8
Letharion

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と、場合によってはコンテンツタイプのエクスポートを確認します。

3
Chris Rockwell

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

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);
    }
}
0
75th Trombone