如何在节点标题之前显示字段?


41

我想在D7中显示预告片时在节点标题之前呈现一个特定字段。

实际上,我想从这里转到这个

我已经研究过更新node.tpl.php,但是我注意到它与之分开$title$content所以我不确定如何处理。经过一些搜索,我发现人们建议使用CCKConTemplate模块在Drupal-6中解决此问题,但我想知道是否还有更多Drupal-7解决方案。

有什么建议么?


除了所有基于php的模板解决方案之外,您还可以只使用CSS进行大量改进。负利润率可以起到很多作用。在您的jsfiddle示例中,它看起来像这样
marcvangend 2011年

我曾经考虑过,但是长标题会怎样?
irishbuzz 2011年

完全正确,这仅在标题具有固定高度的情况下才有效。像每个解决方案一样,它也有缺点。就我个人而言,我认为应该通过教育编辑者来防止(不管您使用什么设计和技术)长标题,但是我意识到这并不总是一种选择。
marcvangend 2011年

Answers:


53

使用Drupal 7确实非常简单。

使用with 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会跟踪已渲染的内容,从而避免在同一地方两次打印相同的东西。渲染标题上方的字段时,还将删除渲染时$content渲染的内容。


2
非常好。在理想的世界中,最好让Drupal像对待其他任何字段一样对待标题字段,但至少在Drupal 7中,我们有这样的简单解决方案。恭喜@googletorp!
irishbuzz 2011年

记录:与上面的注释可能暗示的相反,这与Drupal6几乎没有什么不同。
berkes

1
@berkes:如果在D6中单独打印出字段,则必须维护节点模板,并编辑代码以能够添加新字段。与D7相比,这是一个很大的区别,在D7中,您可以继续添加字段并使用UI对其进行排序。
googletorp

渲染确实是新的。但是它的概念不是。有几种技巧可以达到相同的目的。我并不是要说在Drupal6中这同样简单,干净而且不错。仅仅这也是可能的
berkes 2011年

@googletorp是否可以在page.tpl.php中打印字段?
CocoSkin 2014年

9

展示套件也很酷。

通过Display Suite,您可以完全控制使用拖放界面显示内容的方式。您可以按照自己的方式排列节点,视图,注释,用户数据等,而不必遍历数十个模板文件。预定义的布局列表(仅D7)可提供更多的拖放乐趣!


不错,这是一个很酷的模块,但是不幸的是,它似乎只提供对非标题字段的控制,因此这里没有帮助。都一样谢谢
irishbuzz

其实这是不正确的,你只需要安装所有需要的模块:drupal.org/project/dsdrupal.org/project/nddrupal.org/project/nd_contrib
欲海

@Decipher:安装3个模块以将图像标签移到h2标签上方?您一定是在开玩笑吧:)
berkes

@berkes-安装Drupal以显示一个网页,您一定是在开玩笑吧?我的观点是,安装了这些模块后,您可以完成很多事情,就像使用Drupal一样,您可以做很多事情,但是您也可以使用它来完成一项艰巨的任务。
Decipher

@Decipher:当然,安装通用模块会为您的站点带来新的机会。但是,安装视图,视图库,cck,filefiend和image-field以仅显示一行图像是不明智的。如果视图,cck和其余视图将仅用于此图像列表,则将是一个很好的建议。但是,OP完全没有提及这一点。
berkes

8

看一下Title模块-http://drupal.org/project/title。它可能对您的情况有用。我出于某种原因安装/启用了它,可能与您的原因类似,并且它似乎为如何放置标题字段提供了灵活性。

此后,我已经禁用了它(并且正在使用Display Suite),所以我的回忆可能有点粗略。


5

这是一种骇人听闻的解决方案,我敢肯定有人会想出一些更优雅的东西,但是万一您被卡住了,没人能做到……

您可以用来page.tpl.php完全删除打印内容$title,并添加一个名为Title的新自定义字段,其机器名称为$ new_title或类似的名称。然后在节点上编辑,隐藏原始标题框,然后在节点上保存,使用计算字段或一些自定义php将拷贝$new_title$title

完成所有这些之后,编写一些CSS以使$ new_title看起来像页面标题以前一样,并且您应该能够通过将其拖放到“管理字段”屏幕中而以任意顺序放置任何字段。因为您已复制$new_title$title,所以浏览器栏中的页面标题仍然可以使用,并且没有任何内容可抱怨缺少节点标题。

就像我说的那样,这是一个hack-但是可以。让我知道您是否需要更多信息


1
感谢弗雷德里克的建议。正如您指出的那样,它远非理想,但看起来像是少数可能的解决方法之一。我将通过建议如果采用这种方法,应使用auto_nodetitle模块来添加您的解决方案。我现在暂时悬而未决,因为我真的希望有更好的方法,并且我可以开始赏金。+1都是一样的。
irishbuzz 2011年

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主题而不是Garland,尽管所需的更改应该相似。在第二个代码段中,您是否要调用hook_preprocess_page()?您可以举一个更具体的例子吗?
irishbuzz

在第二个代码中,我们定义了一个新变量“ custom_block”。看一下我们正在“ custom_block”打印的第一部分代码。<?php if($ custom_block):打印'<div id =“ custom-block” class =“ clear-block”>'。$ custom_block。'</ div>'; 万一; ?>只需定义生成此变量的规则。所以?:)
dobeerman

4

这不适用于原始帖子中的Teaser问题,但是对于偶然发现此问题并只想使其在全视图中实现的人们而言,这是一个无需代码的选项:以块显示字段(使用视图, (例如),并将该块放置在您的内容块之上,但位于同一区域。


我仍然是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
这些功能不会改变标题和其他节点字段的输出顺序。为此,您应该更改模板文件。
kiamlaluno

我知道。我想您想在标题中添加一个字段值。
dobeerman 2011年

3

我使用Display Suite及其“阻止区域”附加功能通过无代码解决方案解决了这一问题。我最喜欢此解决方案的灵活性。

基本上,启用“区域阻止”额外功能,并在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); 万一; ?>转换为<?php print render($ my_image_field); ?>似乎没有对我所有页面发出任何警告。
艾米·尼贝尔

2

我知道您已经使用一些主题来构建,现在尝试在标题顶部添加字段。

我对所有在Drupal 7上构建主题的开发人员的建议是使用:Omega主题+上下文和Delta模块。这为您的布局奠定了非常坚实的基础。

灵活安排区域,块和字段。


1

您可以使用面板模块


这里的答案是旧的,但这引起了注意。最好稍微解释一下在这种情况下如何使用面板。
mpdonadio

仅将字段移动到另一个位置时,面板是巨大的开销。
阿克(Akko)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.