内容类型默认图像取决于字段值
Content Type default image dependent on field value
我有一个 resource 的内容类型,它有五种不同的资源类型(视频、文章、书籍等)。这些资源中的每一个都有一个主图像字段 (field_image)。如果用户不提供图像,我想回退到默认图像。但是,我希望默认图像基于资源类型(视频、文章、书籍等)。在 Drupal UI 中是否有模块或解决方案来执行此操作?我需要将图像附加到内容类型(不是在模板中硬编码),以便它在详细信息、列表和其他视图页面上正确显示。
预期功能
- 资源:field_type = 文章; field_image = default_article.jpg
- 资源:field_type = 书籍; field_image = default_book.jpg
- 资源:field_type = 视频; field_image = default_video.jpg
我试过的
Google:我试过了,但没能找到任何能让这成为可能的东西。我知道默认情况下 Drupal 只允许每种内容类型使用一个默认图像。我可以为我的五种类型中的每一种创建一个新的内容类型,但这似乎没有必要而且笨拙。
硬编码:我有一个资源详细信息页面的模板,我在其中对相关的默认图像进行了硬编码,以在不存在图像时显示,但这没有由于我在显示资源图像的地方有很多视图(资源列表、相关资源等),因此无法很好地缩放。
条件字段:我试过字段依赖模块(例如,当 field_type = x 时,设置 field_image = y),但它似乎不适用于文件。
谢谢!
以下是我设法解决此问题的方法。如果有人有更好的建议,我很乐意听取。
我在两个地方呈现资源:节点页面和视图内。
我在我的 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;
}
}
如果您的视图使用内容显示(而不是逐个字段),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;
}
您可以通过在视图中重写来从您的字段类型派生默认图像:
如果您在分类法中指定了字段 field_type = article/video/...
。您可以通过将其指定为以下方式来获取默认图像:
default_[field_type].jpg
(其中 field_type
是一个标记)。如果您的图像名称有 'No results',您会想要这样做。
上面的解决方案将更普遍适用。
我有一个 resource 的内容类型,它有五种不同的资源类型(视频、文章、书籍等)。这些资源中的每一个都有一个主图像字段 (field_image)。如果用户不提供图像,我想回退到默认图像。但是,我希望默认图像基于资源类型(视频、文章、书籍等)。在 Drupal UI 中是否有模块或解决方案来执行此操作?我需要将图像附加到内容类型(不是在模板中硬编码),以便它在详细信息、列表和其他视图页面上正确显示。
预期功能
- 资源:field_type = 文章; field_image = default_article.jpg
- 资源:field_type = 书籍; field_image = default_book.jpg
- 资源:field_type = 视频; field_image = default_video.jpg
我试过的
Google:我试过了,但没能找到任何能让这成为可能的东西。我知道默认情况下 Drupal 只允许每种内容类型使用一个默认图像。我可以为我的五种类型中的每一种创建一个新的内容类型,但这似乎没有必要而且笨拙。
硬编码:我有一个资源详细信息页面的模板,我在其中对相关的默认图像进行了硬编码,以在不存在图像时显示,但这没有由于我在显示资源图像的地方有很多视图(资源列表、相关资源等),因此无法很好地缩放。
条件字段:我试过字段依赖模块(例如,当 field_type = x 时,设置 field_image = y),但它似乎不适用于文件。
谢谢!
以下是我设法解决此问题的方法。如果有人有更好的建议,我很乐意听取。
我在两个地方呈现资源:节点页面和视图内。
我在我的 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;
}
}
如果您的视图使用内容显示(而不是逐个字段),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;
}
您可以通过在视图中重写来从您的字段类型派生默认图像:
如果您在分类法中指定了字段 field_type = article/video/...
。您可以通过将其指定为以下方式来获取默认图像:
default_[field_type].jpg
(其中 field_type
是一个标记)。如果您的图像名称有 'No results',您会想要这样做。
上面的解决方案将更普遍适用。