【问题标题】:Content Type default image dependent on field value内容类型默认图像取决于字段值
【发布时间】:2015-08-03 16:59:24
【问题描述】:

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

预期功能

  • 资源:field_type = 文章; field_image = default_article.jpg
  • 资源:field_type = book; field_image = default_book.jpg
  • 资源:field_type = 视频; field_image = default_video.jpg

我的尝试

Google:我已经尝试过,但没有找到任何可以实现这一点的方法。我理解默认情况下,Drupal 只允许每种内容类型使用一个默认图像。我可以为我的五种类型中的每一种创建一个新的内容类型,但这似乎没有必要且笨拙。

硬编码:我有一个用于资源详细信息页面的模板,我在其中硬编码了相关的默认图像以显示是否存在图像,但这并不能很好地扩展,因为我有很多视图(资源列表、相关资源等)我在其中显示资源图像。

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

谢谢!

【问题讨论】:

  • 如果我错了,请纠正我,但是对于每个图像字段,您可以在定义/编辑内容类型时设置默认图像。你为什么不用那个?
  • 问题是我有一种内容类型(资源),我需要有多达 5 个不同的默认图像,具体取决于设置的类型(字段)。我可以创建 5 种不同的内容类型并设置默认图像,但资源类型非常相似,并且类型实际上仅用于分类(视频、文章等)
  • 但是您可以为每个字段设置默认图像,而不是每个内容类型?!
  • 我不确定我是否关注...每个资源都有一个图像字段,所以我只能设置 1 个默认图像...对吗?

标签: image drupal drupal-7


【解决方案1】:

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

【讨论】:

  • 这很棒!我不得不做一些调整,但总的来说它更干净,而且它适用于我所有的观点 - 谢谢!我没有提到的一件事是我在视图中使用了“重写结果”选项。看起来这会导致 drupal 将 index[0] 处的数组附加到 rewrite results 选项中引用的每个 $output[field_name] 上。更改数组的这一部分允许我更改在视图中呈现的结果。至于实际的节点页面,我还是在process_page()函数中调用了同样的函数。
  • 您能否分享一下如何为 Profile2 字段设置不同的设置?我有男性和女性用户,但他们都使用主要配置文件类型。我想要两张默认的剪影图片,以防用户不上传自己的照片。
【解决方案2】:

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

我在两个地方呈现资源:节点页面和视图内。

我为我的主题将以下函数添加到我的 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;
  }

}

【讨论】:

    【解决方案3】:

    您可以从您的字段类型中派生默认图像,并在视图中进行重写: 如果您在分类中指定了字段field_type = article/video/...。您可以通过将默认图像指定为: default_[field_type].jpg (其中field_type 是一个令牌)。如果您的图像名称没有“无结果”,您会想要这样做。 上述解决方案将更普遍适用。

    【讨论】:

      猜你喜欢
      • 2020-08-11
      • 2016-12-28
      • 1970-01-01
      • 2022-01-02
      • 2021-09-21
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      • 2023-01-17
      相关资源
      最近更新 更多