我想在D7中显示预告片时在节点标题之前呈现一个特定字段。
我已经研究过更新node.tpl.php,但是我注意到它与之分开$title
, $content
所以我不确定如何处理。经过一些搜索,我发现人们建议使用CCK和ConTemplate模块在Drupal-6中解决此问题,但我想知道是否还有更多Drupal-7解决方案。
有什么建议么?
我想在D7中显示预告片时在节点标题之前呈现一个特定字段。
我已经研究过更新node.tpl.php,但是我注意到它与之分开$title
, $content
所以我不确定如何处理。经过一些搜索,我发现人们建议使用CCK和ConTemplate模块在Drupal-6中解决此问题,但我想知道是否还有更多Drupal-7解决方案。
有什么建议么?
Answers:
使用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
渲染的内容。
展示套件也很酷。
通过Display Suite,您可以完全控制使用拖放界面显示内容的方式。您可以按照自己的方式排列节点,视图,注释,用户数据等,而不必遍历数十个模板文件。预定义的布局列表(仅D7)可提供更多的拖放乐趣!
看一下Title模块-http://drupal.org/project/title。它可能对您的情况有用。我出于某种原因安装/启用了它,可能与您的原因类似,并且它似乎为如何放置标题字段提供了灵活性。
此后,我已经禁用了它(并且正在使用Display Suite),所以我的回忆可能有点粗略。
这是一种骇人听闻的解决方案,我敢肯定有人会想出一些更优雅的东西,但是万一您被卡住了,没人能做到……
您可以用来page.tpl.php
完全删除打印内容$title
,并添加一个名为Title的新自定义字段,其机器名称为$ new_title或类似的名称。然后在节点上编辑,隐藏原始标题框,然后在节点上保存,使用计算字段或一些自定义php将拷贝$new_title
到$title
。
完成所有这些之后,编写一些CSS以使$ new_title看起来像页面标题以前一样,并且您应该能够通过将其拖放到“管理字段”屏幕中而以任意顺序放置任何字段。因为您已复制$new_title
到$title
,所以浏览器栏中的页面标题仍然可以使用,并且没有任何内容可抱怨缺少节点标题。
就像我说的那样,这是一个hack-但是可以。让我知道您是否需要更多信息
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';
}
}
我认为您应该在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) {
//
}
转储变量,然后执行所需的任何操作。添加/删除/更新。
我使用Display Suite及其“阻止区域”附加功能通过无代码解决方案解决了这一问题。我最喜欢此解决方案的灵活性。
基本上,启用“区域阻止”额外功能,并在Display Suite中启用“全文内容”显示。(假设您想在全节点显示中的标题上方显示内容,类似地,您可以将其用于除默认值之外的任何其他视图模式)。现在,在“全文内容”的“管理显示”部分中,在屏幕底部,应显示“阻止区域”选项卡。在此处输入新的块名称,保存所需字段并将其拖放到该块中。最后,将新创建的块在“块”屏幕中移动到节点标题上方的某个位置。
您可以在此处查看具有相同方法的视频:http : //www.youtube.com/watch?v=y4wyjxyhbNA,当然,您需要在标题上方(而不是在左侧边栏)末尾放置该块。
对于下面的禅宗模板,代码对我有用。
<?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;
?>