mirror of
https://github.com/farmOS/farmOS.git
synced 2024-02-23 11:37:38 +01:00
162 lines
4.4 KiB
PHP
162 lines
4.4 KiB
PHP
<?php
|
|
/**
|
|
* Views code for the Farm UI module.
|
|
*/
|
|
|
|
/**
|
|
* Build a renderable array of Views to add to a farmOS entity.
|
|
*
|
|
* @param $entity_type
|
|
* The entity type. Currently supports: 'farm_asset' or 'taxonomy_term'.
|
|
* @param $entity_bundle
|
|
* The entity bundle.
|
|
* @param $entity
|
|
* The loaded entity object.
|
|
*
|
|
* @return array
|
|
* Returns a render array of Views to add to the entity page.
|
|
*/
|
|
function farm_ui_entity_views($entity_type, $entity_bundle, $entity) {
|
|
|
|
// Start an empty build array.
|
|
$build = array();
|
|
|
|
// Start an empty array of Views.
|
|
$views = array();
|
|
|
|
// Load entity UI information.
|
|
$ui_info = farm_ui_entities();
|
|
|
|
// Automatically generate a list of log Views to display on assets.
|
|
if ($entity_type == 'farm_asset' && !empty($ui_info['log'])) {
|
|
foreach ($ui_info['log'] as $bundle => $info) {
|
|
|
|
// If a View is not defined, skip it.
|
|
if (empty($info['view'])) {
|
|
continue;
|
|
}
|
|
|
|
// If the log applies to this asset type (or to all types), add the View.
|
|
if (empty($info['farm_asset']) || $info['farm_asset'] == 'all' || $info['farm_asset'] == $entity->type) {
|
|
$view = array(
|
|
'name' => $info['view'],
|
|
);
|
|
if (!empty($info['weight'])) {
|
|
$view['weight'] = $info['weight'];
|
|
}
|
|
$views[] = $view;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Ask modules for Views.
|
|
$module_views = module_invoke_all('farm_ui_entity_views', $entity_type, $entity_bundle, $entity);
|
|
if (!empty($module_views)) {
|
|
$views = array_merge($views, $module_views);
|
|
}
|
|
|
|
// If there are no Views, bail.
|
|
if (empty($views)) {
|
|
return $build;
|
|
}
|
|
|
|
// Process the list of Views into a standardized list,
|
|
// and prepare to order by weight and name.
|
|
$weight_index = array();
|
|
$name_index = array();
|
|
foreach ($views as $key => $data) {
|
|
|
|
// If the data is just a name, wrap it in an array.
|
|
if (!is_array($data)) {
|
|
$data = array(
|
|
'name' => $data,
|
|
);
|
|
}
|
|
|
|
// Merge with defaults.
|
|
$defaults = array(
|
|
'arg' => 1,
|
|
'weight' => 0,
|
|
);
|
|
$views[$key] = array_merge($defaults, $data);
|
|
|
|
// Add to the weight and name indexes for sorting.
|
|
$weight_index[$key] = $views[$key]['weight'];
|
|
$name_index[$key] = $views[$key]['name'];
|
|
}
|
|
|
|
// Sort the Views by weight ascending, name ascending.
|
|
array_multisort($weight_index, SORT_ASC, $name_index, SORT_ASC, $views);
|
|
|
|
// Define the ID property of the entity, based on the type.
|
|
switch ($entity_type) {
|
|
case 'farm_asset':
|
|
$id = 'id';
|
|
break;
|
|
case 'taxonomy_term':
|
|
$id = 'tid';
|
|
break;
|
|
}
|
|
|
|
// Add the Views to the entity's render array.
|
|
foreach ($views as $key => $data) {
|
|
|
|
// Load the View, and bail if it isn't found.
|
|
$view = views_get_view($data['name']);
|
|
if (empty($view)) {
|
|
continue;
|
|
}
|
|
|
|
// Determine the argument position (default to 1).
|
|
// This looks for the presence of $data['arg'] to learn which argument
|
|
// in the View we should send $entity->{$id} into. This is useful if the View
|
|
// has multiple contextual filters, and the entity filter is not first.
|
|
// Any arguments that come before the term argument will receive 'all'
|
|
// as their input.
|
|
$args = array();
|
|
$arg_pos = isset($data['arg']) ? $data['arg'] : 1;
|
|
for ($i = 1; $i <= $arg_pos; $i++) {
|
|
if ($i == $arg_pos) {
|
|
$args[] = $entity->{$id};
|
|
}
|
|
else {
|
|
$args[] = 'all';
|
|
}
|
|
}
|
|
|
|
// If a specific display was specified, use it. Otherwise use 'default'.
|
|
if (!empty($data['display'])) {
|
|
$display = $data['display'];
|
|
}
|
|
else {
|
|
$display = 'default';
|
|
}
|
|
$view->set_display($display);
|
|
|
|
// Get the View's default title.
|
|
// We intentionally do this before we build the preview so that the title
|
|
// is not overridden by the arguments. This keeps the title simple on the
|
|
// actual entity page, but more descriptive in other contexts.
|
|
$title = $view->get_title();
|
|
|
|
// Build the View preview.
|
|
$preview = $view->preview($display, $args);
|
|
|
|
// Only display if the View has results (and 'always' is not TRUE).
|
|
if (empty($data['always']) && $view->total_rows == 0) {
|
|
continue;
|
|
}
|
|
|
|
// Build the output.
|
|
$output = '<h3 id="' . $title . '">' . $title . '</h3>' . $preview;
|
|
|
|
// Add the output to the entity build array.
|
|
$build[$data['name']] = array(
|
|
'#markup' => $output,
|
|
'#weight' => 100 + $key,
|
|
);
|
|
}
|
|
|
|
// Return the build array.
|
|
return $build;
|
|
}
|