Php Drupal:使用视图输出作为节点内容
我正在编写一个Drupal7模块来显示内容中模块的子节点。 节点有一个字段Php Drupal:使用视图输出作为节点内容,php,drupal,drupal-7,drupal-modules,drupal-views,Php,Drupal,Drupal 7,Drupal Modules,Drupal Views,我正在编写一个Drupal7模块来显示内容中模块的子节点。 节点有一个字段父节点(节点引用),其中一个或多个节点被选为父节点 首先,我创建了一个视图projects,其中包含块视图显示subprojects,使用字段\u parent\u project上下文过滤器显示project类型的节点 这是我的模块: <?php function projects_preprocess_node(&$variables) { if ($variables['type'] == 'pr
父节点
(节点引用),其中一个或多个节点被选为父节点
首先,我创建了一个视图projects
,其中包含块视图显示subprojects
,使用字段\u parent\u project
上下文过滤器显示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']);
}
如果您还不知道,则允许您将视图指定为内容类型中的字段。这可能会为您节省一些编码,但您可能不希望整个模块执行这样的特定任务,因此
如果要继续使用编写的自定义代码,则需要将添加的内容重新构造为Drupal期望的正确结构。试着这样做:
$subprojects_view_output = array(
'#type' => 'markup',
'#markup' => $preview,
);
$subprojects = array(
'#theme' => 'field',
'#weight' => 10,
'#title' => t('Subprojects'),
'#items' => $subprojects_view_output,
);
通过上述操作,您的字段的标题/标签以及字段的内容(视图本身)应该显示出来。该代码未经测试,因此在语法方面可能不是100%正确的,并且有望为您提供解决方案的途径
编辑:我测试了上述功能,但它不起作用,因为为了使用现有的功能,Drupal似乎需要更多的信息来呈现一个字段,如#field_name
,#field_type
,#entity_type
,等等,正如您应该在警告消息中看到的那样
本质上,您是在伪造一个字段,如果您想继续使用内置函数,需要向Drupal提供它期望的所有信息,包括函数中期望的所有变量
或者,您可以继续使用原始代码并添加#前缀
,以使标题/标签呈现如下:
$subprojects = array(
'#weight' => 10,
'#prefix' => '<div id="subprojects-view">asdf:</div>',
//'#theme' => 'field',
'#markup' => $preview,
);
$subprojects=数组(
“#重量”=>10,
“#前缀”=>“asdf:”,
//“#主题”=>“字段”,
“#标记”=>$preview,
);
然后用相应的CSS设置标题/标签的样式。正如您所描述的,我对权重没有任何问题。多亏了@nmc,这是我的最终解决方案。如果未找到结果,则不显示标题。如果(计数($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,
);
}
我不需要viewfield模块,因为它允许您为每个节点选择一个视图,但我希望在类型为project
的所有节点中使用该视图,而不是让node creator选择视图。我正在尝试第二种解决方案。@Alessandy问什么不起作用?只是没有出现?你还没找到标题吗?订单/重量是否仍然不正确?无内容、无标签、无订单。如果我用#title
更改#标签
,它会显示标题。谢谢!前缀成功了!我添加了一个检查,如果没有找到结果,则隐藏前缀。