如何输出Drupal中的图片字段?

21

可能我只是在寻找已经存在于Drupal(7)中的某个函数的名称,但有时文档很难浏览。希望有人能帮助我。

我有一个具有自定义字段的节点。

我正在一个名为field--mycustomcontenttype.tpl.php的模板中工作,因此要查找输出图像字段和图像样式的PHP函数的名称。

mycustomcontenttype是一个具有以下附加字段的节点:

[field_image] => Array
(
    [und] => Array
    (
        [0] => Array
        (
            [fid] => 51
            [alt] => ImageAltText
            [title] => 
            [width] => 150
            [height] => 150
            [uid] => 29
            [filename] => myimagename.jpg
            [uri] => public://myimagename.jpg
            [filemime] => image/jpeg
            [filesize] => 8812
            [status] => 1
            [timestamp] => 1339445372
            [uuid] => a088ea8f-ddf9-47d1-b013-19c8f8cada07
            [metatags] => Array
        (
    )
)

我可以使用一个(丑陋的)自定义函数来显示图像,该函数获取$item['#options']['entity']->field_image中找到的值并将public://替换为实际服务器路径。然后我可能还需要使用正确的Drupal图像样式(缩略图、自定义样式等)加载图像。

可悲的是,我不知道类似这样的函数名:unknown_function_name_drupal_image_print($item['#options']['entity']->field_image, 'thumnail');是什么。

有没有人能帮助我找到这个函数?

10个回答

23

您正在寻找 image_style_url(style_name, image_url);

例如:

<?='<img src="'.image_style_url('fullwidth', $node->field_page_image['und'][0]['filename']).'" />'?>

编辑

正如所指出的那样,您也可以在内容类型的“管理显示”页面中设置图像样式,然后使用render输出。

<?php print render($content['field_image']); ?>

我同意这个观点,不过我认为最好使用Drupal的主题层来渲染图像。http://api.drupal.org/api/drupal/includes!theme.inc/function/theme_image/7 - Web Assistant
我完全同意,但问题似乎是在寻找一个可以采用此方式的图像样式的函数。不过,我已经进行了编辑,包括渲染选项。 - SpaceBeers

14
我会使用 field_get_itemsfield_view_value 的组合来完成此操作。

例如:

    <?php

    // In some preprocessor...
    $images = field_get_items('node', $node, 'field_image');
    if(!empty($images)) {
      $image = field_view_value('node', $node, 'field_image', $images[0], array(
        'type' => 'image',
        'settings' => array(
          'image_style' => 'custom_image_style' // could be 'thumbnail'
        )
      )
     );
    }
    $variables['image'] = $image;

    // Now, in your .tpl.php
    <?php print render($image); ?>

我有一篇关于字段访问的写作,以及这件事在这里

祝好运。


2
这很棒!然而(至少对于Drupal 7),调用field_view_value应该是:field_view_value('node',$ node,'field_image',$ images [0],array(       'type' => 'image',       'settings' => array(         'image_style' => 'custom_image_style' //可以是'thumbnail'       )     );...你需要包括字段名称。 - Chadwick Wood
有没有办法将CSS类添加到字段包装器中呢?! - SaidbakR
这对我有效并似乎尊重语言模块的 oob。 - Thomas Fellinger
这是我在node.tpl.php中得到的代码:<?php if ( isset($node->field_image) ) { $node_image = field_get_items('node', $node, 'field_image');
?> <a href="<?php print $node_url; ?>" class="post-thumbnail" style="background-image:url(<?php print file_create_url($node_image[0]['uri']) ?>);"><img src="<?php print file_create_url($node_image[0]['uri']) ?>" /></a> <?php } ?>
- Thomas Fellinger

12

SpaceBeers的回答是正确的-您可以以这种方式打印图像。但在Drupal方面,这样做很糟糕。 如果多值字段仅有第一个字段,则语言未定义,且直接使用它。 此外,您正在硬编码Drupal的一些不错的东西,例如使用UI更改图像样式。

<?php print render($content['field_image']); ?>
这将打印出具有正确尺寸(在img标签中),alt标签,并始终尊重您在“管理显示”选项卡中设置的mycustomcontenttype节点类型的设置的图像。

我已经修改了我的答案,加入了这一点。我假设他们已经知道这个,并且想要能够以不同于默认样式的方式输出图像。 - SpaceBeers

8

我使用这个:

print theme('image_style', array('path' => [image uri from field], 'style_name' => [image style]));

您还可以包含一个“属性”数组变量,其中包含类、alt和标题等元素。我认为这是更好的选择,允许您选择图像样式,同时仍然使用Drupal(或您的主题)默认的图像呈现方式。


3

你应该使用

<?='<img src="'.image_style_url('fullwidth', $node->field_page_image['und'][0]['uri']).'" />'?>

替代

<?='<img src="'.image_style_url('fullwidth', $node->field_page_image['und'][0]['filename']).'" />'?>

1

我认为Ayesh K的答案是将字段打印到页面的首选Drupal方式。更易于阅读,并保留您在UI中对图像执行的任何操作/预设。

您可以将其分解,但似乎这只适用于狭窄的用例。


1
<?php
global $base_url;
$nid=6;//node id
$node=node_load($nid);
echo '<div style="margin-right:350px;">';
echo "<marquee>";
foreach($node->field_image_gallery['und'] as $v){
$image=$v['uri'];
$image_path=explode("public://",$image);
$url_path=$base_url.'/sites/default/files/'.$image_path[1];
echo '<img src="'.$url_path.'" width="100" height="100">&nbsp;';
 }

echo "</marquee>";
echo "</div>";
?>

1
虽然这段代码可能回答了问题,但提供有关它如何以及/或为什么解决问题的附加上下文将改善答案的长期价值。 - kowsky

0

这可以这样做:

   $style='full_width';
   $path=$node->my_img_field['und']['0']['uri'];
   $style_url = image_style_url($style, $path);
   print "<img src=".file_create_url($style_url)." >";

0
 $field_image = field_view_field('node', $promoNode, 'field_image');
 $variables['promo_image'] = render($field_image);

渲染:

<div class="field field--name-field-image field--type-image field--label-above">
  <div class="field__label">Image:&nbsp;</div>
  <div class="field__items">
      <div class="field__item even">
        <img typeof="foaf:Image" 
             src="http://domain/sites/domain/files/promo1.png"
             width="360" 
             height="301"
             alt="Promotional Image"
             title="Promotional Image Title">
      </div>
  </div>
</div>

注意:label-above类可以通过设置标签为“”,在字段的Manage-Display设置中删除,但是这对我现在不起作用,所以我只是使用CSS隐藏.field__label类。

-2

这对我来说很有效,可以在搜索结果页面上添加图片:

<?php if ($result['node']-> field_image): ?>
  <?php
  $search_image_uri = $result['node']-> field_image['und'][0]['uri'];
  // assuming that the uri starts with "public://"
  $search_image_locate = explode('//', $search_image_uri);
  $search_image_filepath = '/sites/actual/path/to/public/' . $search_image_locate[1];
  ?>
  <div class="search-image">
    <img src="<?php print $search_image_filepath; ?>" />
  </div>
<?php endif; ?>

发生了太多事情,比如需要拆分URI、构建文件路径...抱歉但它应该更简单。 - Alejandro Moreno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接