我的内容类型资源有五种不同的资源类型(视频,文章,书籍等)。这些资源中的每一个都具有主图像字段(field_image)。如果用户没有提供图像,我想回退到默认图像。但是,我希望默认图像基于资源类型(视频,文章,书籍等)。是否有一个模块或解决方案在Drupal UI中执行此操作?我需要将图像附加到内容类型(不是模板中的硬编码),以便在详细信息,列表和其他视图页面上正确显示。
预期功能
我尝试了什么
Google :我已经尝试但未能找到任何能够实现这一目标的东西。我理解默认情况下,Drupal每个内容类型只允许一个默认图像。我可以为我的五种类型中的每一种创建一种新的内容类型,但这似乎是不必要的和笨重的。
硬代码:我有一个资源详细信息页面的模板,我已经硬编码了相关的默认图像,以显示是否没有图像,但这并不是因为我有很多视图(资源列表,相关资源等),我正在显示资源图像。
条件字段:我已尝试过模块字段依赖项(例如,当field_type = x时,设置field_image = y),但它似乎不能处理文件。
谢谢!
答案 0 :(得分: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;
}
答案 1 :(得分: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;
}
}
答案 2 :(得分:0)
您可以在视图中通过重写从字段类型中获取默认图像:
如果您在分类法中指定了字段New Node:[id: 9 cost: 10 in_queue: 0 next: (nil) parent: (nil)]
Printing Queue:
[id: 9 cost: 10 in_queue: 1 next: (nil) parent: (nil)]
New Node:[id: 13 cost: 14 in_queue: 0 next: (nil) parent: (nil)]
Printing Queue:
[id: 9 cost: 10 in_queue: 1 next: 0x15b0290 parent: (nil)]
[id: 13 cost: 14 in_queue: 1 next: (nil) parent: (nil)]
New Node:[id: 4 cost: 5 in_queue: 0 next: (nil) parent: (nil)]
Printing Queue:
[id: 4 cost: 5 in_queue: 1 next: 0x15b0260 parent: (nil)]
[id: 9 cost: 10 in_queue: 1 next: 0x15b0290 parent: (nil)]
[id: 13 cost: 14 in_queue: 1 next: (nil) parent: (nil)]
New Node:[id: 7 cost: 8 in_queue: 0 next: (nil) parent: (nil)]
TempNode next: 9
RUNS
PrevNode: 4
TempNode: 9
RUNNING 2
Printing Queue:
[id: 4 cost: 5 in_queue: 1 next: 0x15b0230 parent: (nil)]
[id: 7 cost: 8 in_queue: 1 next: (nil) parent: (nil)]
New Node:[id: 17 cost: 18 in_queue: 0 next: (nil) parent: (nil)]
TempNode next: 7
RUNS
PrevNode: 4
TempNode: 7
RUNS
PrevNode: 7
makefile:4: recipe for target 'all' failed
make: *** [all] Segmentation fault (core dumped)
。您可以将默认图像指定为:
field_type = article/video/...
(其中default_[field_type].jpg
是令牌)。如果您的图片名称为“无结果”,则需要这样做。
上面的解决方案将更通用。