3
0
Fork 0
mirror of https://github.com/farmOS/farmOS.git synced 2024-02-23 11:37:38 +01:00
farmOS/farm_log.module

476 lines
12 KiB
Plaintext

<?php
/**
* @file
* Code for the Farm Log feature.
*/
include_once 'farm_log.features.inc';
/**
* Implements hook_permission().
*/
function farm_log_permission() {
return array(
'view farm logs' => array(
'title' => t('View farm logs'),
'description' => t('View all farm-related log items.'),
),
);
}
/**
* Implements hook_farm_admin_actions().
*/
function farm_log_farm_admin_actions() {
// Define farm area actions.
$actions = array(
'activity' => array(
'title' => t('Add an activity'),
'href' => 'log/add/farm_activity',
'assets' => array(
'all',
),
'views' => array(
'farm_log_activity',
),
'paths' => array(
'farm',
'farm/plan',
'taxonomy/term/%',
),
),
'movement' => array(
'title' => t('Add a movement'),
'href' => 'log/add/farm_movement',
'assets' => array(
'all',
),
'views' => array(
'farm_log_movement',
),
),
'observation' => array(
'title' => t('Add an observation'),
'href' => 'log/add/farm_observation',
'assets' => array(
'all',
),
'views' => array(
'farm_log_observation',
),
'paths' => array(
'farm',
'farm/plan',
),
),
);
return $actions;
}
/**
* Implements hook_farm_taxonomy_term_view_views().
*/
function farm_log_farm_taxonomy_term_view_views($term) {
// If the term is not an area, bail.
if ($term->vocabulary_machine_name != 'farm_areas') {
return;
}
// Return a list of Views to include on Areas.
return array(
array(
'name' => 'farm_log_activity',
'arg' => 2,
),
);
}
/**
* Implements hook_farm_area_links().
*/
function farm_log_farm_area_links($id) {
return array(
array(
'title' => t('Activities'),
'href' => 'taxonomy/term/' . $id,
'options' => array(
'fragment' => 'Activities',
),
'weight' => -100,
),
);
}
/**
* Implements hook_entity_view_alter()
*/
function farm_log_entity_view_alter(&$build, $type) {
/**
* Alter farm assets to display their current location.
*/
// If it's not a farm_asset, bail.
if ($type != 'farm_asset') {
return;
}
// If the entity information isn't available, bail.
if (empty($build['#entity'])) {
return;
}
$asset = $build['#entity'];
// Start an output string.
$output = '<strong>Current location:</strong> ';
// Get the asset's location.
$area = farm_log_asset_location($asset);
// If a location was found, add a link to it.
if (!empty($area->tid)) {
$output .= l($area->name, 'taxonomy/term/' . $area->tid);
}
// Otherwise, none.
else {
$options = array(
'query' => array(
'destination' => 'farm/asset/' . $asset->id,
'farm_asset' => $asset->id,
),
);
$link = l('add a movement', 'log/add/farm_movement', $options);
$output .= 'N/A (' . $link .')';
}
// Add it to the build array.
$build['location'] = array(
'#markup' => $output,
'#weight' => -100,
);
}
/**
* Implements hook_form_alter().
*/
function farm_log_form_alter(&$form, &$form_state, $form_id) {
// If this is a log form with an asset(s) reference field.
if ($form_id == 'log_form' && (!empty($form['field_farm_asset']))) {
// Alter the form using our helper function.
// ($asset is used below to for movement logs.)
$asset = farm_log_form_prepopulate_asset($form, 'field_farm_asset', TRUE);
}
// If this is a log form with an area(s) reference field...
if ($form_id == 'log_form' && (!empty($form['field_farm_area']))) {
// Alter the form with the farm_log helper function.
farm_log_form_prepopulate_area($form, 'field_farm_area');
}
// If this is the farm_movement log form...
if ($form_id == 'log_form' && $form['#bundle'] == 'farm_movement') {
// If no asset was found above, don't continue.
if (empty($asset)) {
return;
}
// If the "from" field is empty...
if (empty($form['field_farm_move_from'][LANGUAGE_NONE][0]['#default_value'])) {
// Look up the asset's last location and prepopulate the "from" field.
$area = farm_log_asset_location($asset);
if (!empty($area->name)) {
$form['field_farm_move_from'][LANGUAGE_NONE]['#default_value'] = $area->name;
}
}
}
}
/**
* Find the location of an asset.
*
* @param FarmAsset $asset
* The farm_asset object to look for.
* @param int $time
* Unix timestamp limiter. Only movement logs before this time will be
* included. Defaults to the current time. Set to 0 to load the absolute last.
* @param boolean $done
* Whether or not to only show movement logs that are marked as "done".
* Defaults to TRUE.
*
* @return area
* Returns the area that the asset is in.
*/
function farm_log_asset_location(FarmAsset $asset, $time = REQUEST_TIME, $done = TRUE) {
$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'log')
->entityCondition('bundle', 'farm_movement')
->fieldCondition('field_farm_asset', 'target_id', $asset->id)
->propertyOrderBy('timestamp', 'DESC')
->propertyOrderBy('id', 'DESC')
->range(0, 1);
if (!empty($time)) {
$query->propertyCondition('timestamp', $time, '<=');
}
if (!empty($done)) {
$query->propertyCondition('done', TRUE);
}
$result = $query->execute();
if (!empty($result['log'])) {
foreach ($result['log'] as $id => $entity) {
$log = log_load($id);
if (!empty($log->field_farm_move_to[LANGUAGE_NONE][0]['tid'])) {
$term = taxonomy_term_load($log->field_farm_move_to[LANGUAGE_NONE][0]['tid']);
if (!empty($term)) {
return $term;
}
}
}
}
}
/**
* Helper function for enabling asset prepopulation in log forms.
*
* @param $form
* The form array to modify, passed by reference.
* @param $field_name
* The machine name of the entity reference field that should be populated.
* @param $tags
* Whether or not the field is using the "Tags style" entity reference
* widget. Defaults to FALSE.
*
* @return FarmAsset farm_asset
* Returns the asset object, if found.
*/
function farm_log_form_prepopulate_asset(&$form, $field_name = 'field_farm_asset', $tags = FALSE) {
$asset = NULL;
// The location of the field's default value depends on whether or not it is
// a "Tags style" entity reference field.
if (empty($tags)) {
$field_value = &$form[$field_name][LANGUAGE_NONE][0]['target_id']['#default_value'];
}
else {
$field_value = &$form[$field_name][LANGUAGE_NONE]['#default_value'];
}
// If the "farm_asset" query parameter is set...
$params = drupal_get_query_parameters();
if (!empty($params['farm_asset'])) {
// Verify that the farm_asset is valid.
$asset = farm_asset_load($params['farm_asset']);
if ($asset) {
// Add the asset to the form.
$form['farm_asset'] = array(
'#type' => 'value',
'#value' => $asset,
);
// Prepopulate the asset reference field.
if (empty($field_value)) {
$field_value = entity_label('farm_asset', $asset) . ' (' . $asset->id . ')';
}
}
}
// If the asset field is not empty, hide it so that it can't be changed.
if (!empty($field_value)) {
$form[$field_name]['#access'] = FALSE;
}
return $asset;
}
/**
* Helper function for enabling area prepopulation in log forms.
*
* @param $form
* The form array to modify, passed by reference.
* @param $field_name
* The machine name of the term reference field that should be populated.
*
* @return TaxonomyTerm term
* Returns the taxonomy term object, if found.
*/
function farm_log_form_prepopulate_area(&$form, $field_name = 'field_farm_area') {
$area = NULL;
// Alias for the field's default value.
$field_value = &$form[$field_name][LANGUAGE_NONE]['#default_value'];
// If the "farm_area" query parameter is set...
$params = drupal_get_query_parameters();
if (!empty($params['farm_area'])) {
// Verify that the farm_area is valid.
$area = taxonomy_term_load($params['farm_area']);
if ($area) {
// Add the area to the form.
$form['farm_area'] = array(
'#type' => 'value',
'#value' => $area,
);
// Prepopulate the area reference field.
if (empty($field_value)) {
$field_value = entity_label('taxonomy_term', $area);
}
}
}
return $area;
}
/**
* Implements hook_action_info().
*/
function farm_log_action_info() {
return array(
'farm_log_asset_move_action' => array(
'type' => 'farm_asset',
'label' => t('Move'),
'configurable' => TRUE,
'triggers' => array('any'),
)
);
}
/**
* Asset move action configuration form.
*/
function farm_log_asset_move_action_form($context, $form_state) {
// Add Javascript to improve UX.
drupal_add_js(drupal_get_path('module', 'farm_log') . '/js/move_action.js');
// Build a list of the assets being moved.
if (!empty($form_state['selection'])) {
$assets = array();
$query = db_select('farm_asset', 'a');
$query->addField('a', 'name');
$query->condition('a.id', $form_state['selection']);
$results = $query->execute();
foreach ($results as $result) {
$assets[] = $result->name;
}
// If there is more than one asset, theme an item list.
if (count($assets) > 1) {
$markup = theme('item_list', array('items' => $assets, 'title' => t('Move Assets:')));
}
// Otherwise, display the one.
else {
$markup = '<h3>' . t('Move') . ' ' . reset($assets) . '</h3>';
}
// Display the asset(s) in the form.
$form['assets'] = array(
'#type' => 'markup',
'#markup' => $markup,
);
}
// "To" field: select list of areas.
$form['to'] = array(
'#type' => 'select',
'#title' => t('To'),
'#options' => taxonomy_allowed_values(field_info_field('field_farm_move_to')),
'#required' => TRUE,
);
// Convert the timestamp to the format Date API expects.
$default_value = date('Y-m-d H:i', REQUEST_TIME);
// "Date" field: default to current date.
$form['timestamp'] = array(
'#type' => 'date_select',
'#title' => t('Date'),
'#date_format' => 'M j Y',
'#date_type' => DATE_FORMAT_UNIX,
'#date_year_range' => '-10:+3',
'#default_value' => $default_value,
'#required' => TRUE,
);
// "Done" field: mark movements as done.
$form['done'] = array(
'#type' => 'checkbox',
'#title' => t('Movement is done'),
'#description' => t('Check this if the movement has already been done. Otherwise, you will need to mark the movement log item as done later.'),
'#default_value' => TRUE,
);
return $form;
}
/**
* Asset move action configuration form submit.
*/
function farm_log_asset_move_action_submit($form, $form_state) {
return array(
'to' => $form_state['values']['to'],
'timestamp' => $form_state['values']['timestamp'],
'done' => $form_state['values']['done'],
);
}
/**
* Action function for farm_log_asset_move_action.
*
* Creates a new movement record for the specified asset.
*
* @param object $entity
* An optional entity object.
* @param array $context
* Array with parameters for this action.
*/
function farm_log_asset_move_action($entity, $context = array()) {
// Pull the asset out of the context.
$asset = $context['farm_asset'];
// Create a new movement log entity.
$log = entity_create('log', array('type' => 'farm_movement'));
// Set the asset.
$log->field_farm_asset[LANGUAGE_NONE][] = array(
'target_id' => $asset->id,
);
// Set the date.
$log->timestamp = strtotime($context['timestamp']);
// Load the asset's current location.
$area = farm_log_asset_location($asset);
// If the asset has a current location, set the "from" area.
if (!empty($area->name) && !empty($area->tid)) {
$log->field_farm_move_from[LANGUAGE_NONE][] = array(
'tid' => $area->tid,
);
}
// Set the "to" area.
$log->field_farm_move_to[LANGUAGE_NONE][] = array(
'tid' => $context['to'],
);
// Set the log's done status.
$log->done = (!empty($context['done'])) ? TRUE : FALSE;
// Save the movement.
log_save($log);
}