web-dev-qa-db-ja.com

参照ノードから選択したフィールドを印刷する

エンティティ参照を使用して、ブログの下にエンティティ参照タイプのフィールドを作成することにより、ブログタイプのノードをカスタムコンテンツタイプ「チャレンジ」の別のノードにリンクすることができました。すごい。これで、ブログが公開されると、リンクされたカスタムコンテンツタイプの一部(すべてではない)のフィールドもそこに表示されます。例として、私のカスタムコンテンツタイプには、title、body、image1、image2、sponsorなどのフィールド、フラグモジュールを使用するフラグ、およびその他のフィールドがあります。私が言及したいくつかのフィールドのみをブログに表示する必要があります(表示されるフラグなどはありません)。 SOブログの[ディスプレイの管理]で何をするかを表示するために[レンダリングエンティティ]を選択します。これにより、参照/リンクされたノードからすべてのフィールドが取得されます。ただし、一部ではないフィールドが必要です。私が行うことは、カスタムノード(blog.tpl.php)を記述することです。

_<?php
   hide($content['title']);
   hide($content['field_blog_pic']);
   hide($content['field_challenge_name']);
   hide($content['field_challenge_pic']);
   hide($content['field_sponsor']);
   hide($content['field_sponsor_logo']);
   hide($content['field_sponsor_description']);
 ?>
_

次に、フィールドを1つずつレンダリングしてみました。ブログタイプのフィールドは問題ありませんが、print_render($content['field_challenge_name'])を実行すると、参照されたノード(カスタムコンテンツタイプのチャレンジ)のすべてのフィールドが表示されます。参照されているノードを表示するためにいくつかのフィールドを選択するにはどうすればよいですか?.

それが役立つ場合は、ここに私のノードがあります--blog.tpl.php:

_    <div class ="in-blog-pic">
     <?php
       print render($content['field_blog_pic']);
     ?>
    </div>

    <div class ="in-blog-title">
     <?php
        print $title;
     ?>
    </div>

    <div class="in-blog-comment-count">
     <?php
        print $comment;
     ?>
    </div>

    <div class="in-blog-name-user">
     <?php
        print $name;
     ?>
    </div>

    <?php
    /** $user = user_load($user->uid);
      print theme_image_style(
                    array(

                        'path' => $user->picture->uri,
                        'attributes' => array(
                            'class' => 'in-blog-user'
                        )            
                    )
                );        
    */
    ?>
    <div class="in-blog-user-pic">
 <?php
   $user = user_load($uid);
   print theme('user_picture', array('account' =>$user));
 ?>
</div>

<div class="in-blog-title-below">
 <?php
  print $title;
 ?>
</div>

<?php
   hide($content['title']);
   hide($content['field_blog_pic']);
   hide($content['field_challenge_name']);
   hide($content['field_challenge_pic']);
   hide($content['field_sponsor']);
   hide($content['field_sponsor_logo']);
   hide($content['field_sponsor_description']);
   hide($content['field_categories']);
?>
<div class="in-blog-body">
 <?php
  print render($content);
 ?>
</div>

<?php /*
<div class="in-blog-challenge-name">
  <?php
     print render($content['field_challenge_name']);
  ?>
</div>
*/?>
_

最後の数行を実行すると、参照されたノードのすべてのフィールドが表示されます

_<div class="in-blog-challenge-name">
      <?php
         print render($content['field_challenge_name']);
      ?>
    </div>
    ?>
_

ですから、すべてのブラバリングの後、参照したいノード(ここでは、カスタムタイプ「チャレンジ」)の選択したフィールドを、参照しているノード(ここでは、ブログ)に印刷する方法を尋ねます...

よろしく

4
why

この問題には Display Suite を使用します。これを使用すると、参照するノードタイプに追加のビューモードを定義し、必要なフィールドのみを指定して、エンティティビューフィールドの表示を構成して、そのビューモードを使用できます。私が取り組んでいる現在のプロジェクトでこれを行っています。それは単なるチケットです。

4

同様の問題を解決するためにあなたの質問を見つけました-残りのコンテンツをすべてレンダリングする必要なく、参照されたノードから画像を取得したいと思います。すでに重いインストールに別のモジュールを追加せずにそれを実行したかったので、テンプレートファイルの代わりにカスタム表示モードでそれを実行しました。

Tokenモジュール-Drupal 7のコアになりました-「トークン」表示モードで特定のフィールドのカスタム書式を選択できるようにします。たとえば、画像を完全にリンクする場合は、 -独自のコンテンツタイプのサイズのバージョンですが、別のコンテンツタイプで参照し、元のコンテンツにリンクするように設定できます。この投稿を参照してください https://www.drupal.org/ node/1299662

また、参照されるコンテンツから単一のフィールドのみをレンダリングすることも簡単になります。

元のコンテンツタイプ(コンテンツの参照元のコンテンツタイプ)で[表示の管理]に移動し、新しい表示モードであるトークンを作成します。それはオプションのリストの一番下にあります-チェックボックスにチェックを入れてください:

enter image description here

そこから、表示設定を管理するための新しい場所を取得します。不要なものをすべて非表示にして、次のように構成します。

enter image description here

次に、参照を追加するコンテンツタイプに戻り、[ディスプレイの管理]をクリックします。 Node参照フィールドの表示設定で、[フォーマット]> [レンダリングされたコンテンツ]を選択します。[表示モード:トークン]を選択すると、必要に応じてスタイルを設定できる素敵な単一フィールドが表示されます。

0
nikobelia

別の方法は、モジュール エンティティビューモード を使用することです。これはDisplay Suiteの軽量な代替品であり、カスタムビューモードを作成できます。

プログラムでビューモードを作成する方法は次のとおりです このチュートリアル

0
Libor Vaněk

このモジュールを試してください フィールド抽出 より高度な機能を使用するには views eva

0
sel_space