Background:项目管理系统,一个project下有很多sub-project,sub-project有各种状态(健康,不健康),project和sub-project是两个不同content type,sub-project属于某个project下。
Requirement:创建一个dashboard,显示项目的健康状态 (只要有一个子产品是不健康的就标红)。
Solution:
- 创建project列表的view(这里使用table显示),预留一个字段显示project健康状态。
- 创建不健康sub-project列表(需要知道所属project id)。
- 使用 hook_preprocess_views_view_table 修改view输出内容
- 获取不健康sub-project列表
- 获取当前project列表
- 遍历查找当前project下是否有不健康sub-project
- 输出
涉及到的内容
- 根据view display 获取 view
- 获取view field value
- 给view field 添加 class 属性
Code
use Drupal\views\Views;
/**
* Implements hook_preprocess_views_view_table().
*/
function hook_preprocess_views_view_table(&$variables) {
$view = $variables['view'];
$id = $view->storage->id();
if ($id !== 'project') return;
$monitor_status = [
['state'=>'expired', 'class'=>'error']
];
$list = _get_domain_status($monitor_status);
if(!$list) return;
$rows = $variables['rows'];
foreach ($rows as $rowId => $row) {
$field_output = $view->style_plugin->getFieldValue($rowId, 'nid');
if (!empty($list['expired'])) {
foreach($list['expired'][$id] as $value) {
if ($value === $field_output) {
$rows[$rowId]['columns']['field_status']['fields'][0] .= ' ' . $list['expired']['class'];
break;
}
}
}
}
$variables['rows'] = $rows;
}
/**
* Get unhealthy domain list.
*/
function _get_domain_status($status) {
foreach($status as $value) {
$state = $value['state'];
$results = views_get_view_result('domain', 'block_' . $state);
if ($results) {
foreach($results as $result) {
$list[$state]['project'][] = $result->_relationship_entities['field_project']->id();
}
$list[$state]['class'] = $value['class'];
$list[$state]['project'] = array_unique($list[$state]['project']);
$list[$state]['project'] = array_values($list[$state]['project']);
}
}
return $list;
}