web-dev-qa-db-ja.com

ノードのタイトルの前にフィールドを表示する方法は?

D7でティーザーを表示するときに、ノードのタイトルの前に特定のフィールドをレンダリングしようとしています。

事実、私は this から this に移動したいと思います。

Node.tpl.phpの更新を調査しましたが、$title$contentが分離されているので、これにどのように対処するかわかりません。いくつか検索したところ、Drupal-6でこれを回避するために [〜#〜] cck [〜#〜] および ConTemplate モジュールを使用するよう提案されていることがわかりましたが、私はmより多くのDrupal-7ソリューションがあるかどうか疑問に思っています。

助言がありますか?

39
irishbuzz

Drupal 7を使用すると、これは非常に簡単です。

renderhideを使用すると、Drupalで必要だったすべてのアイテムを自分で印刷する必要なく、$content内の単一要素の配置を制御できる可能性があります。 。

簡略化されたノードテンプレートは次のようになります。

<div>
  <h2><?php print $title; ?></h2>
  <div class="content">
    <?php print render($content); ?>
  </div>
</div>

少し変更すると、ニーズに対応できます。

<div>
  <?php print render($content['field_name_of_image']); ?>
  <h2><?php print $title; ?></h2>
  <div class="content">
    <?php print render($content); ?>
  </div>
</div>

renderを使用すると、要素を出力できます。 Drupalは、レンダリングされたものを追跡して同じ場所が2度印刷されるのを防ぐため、これは単に印刷するよりも賢いです。タイトルの上のフィールドをレンダリングするとき、$contentがレンダリングされるときに何がレンダリングされるかについても削除します。

51
googletorp

Display Suite もかなりクールです。

Display Suiteでは、ドラッグアンドドロップインターフェイスを使用してコンテンツの表示方法を完全に制御できます。ノード、ビュー、コメント、ユーザーデータなどを、何十ものテンプレートファイルを操作することなく、思い通りに配置できます。事前定義されたレイアウトのリスト(D7のみ)を使用して、さらにドラッグアンドドロップを楽しめます。

8
stevepurkiss

Titleモジュールを見てください- http://drupal.org/project/title 。それはあなたのシナリオに役立つかもしれません。私は何らかの理由でそれをインストール/有効化しましたが、おそらくあなたのものと同様であり、タイトルフィールドを配置する方法に柔軟性を与えるようです。

私はそれ以来それを無効にしている(そしてDisplay Suiteを使用している)ので、私の思い出は少しおおざっぱかもしれません。

7
Greta

これはハッキーな解決策であり、誰かがもっとエレガントなものを思いつくと思いますが、行き詰まって誰もしなかった場合のために...

page.tpl.phpを使用して$titleの出力を完全に削除し、マシン名$ new_titleなどのTitleという新しいカスタムフィールドを追加できます。次に、ノード編集で元のタイトルボックスを非表示にし、ノード保存で計算フィールドまたはカスタムphpを使用して$new_title$titleにコピーします。

その後、cssをいくつか記述して、$ new_titleを以前のページタイトルのように見せると、フィールドの管理画面でドラッグアンドドロップするだけで、フィールドを好きな順序で配置できます。 $new_title$titleにコピーしたため、ブラウザバーのページタイトルは引き続き機能し、ノードタイトルの欠落について何も問題がないはずです。

私が言ったように、それはハックです-しかしそれはうまくいくでしょう。さらに情報が必要な場合はお知らせください

4
Frederik

page.tpl.php(ガーランド)

...
      <div id="center"><div id="squeeze"><div class="right-corner"><div class="left-corner">
          <?php print $breadcrumb; ?>
          <?php if ($mission): print '<div id="mission">'. $mission .'</div>'; endif; ?>

          /*
           * Print custom block or var
           */
          <?php if ($custom_block): print '<div id="custom-block" class="clear-block">'. $custom_block .'</div>'; endif; ?>

          <?php if ($tabs): print '<div id="tabs-wrapper" class="clear-block">'; endif; ?>
          <?php if ($title): print '<h2'. ($tabs ? ' class="with-tabs"' : '') .'>'. $title .'</h2>'; endif; ?>
          <?php if ($tabs): print '<ul class="tabs primary">'. $tabs .'</ul></div>'; endif; ?>
          <?php if ($tabs2): print '<ul class="tabs secondary">'. $tabs2 .'</ul>'; endif; ?>
          <?php if ($show_messages && $messages): print $messages; endif; ?>
          <?php print $help; ?>
          <div class="clear-block">
            <?php print $content ?>
          </div>
          <?php print $feed_icons ?>
          <div id="footer"><?php print $footer_message . $footer ?></div>
      </div></div></div></div> <!-- /.left-corner, /.right-corner, /#squeeze, /#center -->
...

template.php

/**
 * Override or insert variables into the page template.
 */
function phptemplate_preprocess_page(&$variables) {
  $node = $variables['node'];
  if($node->type == MY_NODE_TYPE) {
    $variables['custom_block'] = 'bla bla bla';
  }
}
3
dobeerman

これは元の投稿のティーザーの質問には適用されませんが、これを見つけてフルビューで実行したい人のために、コードなしのオプションがあります:ブロックにフィールドを表示します(ビューを使用して、たとえば)、そのブロックをコンテンツブロックの上に配置しますが、同じリージョンに配置します。

3
brad

Template.phpで前処理関数を使用する必要があると思います

/**
 * Override or insert variables into the page template.
 */
function THEMENAME_process_page(&$variables) {
  // look for $variables['page_title'] if i remember
}

そして追加として

/**
 * Override or insert variables into the node template.
 */
function THEMENAME_preprocess_node(&$variables) {
  //
}

変数をダンプし、必要な処理を実行します。追加/削除/更新。

2
dobeerman

私は Display Suite を使用したコードレスソリューションとその「Region to Block」エクストラ機能を使用してこれを解決しました。このソリューションは柔軟性が高いので最も気に入っています。

基本的に、「Region to Block」エクストラパーツを有効にし、Display Suiteで「フルテキストコンテンツ」表示を有効にします。 (フルノードディスプレイでタイトルの上にコンテンツを表示したい場合、同様に他のビューモードでも使用できますexceptデフォルト)。これで、「フルテキストコンテンツ」の「表示の管理」部分の画面下部に、「ブロック領域」タブが表示されます。そこで新しいブロック名を入力し、保存して、目的のフィールドをこのブロックにドラッグアンドドロップします。最後に、新しく作成されたブロックを[ブロック]画面でノードタイトルの上の上に移動します。

同じアプローチのビデオをここで見ることができます: http://www.youtube.com/watch?v=y4wyjxyhbNA 、もちろん、ブロックをタイトルの上(左側のサイドバーではなく)に配置する必要があります最後に。

2
Mirsoft

以下の禅テンプレートの場合、コードは私にとってはうまくいきます。

<?php
// this goes in template.php
// check if node type page and then add to $vars array
// declaring $vars['foo'] gives you a $foo variable to use in page.tpl.php

function YOURTHEMENAME_preprocess_page(&$vars, $hook) {
    if (isset($vars['node'])) :
        if($vars['node']->type == 'page'):       
            $node = node_load($vars['node']->nid);
            $output = field_view_field('node', $node, 'field_image', array('label' => 'hidden'));       
            $vars['my_image_field'] = $output;               
        endif;
    endif;
}
?>

最終的に、page.tpl.phpのフィールドを簡単に印刷できます。

<?php
if ($my_image_field):
   print render($my_image_field);
endif;
?>
1
user991554

すでにいくつかのテーマを使用して作成しており、タイトルの上部にフィールドを追加しようとしていることはわかっています。

Drupal 7でテーマを作成するすべての開発者への私の提案は、オメガテーマ+コンテキストモジュールおよびデルタモジュールを使用することです。これにより、レイアウトの非常に強力な基盤が得られます。

リージョン、ブロック、フィールドの配置の柔軟性。

1
AnAnD

パネルモジュールでistを実行できます

0
houmem