内容类型默认图像取决于字段值

问题描述 投票:0回答:3

我有一种内容类型的资源,有五种不同的资源类型(视频,文章,书籍等)。这些资源中的每一个都具有主图像字段(field_image)。如果用户没有提供图像,我想回退到默认图像。但是,我希望默认图像基于资源类型(视频,文章,书籍等)。是否有一个模块或解决方案在Drupal UI中执行此操作?我需要将图像附加到内容类型(不是模板中的硬编码),以便在详细信息,列表和其他视图页面上正确显示。

预期的功能

  • 资源:field_type = article; field_image = default_article.jpg
  • 资源:field_type = book; field_image = default_book.jpg
  • 资源:field_type = video; field_image = default_video.jpg

我试过的

谷歌:我已经尝试但未能找到任何能够实现这一目标的东西。我理解默认情况下,Drupal每个内容类型只允许一个默认图像。我可以为我的五种类型中的每一种创建一种新的内容类型,但这似乎是不必要的和笨重的。

硬编码:我有一个模板用于我的资源详细信息页面,我已经硬编码了相关的默认图像,以显示是否存在图像,但由于我有很多视图(资源列表,相关资源,等)我正在显示资源图像。

条件字段:我已经尝试过模块字段依赖项(例如,当field_type = x时,设置field_image = y),但它似乎不适用于文件。

谢谢!

image drupal drupal-7
3个回答
2
投票

如果您的视图使用内容显示(而不是逐个字段),则hook_field_attach_view_alter()是您的选择。如果您的视图依赖于字段显示,您可以尝试hook_field_attach_load()

function yourmodule_field_attach_view_alter(&$output, $context) {
  // Append RDF term mappings on displayed taxonomy links.
  if ($context['entity_type'] == 'node' && $context['entity']->type == 'resource') {
    foreach (element_children($output) as $field_name) {
        if ($field_name == 'field_resource') {
            $element = &$output[$field_name];
            foreach ($element ['#items'] as $delta => $item) {
                yourmodule_defaultimg($item, $node->field_resource_type['und'][0]['value']);
            }
        }
    }  
  }
}

function yourmodule_defaultimg(&$item, $resource_type) {

    switch($resource_type) {
      case "Article":
        $filename = 'default_resource_article.jpg';
        $uri = 'public://default_images/default_resource_article.jpg';
        break;
      case "Book":
        $filename = 'default_resource_book.jpg';
        $uri = 'public://default_images/default_resource_book.jpg';
        break;
      case "Video":
        $filename = 'default_resource_video.jpg';
        $uri = 'public://default_images/default_resource_video.jpg';
        break;
      case "Tool":
        $filename = 'default_resource_tool.jpg';
        $uri = 'public://default_images/default_resource_tool.jpg';
        break;
      case "Picture of Practice":
        $filename = 'default_resource_picture-of-practice.jpg';
        $uri = 'public://default_images/default_resource_picture-of-practice.jpg';
        break;
    }

    $item['uri'] = $uri;
    $item['filename'] = $filename;
}

0
投票

这就是我设法解决这个问题的方法。如果有人有更好的建议,我很乐意听到。

我有两个地方可以渲染资源:节点页面和视图中。

我将以下函数添加到我的主题的template.php文件中。

此函数用于预处理节点页面:

function MYTHEME_preprocess_page(&$vars) {
    if($vars['node']->type == 'resource') {
        renderResourceDefaultImg($vars['node'], 'node');
    }
}

和这个函数来预渲染视图块:

function MYTHEME_views_pre_render(&$view) {
    if($view->current_display == 'BLOCKID') {
        foreach($view->result as $resource) {
            renderResourceDefaultImg($resource, 'view');
        }
    }
}

这是我添加到模板底部的renderResourceDefaultImg函数。

function renderResourceDefaultImg($resource, $displayType) {

    $resource_type_view = $resource->field_field_resource_type[0]['rendered']['#markup'];
    $resource_type_node = $resource->field_resource_type['und'][0]['value'];

    $resource_type = (!empty($resource_type_view)) ? $resource_type_view : $resource_type_node;

    switch($resource_type) {
      case "Article":
        $filename = 'default_resource_article.jpg';
        $uri = 'public://default_images/default_resource_article.jpg';
        break;
      case "Book":
        $filename = 'default_resource_book.jpg';
        $uri = 'public://default_images/default_resource_book.jpg';
        break;
      case "Video":
        $filename = 'default_resource_video.jpg';
        $uri = 'public://default_images/default_resource_video.jpg';
        break;
      case "Tool":
        $filename = 'default_resource_tool.jpg';
        $uri = 'public://default_images/default_resource_tool.jpg';
        break;
      case "Picture of Practice":
        $filename = 'default_resource_picture-of-practice.jpg';
        $uri = 'public://default_images/default_resource_picture-of-practice.jpg';
        break;
    }

    if($displayType == 'view') {
      $resource->field_field_image[0]['rendered']['#item']['filename'] = $filename;
      $resource->field_field_image[0]['rendered']['#item']['uri'] = $uri;
    } elseif($displayType == 'node') {
      $resource->field_image['und'][0]['uri'] = $uri;
      $resource->field_image['und'][0]['filename'] = $filename;
  }

}

0
投票

您可以在视图中使用重写从字段类型派生默认图像:如果您在分类中指定了字段field_type = article/video/...。您可以通过将其指定为以下来获取默认图像:default_[field_type].jpg(其中field_type是一个标记)。如果您的图像名称有“无结果”,则需要执行此操作。上述解决方案将更加普遍适用。

© www.soinside.com 2019 - 2024. All rights reserved.