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


41

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

効果的に私はから行ってみたい、この、この

node.tpl.phpの更新を検討しましたが$title$contentこれとは別のものであることに気づいたので、 これにどのようにアプローチするかわかりません。いくつかの検索の後、人々はCCKConTemplateモジュールを使用してDrupal-6でこれを回避することを提案していることがわかりましたが、Drupal-7ソリューションがもっとあるのではないかと思っています。

助言がありますか?


すべてのphpベースのテンプレートソリューションとは別に、CSSのみで長い道のりを歩むこともできます。負のマージンは多くのことができます。あなたのjsfiddleの例では、それはなり、このように
-marcvangend

私はこれを考えていましたが、長いタイトルの場合はどうなりますか?
irishbuzz

あなたは絶対に正しいです。これはタイトルの高さが固定されている場合にのみ機能します。すべてのソリューションと同様に、弱点があります。個人的には、(使用しているデザインや技術に関係なく)エディターを教育することで長いタイトルを防ぐべきだと思いますが、それは常に選択肢とは限りません。
-marcvangend

回答:


53

これは、Drupal 7では非常に簡単です。

renderし、hideあなたが知っていることで、単一の要素の配置を制御するために働か持っている$content自分が好きなすべての項目をプリントアウトすることなく、Drupalのは6で必要とされました。

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

<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ます。


2
非常に素晴らしい。理想的な世界では、Drupalにタイトルフィールドを他のフィールドと同様に扱うように指示する方が良いかもしれませんが、少なくともDrupal 7ではこのような簡単なソリューションがあります。賞賛@googletorp!
-irishbuzz

記録に関して:これは、上記のコメントが思いがけないものとは反対に、Drupal6とほとんど変わりません。
バーク

1
@berkes:D6でフィールドを個別に印刷する場合、ノードテンプレートを維持し、コードを編集して新しいフィールドを追加できるようにする必要があります。これは、フィールドを追加し続け、UIを使用してフィールドを並べ替えることができるD7と比較して大きな違いです。
googletorp

レンダリングは本当に新しいものです。しかし、その概念は違います。同じことを達成するには、いくつかのトリックがあります。Drupal6では、これは同じくらい簡単で、きれいで、素晴らしいと言うつもりはありませんでした。単にそれも可能です。
バーク

@googletorpには、page.tpl.phpのフィールドを印刷する方法がありますか?
CocoSkin 14

9

Display Suiteも非常にクールです。

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


これは素晴らしいモジュールですが、残念ながら、タイトル以外のフィールドの制御しか提供していないようですので、ここでは何の助けもありません。どうもありがとう。
-irishbuzz

:実際には真実ではないこと、あなただけのすべての必要なモジュールをインストールする必要がありdrupal.org/project/dsdrupal.org/project/nddrupal.org/project/nd_contrib
解読

@Decipher:3つのモジュールをインストールして、イメージタグをh2タグの上に移動しますか?あなたは冗談である必要があります:)
バーク

@berkes-Drupalをインストールして1つのWebページを表示するには、冗談でしょうか?私のポイントは、これらのモジュールがインストールされていると、Drupalでできることと同じように、多くのことができるということです。
解読

@Decipher:確かに、汎用モジュールをインストールすると、サイトに新しい機会がもたらされます。ただし、ビュー、ビューギャラリー、cck、filefiend、およびimage-fieldをインストールして、単純に画像の行を表示するのは悪いアドバイスです。ビュー、cck、および残りがこのイメージリストのみに使用される場合は、良いアドバイスです。しかし、OPはこれについてまったく言及しませんでした。
バーク

8

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

それ以来、私はそれを無効にしました(そして、Display Suiteを使用しています)ので、私のリコールは少し大雑把かもしれません。


5

これはハック的なソリューションであり、誰かがよりエレガントなものを思い付くと確信していますが、あなたが立ち往生している場合、誰もしません...

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

その後、CSSを記述して$ new_titleを以前のページタイトルのようにします。フィールドの管理画面でドラッグアンドドロップするだけで、好きな順序でフィールドを配置できます。あなたがコピーされているため$new_title$title、ブラウザのバーにページのタイトルは、まだ動作するはずですし、何もノードのタイトルを逃す文句を言うべきではありません。

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


1
提案フレデリックをありがとう。あなたが示すように、それは理想からは程遠いですが、いくつかの可能な回避策の一つのように見えます。このアプローチを採用する場合は、auto_nodetitleモジュールを使用することを提案して、ソリューションに追加します。より良い方法があり、賞金を開始できることを本当に望んでいるので、私は今のところ質問を開いたままにします。あなたの努力に対して+1をすべて同じように。
-irishbuzz

4

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

最初のコードスニペットでは、何が新しく何が存在するのかをほとんど示していないため、ここで何が起こっているのかを確信できません。ガーランドではなくZenテーマも使用していますが、必要な変更は似ているはずです。2番目のコードスニペットでは、hook_preprocess_page()を呼び出していますか?より具体的な例で拡張できますか?
-irishbuzz

2番目のコードでは、新しい変数「custom_block」を定義しました。「custom_block」印刷を行う最初のコードの一部を見てください。<?php if($ custom_block):print '<div id = "custom-block" class = "clear-block">'。$ custom_block。 '</ div>'; endif; ?>この変数を生成するためのルールを定義するだけです。そう?:)
dobeerman

4

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


私はまだdrupal n00bですが、どういう意味ですか?
ケニーワイランド

3

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) {
  //
}

変数をダンプし、必要なことを何でもします。追加/削除/更新。


1
これらの関数は、タイトルおよびその他のノードフィールドが出力される順序を変更しません。そのためには、テンプレートファイルを変更する必要があります。
キアムルノ

私はあなたがタイトルにフィールド値を追加したいと思った。
-dobeerman

3

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

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

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


2

以下の禅のテンプレートでは、コードは私のために機能します。

<?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;
?>

page.tpl.phpに関しては、ビジネスレスポンシブテーマで未定義変数の警告が表示されていましたが、条件を削除すると正常に機能します。つまり、<?php if($ my_image_field):print render($ my_image_field);を変更しました。endif; ?>から<?php print render($ my_image_field); ?>私のすべてのページで警告が出ないようです。
エイミーニーベル

2

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

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

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


1

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


古い答えはここにありますが、これはフラグをキャッチしました。この状況でPanelsを使用する方法について少し説明する方が良いでしょう。
mpdonadio

パネルは、フィールドを別の位置に移動するだけの大きなオーバーヘッドです。
アッコ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.