我正在编写一个Drupal 7模块来显示内容中模块的子节点。
节点具有字段parent_nodes
(节点参考),其中选择一个或多个节点作为父节点。
首先,我创建了一个带有块视图显示projects
的视图subprojects
,显示带有project
上下文过滤器的field_parent_project
类型的节点。
这是我的模块:
<?php
function projects_preprocess_node(&$variables) {
if ($variables['type'] == 'project') {
if (isset($variables['view_mode']) && $variables['view_mode'] == 'full') {
_projects_add_subprojects($variables);
}
}
}
function _projects_add_subprojects(&$variables) {
$nid = $variables['nid'];
$view = views_get_view('projects');
$preview = $view->preview('subprojects', array($nid));
$subprojects = array(
'#title' => t('Subprojects'),
'#label_display' => 'above',
'#weight' => 10,
//'#theme' => 'field',
'#markup' => $preview,
);
if (!isset($variables['content']['subprojects'])) {
$variables['content']['subprojects'] = array();
}
$variables['content']['subprojects'][] = $subprojects;
dpm($variables['content']);
}
这很有效,将视图显示输出添加到节点的内容中。
只有一些东西不起作用:
如果我取消注释'#theme' => 'field'
行,则标题会显示为标签,但不会呈现任何内容。这是因为使用了字段主题,我想它需要#items
并且不使用#markup
元素。
我不能将子节点用作参考,而只能使用父节点。
解决方案必须独立于主题,因此不要回答“更改主题模板”或类似内容
如何在节点中显示子节点?我正在寻找一种方法来获得可解释的字段
答案 0 :(得分:1)
如果您还不知道,Viewfield module允许您在内容类型中将视图指定为字段。这可能会为您节省一些编码,但您可能不希望整个模块执行此类特定任务,因此......
如果您想继续使用自己编写的自定义代码,则需要将添加的内容重新构建为Drupal期望的正确render array结构。尝试这样的事情:
$subprojects_view_output = array(
'#type' => 'markup',
'#markup' => $preview,
);
$subprojects = array(
'#theme' => 'field',
'#weight' => 10,
'#title' => t('Subprojects'),
'#items' => $subprojects_view_output,
);
通过上述内容,您的字段的标题/标签以及字段的内容(视图本身)应该会显示出来。代码未经测试,因此在语法方面可能不是100%正确,但希望能为您提供解决方案的途径。
编辑:我测试了上述内容并无法正常工作,因为为了使用现有的theme_field功能,似乎Drupal需要更多信息才能使用正如您在警告信息中看到的那样,呈现#field_name
,#field_type
,#entity_type
等字段。
基本上,你伪造一个字段,如果你想继续使用内置的theme_field函数,你需要为Drupal提供它所期望的所有信息,包括所有preprocess函数中预期的变量。
或者,您可以继续使用原始代码并添加#prefix
以使您的标题/标签像这样呈现:
$subprojects = array(
'#weight' => 10,
'#prefix' => '<div id="subprojects-view">asdf:</div>',
//'#theme' => 'field',
'#markup' => $preview,
);
然后相应地用CSS设置标题/标签的样式。我所描述的加权没有任何问题。
答案 1 :(得分:1)
感谢@nmc,这是我的最终解决方案。如果未找到结果,则不显示标题。检查结果由if (count($view->result) == 0)
完成。体重正在发挥作用。
<?php
function projects_preprocess_node(&$variables) {
$type = $variables['type'];
if ($type == 'project' || $type == 'customer') {
if (isset($variables['view_mode']) && $variables['view_mode'] == 'full') {
_projects_add_subprojects_markup($variables);
}
}
}
function _projects_add_subprojects_markup(&$variables) {
$nid = $variables['nid'];
$view = views_get_view('projects');
$preview = $view->preview('subprojects', array($nid));
if (count($view->result) == 0) {
return;
}
$variables['content']['subprojects'] = array(
'#weight' => 10,
'#prefix' => '<h2>' . t('Subprojects') . '</h2>',
'#markup' => $preview,
);
}