Issue #3156713: Improvements to quick form for livestock grazing moves
This commit is contained in:
commit
d5e0d089d1
|
@ -9,8 +9,54 @@
|
|||
*/
|
||||
function farm_livestock_move_form($form, &$form_state) {
|
||||
|
||||
// Wrapper fieldset.
|
||||
// Planned log fieldset.
|
||||
$form['planned'] = array(
|
||||
'#type' => 'fieldset',
|
||||
'#title' => t('Planned Movements'),
|
||||
'#description' => t('Modify future movements that have been created with this quick form.'),
|
||||
'#collapsible' => TRUE,
|
||||
'#collapsed' => TRUE,
|
||||
);
|
||||
|
||||
// Query pending activity logs linked to this quick form.
|
||||
$query = db_select('farm_quick_entity', 'fqe');
|
||||
$query->addField('fqe', 'entity_id');
|
||||
$query->condition('fqe.entity_type', 'log');
|
||||
$query->condition('fqe.quick_form_id', 'farm_livestock_move_form');
|
||||
$log_alias = $query->join('log', 'l', 'fqe.entity_id = l.id');
|
||||
$query->condition($log_alias . '.type', 'farm_activity');
|
||||
$query->condition($log_alias . '.done', 0);
|
||||
$log_ids = $query->execute()->fetchCol();
|
||||
|
||||
// Load logs.
|
||||
$logs = log_load_multiple($log_ids);
|
||||
|
||||
// Build array of planned movement logs.
|
||||
$planned_movements = array();
|
||||
|
||||
// Build select options.
|
||||
foreach ($logs as $log) {
|
||||
$timestamp = $log->timestamp;
|
||||
$label = entity_label('log', $log);
|
||||
$option = $label . ' (' . t('Planned for @date', array('@date' => strftime('%m/%d/%Y', $timestamp))) . ')';
|
||||
$planned_movements[$log->id] = check_plain($option);
|
||||
}
|
||||
|
||||
$form['planned']['movement_log'] = array(
|
||||
'#type' => 'select',
|
||||
'#title' => t('Planned Logs'),
|
||||
'#options' => $planned_movements,
|
||||
'#empty_option' => '',
|
||||
'#empty_value' => '',
|
||||
'#ajax' => array(
|
||||
'callback' => 'farm_livestock_move_form_planned_movement_ajax',
|
||||
),
|
||||
);
|
||||
|
||||
// Movement fieldset.
|
||||
$form['move'] = array(
|
||||
'#prefix' => '<div id="movement">',
|
||||
'#suffix' => '</div>',
|
||||
'#type' => 'fieldset',
|
||||
'#title' => t('Record animal move'),
|
||||
'#description' => t('Use this form to record the movement of animals to an area. An activity log will be created with standard details filled in. You can also specify before/after observations of the area(s) that the animals are moving to/from.'),
|
||||
|
@ -19,8 +65,99 @@ function farm_livestock_move_form($form, &$form_state) {
|
|||
// Make the form a tree.
|
||||
$form['move']['#tree'] = TRUE;
|
||||
|
||||
// Start array of defaults to populate form fields.
|
||||
$defaults = array(
|
||||
'done' => TRUE,
|
||||
'date' => REQUEST_TIME,
|
||||
'assets' => NULL,
|
||||
'area' => NULL,
|
||||
'geom' => NULL,
|
||||
);
|
||||
|
||||
// Update default done value to match form state.
|
||||
if (isset($form_state['values']['move']['done'])) {
|
||||
$defaults['done'] = $form_state['values']['move']['done'];
|
||||
}
|
||||
|
||||
// Load a planned movement log.
|
||||
$movement_log = NULL;
|
||||
if (!empty($form_state['values']['movement_log'])) {
|
||||
|
||||
// Load the log.
|
||||
$log_id = $form_state['values']['movement_log'];
|
||||
$movement_log = log_load($log_id);
|
||||
}
|
||||
|
||||
$form['move']['log'] = array(
|
||||
'#type' => 'value',
|
||||
'#value' => $movement_log,
|
||||
);
|
||||
|
||||
// If a planned log was just selected, update the form with values from the log.
|
||||
if (!empty($movement_log) && isset($form_state['triggering_element']) && $form_state['triggering_element']['#name'] == 'movement_log') {
|
||||
|
||||
// Update movement status.
|
||||
$defaults['done'] = $movement_log->done;
|
||||
unset($form_state['input']['move']['done']);
|
||||
|
||||
// Update movement date.
|
||||
$defaults['date'] = strftime('%Y-%m-%d', $movement_log->timestamp);
|
||||
unset($form_state['input']['move']['date']);
|
||||
|
||||
$log_wrapper = entity_metadata_wrapper('log', $movement_log);
|
||||
|
||||
// Update default assets.
|
||||
$assets = $log_wrapper->field_farm_asset->value();
|
||||
|
||||
// Build list of asset names with ids
|
||||
// eg "Name [id: 5]"
|
||||
$asset_names = array();
|
||||
foreach ($assets as $asset) {
|
||||
$asset_label = entity_label('farm_asset', $asset);
|
||||
$asset_value = $asset_label . ' [id: ' . $asset->id . ']';
|
||||
$asset_names[] = check_plain($asset_value);
|
||||
}
|
||||
$asset_string = implode(', ', $asset_names);
|
||||
|
||||
// Update form asset name textfield.
|
||||
$defaults['assets'] = $asset_string;
|
||||
$form_state['values']['move']['assets'] = $asset_string;
|
||||
unset($form_state['input']['move']['assets']);
|
||||
|
||||
// Update the movement info.
|
||||
if (!empty($log_wrapper->field_farm_movement)) {
|
||||
|
||||
$movement_wrapper = $log_wrapper->field_farm_movement;
|
||||
|
||||
// Update movement areas.
|
||||
$areas = $movement_wrapper->field_farm_move_to->value();
|
||||
if (isset($areas[0])) {
|
||||
$defaults['area'] = $areas[0]->name;
|
||||
unset($form_state['input']['move']['area']['name']);
|
||||
}
|
||||
|
||||
// Update movement geometry.
|
||||
$geom = $movement_wrapper->field_farm_geofield->value();
|
||||
if (isset($geom[0])) {
|
||||
$defaults['geom'] = $geom[0]['geom'];
|
||||
unset($form_state['input']['move']['area']['geometry']['data']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Movement status.
|
||||
$form['move']['done'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Completed'),
|
||||
'#default_value' => $defaults['done'],
|
||||
'#ajax' => array(
|
||||
'callback' => 'farm_livestock_move_form_movement_status_ajax',
|
||||
'wrapper' => 'observations',
|
||||
),
|
||||
);
|
||||
|
||||
// Define the date format for logs.
|
||||
$date_format = 'Y-m-d';
|
||||
$date_format = 'Y-m-d H:i';
|
||||
|
||||
// Movement date.
|
||||
$form['move']['date'] = array(
|
||||
|
@ -29,16 +166,17 @@ function farm_livestock_move_form($form, &$form_state) {
|
|||
'#date_format' => $date_format,
|
||||
'#date_label_position' => 'within',
|
||||
'#date_year_range' => '-10:+3',
|
||||
'#default_value' => REQUEST_TIME,
|
||||
'#default_value' => $defaults['date'],
|
||||
'#required' => TRUE,
|
||||
);
|
||||
|
||||
// Animal/group select.
|
||||
$form['move']['asset'] = array(
|
||||
$form['move']['assets'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => t('Group/animal'),
|
||||
'#description' => t('Select the group/animal that is being moved.'),
|
||||
'#autocomplete_path' => 'farm_asset/autocomplete/animal+group',
|
||||
'#default_value' => $defaults['assets'],
|
||||
'#ajax' => array(
|
||||
'callback' => 'farm_livestock_move_form_current_location_ajax',
|
||||
),
|
||||
|
@ -47,23 +185,29 @@ function farm_livestock_move_form($form, &$form_state) {
|
|||
|
||||
// Load the animal or group asset
|
||||
// if an asset name has been entered.
|
||||
if (!empty($form_state['values']['move']['asset'])) {
|
||||
$assets = array();
|
||||
if (!empty($form_state['values']['move']['assets'])) {
|
||||
|
||||
// Extract an ID from the text field.
|
||||
$asset_id = 0;
|
||||
$matches = array();
|
||||
$result = preg_match('/\\[id: ([0-9]+)\\]/', $form_state['values']['move']['asset'], $matches);
|
||||
if (!empty($matches[$result])) {
|
||||
$asset_id = $matches[$result];
|
||||
// Extract asset IDs and load assets.
|
||||
$asset_names = drupal_explode_tags($form_state['values']['move']['assets']);
|
||||
foreach ($asset_names as $asset_name) {
|
||||
$id = 0;
|
||||
$matches = array();
|
||||
$result = preg_match('/\\[id: ([0-9]+)\\]/', $asset_name, $matches);
|
||||
if (!empty($matches[$result])) {
|
||||
$id = $matches[$result];
|
||||
}
|
||||
|
||||
// Load the asset.
|
||||
$asset = farm_asset_load($id);
|
||||
|
||||
// If asset was loaded add to list of assets to save.
|
||||
if (!empty($asset)) {
|
||||
$assets[$id] = $asset;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If an asset ID was found, load the asset.
|
||||
$asset = NULL;
|
||||
if (!empty($asset_id)) {
|
||||
$asset = farm_asset_load($asset_id);
|
||||
}
|
||||
|
||||
$form['move']['current_location'] = array(
|
||||
'#type' => 'hidden',
|
||||
'#value' => '',
|
||||
|
@ -73,18 +217,21 @@ function farm_livestock_move_form($form, &$form_state) {
|
|||
|
||||
// If a valid asset was supplied load its
|
||||
// current location and save WKT to hidden field.
|
||||
if (!empty($asset)) {
|
||||
$areas = farm_movement_asset_location($asset);
|
||||
if (!empty($assets)) {
|
||||
|
||||
// Get WKT geometry.
|
||||
$area_ids = array();
|
||||
foreach($areas as $area) {
|
||||
$area_ids[] = $area->tid;
|
||||
// Load current location geometry of all assets.
|
||||
$geoms = array();
|
||||
foreach ($assets as $asset) {
|
||||
$geoms[] = farm_movement_asset_geometry($asset);
|
||||
}
|
||||
$geom = farm_area_extract_geoms($area_ids);
|
||||
|
||||
// Combine geometries.
|
||||
$combined_geometry = farm_map_combine_geoms($geoms);
|
||||
|
||||
// Update current location field with WKT.
|
||||
$form['move']['current_location']['#value'] = $geom;
|
||||
if (!empty($combined_geometry)) {
|
||||
$form['move']['current_location']['#value'] = $combined_geometry->out('wkt');
|
||||
}
|
||||
}
|
||||
|
||||
// Area reference.
|
||||
|
@ -93,6 +240,7 @@ function farm_livestock_move_form($form, &$form_state) {
|
|||
'#title' => t('Moving to'),
|
||||
'#description' => t('Enter the name of the area that animals are moving to. A list of existing area options will appear as you type. If the area does not exist, a new one will be created.'),
|
||||
'#autocomplete_path' => 'taxonomy/autocomplete/field_farm_area',
|
||||
'#default_value' => $defaults['area'],
|
||||
'#ajax' => array(
|
||||
'callback' => 'farm_livestock_move_form_next_location_ajax',
|
||||
),
|
||||
|
@ -106,7 +254,7 @@ function farm_livestock_move_form($form, &$form_state) {
|
|||
'#title' => t('Geometry'),
|
||||
'#description' => t('This field allows you to optionally specify a more precise geometry for the new location of assets. If you leave it blank, the geometry will be copied from the areas that assets are moving to (if available).'),
|
||||
'#collapsible' => TRUE,
|
||||
'#collapsed' => TRUE,
|
||||
'#collapsed' => empty($defaults['geom']),
|
||||
);
|
||||
$form['move']['area']['geometry']['map'] = array(
|
||||
'#type' => 'farm_map',
|
||||
|
@ -117,7 +265,7 @@ function farm_livestock_move_form($form, &$form_state) {
|
|||
'#suffix' => '</div>',
|
||||
'#type' => 'textarea',
|
||||
'#title' => t('Data'),
|
||||
'#default_value' => '',
|
||||
'#default_value' => $defaults['geom'],
|
||||
);
|
||||
|
||||
// If provided, load the next location WKT
|
||||
|
@ -143,69 +291,112 @@ function farm_livestock_move_form($form, &$form_state) {
|
|||
|
||||
// Observations
|
||||
$form['move']['observations'] = array(
|
||||
'#prefix' => '<div id="observations">',
|
||||
'#suffix' => '</div>',
|
||||
'#type' => 'fieldset',
|
||||
'#title' => t('Observations'),
|
||||
'#description' => t('Optionally provide information about the area(s) that animals are moving out of, as well as the area(s) they are moving into.'),
|
||||
'#description' => t('Movement must be marked as completed to record observations.'),
|
||||
'#collapsible' => TRUE,
|
||||
'#collapsed' => TRUE,
|
||||
);
|
||||
|
||||
// Determine the unit based on the system of measurement.
|
||||
// (inches for US/Imperial, cm for Metric).
|
||||
$system = farm_quantity_system_of_measurement();
|
||||
$unit = 'cm';
|
||||
if ($system == 'us') {
|
||||
$unit = 'inches';
|
||||
// Only display observation fields if the movement is marked as done.
|
||||
if ($defaults['done']) {
|
||||
|
||||
// Update description text.
|
||||
$form['move']['observations']['#description'] = t('Optionally provide information about the area(s) that animals are moving out of, as well as the area(s) they are moving into.');
|
||||
|
||||
// Determine the unit based on the system of measurement.
|
||||
// (inches for US/Imperial, cm for Metric).
|
||||
$system = farm_quantity_system_of_measurement();
|
||||
$unit = 'cm';
|
||||
if ($system == 'us') {
|
||||
$unit = 'inches';
|
||||
}
|
||||
|
||||
// Save the unit for later.
|
||||
$form['move']['observations']['pasture_height_units'] = array(
|
||||
'#type' => 'value',
|
||||
'#value' => $unit,
|
||||
);
|
||||
|
||||
// Post grazing.
|
||||
$form['move']['observations']['post'] = array(
|
||||
'#type' => 'fieldset',
|
||||
'#title' => t('Post grazing in last area'),
|
||||
'#collapsible' => TRUE,
|
||||
'#collapsed' => TRUE,
|
||||
);
|
||||
$form['move']['observations']['post']['pasture_height'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => t('Pasture height'),
|
||||
'#input_group' => TRUE,
|
||||
'#field_suffix' => $unit,
|
||||
'#element_validate' => array('element_validate_number'),
|
||||
);
|
||||
$form['move']['observations']['post']['forage_quality'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => t('Relative forage quality'),
|
||||
'#description' => t('Give the forage quality a rating. This can be any number, but using a consistent scale (eg: 1-10) helps in future comparisons.'),
|
||||
'#element_validate' => array('element_validate_number'),
|
||||
);
|
||||
|
||||
// Load Observation Log field file directory from field info.
|
||||
$config = field_info_instance('log', 'field_farm_images', 'farm_observation');
|
||||
$file_directory = $config['settings']['file_directory'];
|
||||
|
||||
// Load supported image file extensions.
|
||||
$extensions = farm_fields_file_types('image');
|
||||
|
||||
// Build an upload location path.
|
||||
$scheme = variable_get('file_default_scheme', 'public');
|
||||
$upload_location = $scheme . '://' . $file_directory;
|
||||
|
||||
$form['move']['observations']['post']['photos'] = array(
|
||||
'#type' => 'managed_file',
|
||||
'#title' => t('Photos'),
|
||||
'#description' => t('Optionally attach a photo to this observation log. If multiple photos need to be attached, edit the log that is created by this form.'),
|
||||
'#name' => 'files[]',
|
||||
'#progress_indicator' => 'bar',
|
||||
'#upload_validators' => array(
|
||||
'file_validate_extensions' => array($extensions),
|
||||
),
|
||||
'#upload_location' => $upload_location,
|
||||
);
|
||||
|
||||
// Pre grazing
|
||||
$form['move']['observations']['pre'] = array(
|
||||
'#type' => 'fieldset',
|
||||
'#title' => t('Pre grazing in next area'),
|
||||
'#collapsible' => TRUE,
|
||||
'#collapsed' => TRUE,
|
||||
);
|
||||
$form['move']['observations']['pre']['pasture_height'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => t('Pasture height'),
|
||||
'#input_group' => TRUE,
|
||||
'#field_suffix' => $unit,
|
||||
'#element_validate' => array('element_validate_number'),
|
||||
);
|
||||
$form['move']['observations']['pre']['forage_quality'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => t('Relative forage quality'),
|
||||
'#description' => t('Give the forage quality a rating. This can be any number, but using a consistent scale (eg: 1-10) helps in future comparisons.'),
|
||||
'#element_validate' => array('element_validate_number'),
|
||||
);
|
||||
$form['move']['observations']['pre']['photos'] = array(
|
||||
'#type' => 'managed_file',
|
||||
'#title' => t('Photos'),
|
||||
'#description' => t('Optionally attach a photo to this observation log. If multiple photos need to be attached, edit the log that is created by this form.'),
|
||||
'#name' => 'files[]',
|
||||
'#progress_indicator' => 'bar',
|
||||
'#upload_validators' => array(
|
||||
'file_validate_extensions' => array($extensions),
|
||||
),
|
||||
'#upload_location' => $upload_location,
|
||||
);
|
||||
}
|
||||
|
||||
// Save the unit for later.
|
||||
$form['move']['observations']['pasture_height_units'] = array(
|
||||
'#type' => 'value',
|
||||
'#value' => $unit,
|
||||
);
|
||||
|
||||
// Post grazing.
|
||||
$form['move']['observations']['post'] = array(
|
||||
'#type' => 'fieldset',
|
||||
'#title' => t('Post grazing in last area'),
|
||||
'#collapsible' => TRUE,
|
||||
'#collapsed' => TRUE,
|
||||
);
|
||||
$form['move']['observations']['post']['pasture_height'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => t('Pasture height'),
|
||||
'#input_group' => TRUE,
|
||||
'#field_suffix' => $unit,
|
||||
'#element_validate' => array('element_validate_number'),
|
||||
);
|
||||
$form['move']['observations']['post']['forage_quality'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => t('Relative forage quality'),
|
||||
'#description' => t('Give the forage quality a rating. This can be any number, but using a consistent scale (eg: 1-10) helps in future comparisons.'),
|
||||
'#element_validate' => array('element_validate_number'),
|
||||
);
|
||||
|
||||
// Pre grazing
|
||||
$form['move']['observations']['pre'] = array(
|
||||
'#type' => 'fieldset',
|
||||
'#title' => t('Pre grazing in next area'),
|
||||
'#collapsible' => TRUE,
|
||||
'#collapsed' => TRUE,
|
||||
);
|
||||
$form['move']['observations']['pre']['pasture_height'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => t('Pasture height'),
|
||||
'#input_group' => TRUE,
|
||||
'#field_suffix' => $unit,
|
||||
'#element_validate' => array('element_validate_number'),
|
||||
);
|
||||
$form['move']['observations']['pre']['forage_quality'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => t('Relative forage quality'),
|
||||
'#description' => t('Give the forage quality a rating. This can be any number, but using a consistent scale (eg: 1-10) helps in future comparisons.'),
|
||||
'#element_validate' => array('element_validate_number'),
|
||||
);
|
||||
|
||||
// Submit button.
|
||||
$form['move']['submit'] = array(
|
||||
'#type' => 'submit',
|
||||
|
@ -225,29 +416,70 @@ function farm_livestock_move_form($form, &$form_state) {
|
|||
function farm_livestock_move_form_validate($form, &$form_state) {
|
||||
|
||||
// Validate animal or group asset.
|
||||
// Extract asset ID.
|
||||
$id = 0;
|
||||
$matches = array();
|
||||
$result = preg_match('/\\[id: ([0-9]+)\\]/', $form_state['values']['move']['asset'], $matches);
|
||||
if (!empty($matches[$result])) {
|
||||
$id = $matches[$result];
|
||||
}
|
||||
// Extract asset IDs and load assets.
|
||||
$assets = array();
|
||||
$asset_names = drupal_explode_tags($form_state['values']['move']['assets']);
|
||||
foreach ($asset_names as $asset_name) {
|
||||
$id = 0;
|
||||
$matches = array();
|
||||
$result = preg_match('/\\[id: ([0-9]+)\\]/', $asset_name, $matches);
|
||||
if (!empty($matches[$result])) {
|
||||
$id = $matches[$result];
|
||||
}
|
||||
|
||||
// If an ID couldn't be extracted, throw an error.
|
||||
if (empty($id)) {
|
||||
form_set_error('move][asset', t('Could not load the animal asset. Make sure the animal asset ID is included. For example: "My animal [id: 123]"'));
|
||||
}
|
||||
// If an ID couldn't be extracted, throw an error.
|
||||
if (empty($id)) {
|
||||
form_set_error('move][asset', t('Could not load the animal asset. Make sure the animal asset ID is included. For example: "My animal [id: 123]"'));
|
||||
}
|
||||
|
||||
// Load the asset.
|
||||
$asset = farm_asset_load($id);
|
||||
// Load the asset.
|
||||
$asset = farm_asset_load($id);
|
||||
|
||||
// If the asset didn't load, throw an error.
|
||||
if (empty($asset)) {
|
||||
form_set_error('move][asset', t('Could not load the animal asset. Make sure the animal name and ID are correct.'));
|
||||
// If asset was loaded add to list of assets to save.
|
||||
if (!empty($asset)) {
|
||||
$assets[$id] = $asset;
|
||||
}
|
||||
|
||||
// If the asset didn't load, throw an error.
|
||||
if (empty($asset)) {
|
||||
form_set_error('move][asset', t('Could not load the animal asset. Make sure the animal name and ID are correct.'));
|
||||
}
|
||||
}
|
||||
|
||||
// Save the asset to the form state.
|
||||
$form_state['storage']['asset'] = $asset;
|
||||
$form_state['storage']['assets'] = $assets;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ajax callback for farm_livestock_move_form().
|
||||
*/
|
||||
function farm_livestock_move_form_planned_movement_ajax($form, $form_state) {
|
||||
|
||||
// Get the movement form element and CSS selector.
|
||||
$element = $form['move'];
|
||||
$selector = '#movement';
|
||||
|
||||
// Build list of commands.
|
||||
$commands = array();
|
||||
|
||||
// Replace the hidden field.
|
||||
$commands[] = ajax_command_replace($selector, render($element));
|
||||
|
||||
// Add current location commands
|
||||
$commands = array_merge($commands, farm_livestock_move_form_current_location_commands($form, $form_state));
|
||||
|
||||
// Add update movement commands
|
||||
$commands = array_merge($commands, farm_livestock_move_form_update_movement_commands($form, $form_state));
|
||||
|
||||
// Return ajax commands.
|
||||
return array('#type' => 'ajax', '#commands' => $commands);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ajax callback for farm_livestock_move_form().
|
||||
*/
|
||||
function farm_livestock_move_form_movement_status_ajax($form, $form_state) {
|
||||
return $form['move']['observations'];
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -255,6 +487,30 @@ function farm_livestock_move_form_validate($form, &$form_state) {
|
|||
*/
|
||||
function farm_livestock_move_form_current_location_ajax($form, $form_state) {
|
||||
|
||||
// Load the current location commands.
|
||||
$commands = farm_livestock_move_form_current_location_commands($form, $form_state);
|
||||
|
||||
// Return ajax commands.
|
||||
return array('#type' => 'ajax', '#commands' => $commands);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ajax callback for farm_livestock_move_form().
|
||||
*/
|
||||
function farm_livestock_move_form_next_location_ajax($form, $form_state) {
|
||||
|
||||
// Load the update movement commands.
|
||||
$commands = farm_livestock_move_form_update_movement_commands($form, $form_state);
|
||||
|
||||
// Return ajax commands.
|
||||
return array('#type' => 'ajax', '#commands' => $commands);
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function to build current location ajax commands.
|
||||
*/
|
||||
function farm_livestock_move_form_current_location_commands($form, $form_state) {
|
||||
|
||||
// Get the "wkt" form element and CSS selector.
|
||||
$element = $form['move']['current_location'];
|
||||
$selector = '#current-location';
|
||||
|
@ -268,14 +524,13 @@ function farm_livestock_move_form_current_location_ajax($form, $form_state) {
|
|||
// Execute Javascript to add WKT to the map.
|
||||
$commands[] = array('command' => 'previewCurrentLocation');
|
||||
|
||||
// Return ajax commands.
|
||||
return array('#type' => 'ajax', '#commands' => $commands);
|
||||
return $commands;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ajax callback for farm_livestock_move_form().
|
||||
* Helper function to build update movement ajax commands.
|
||||
*/
|
||||
function farm_livestock_move_form_next_location_ajax($form, $form_state) {
|
||||
function farm_livestock_move_form_update_movement_commands($form, $form_state) {
|
||||
|
||||
// Get the "wkt" form element and CSS selector.
|
||||
$element = $form['move']['area']['geometry']['data'];
|
||||
|
@ -290,8 +545,7 @@ function farm_livestock_move_form_next_location_ajax($form, $form_state) {
|
|||
// Execute Javascript to add WKT to the map.
|
||||
$commands[] = array('command' => 'updateMovementLayer');
|
||||
|
||||
// Return ajax commands.
|
||||
return array('#type' => 'ajax', '#commands' => $commands);
|
||||
return $commands;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -299,60 +553,105 @@ function farm_livestock_move_form_next_location_ajax($form, $form_state) {
|
|||
*/
|
||||
function farm_livestock_move_form_submit($form, &$form_state) {
|
||||
|
||||
// Get the movement status.
|
||||
$done = $form_state['values']['move']['done'];
|
||||
|
||||
// Get the movement timestamp.
|
||||
$timestamp = strtotime($form_state['values']['move']['date']);
|
||||
|
||||
// Load the asset.
|
||||
$asset = $form_state['storage']['asset'];
|
||||
if (empty($asset)) {
|
||||
$assets = $form_state['storage']['assets'];
|
||||
if (empty($assets)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Save the pasture height units.
|
||||
$pasture_height_units = $form_state['values']['move']['observations']['pasture_height_units'];
|
||||
// Create post grazing observation log if values were submitted.
|
||||
if (isset($form_state['values']['move']['observations']['post'])) {
|
||||
|
||||
// Build post grazing measurements.
|
||||
$post_grazing_measurements = array();
|
||||
// Save the pasture height units.
|
||||
$pasture_height_units = $form_state['values']['move']['observations']['pasture_height_units'];
|
||||
|
||||
// Add post grazing pasture height measurement.
|
||||
if (!empty($form_state['values']['move']['observations']['post']['pasture_height'])) {
|
||||
$post_grazing_measurements[] = array(
|
||||
'measure' => 'length',
|
||||
'value' => $form_state['values']['move']['observations']['post']['pasture_height'],
|
||||
'units' => $pasture_height_units,
|
||||
'label' => 'Pasture Height',
|
||||
);
|
||||
}
|
||||
// Build post grazing measurements.
|
||||
$post_grazing_measurements = array();
|
||||
|
||||
// Add post grazing forage quality measurement.
|
||||
if (!empty($form_state['values']['move']['observations']['post']['forage_quality'])) {
|
||||
$post_grazing_measurements[] = array(
|
||||
'measure' => 'rating',
|
||||
'value' => $form_state['values']['move']['observations']['post']['forage_quality'],
|
||||
'label' => 'Forage Quality',
|
||||
);
|
||||
}
|
||||
|
||||
// Create post grazing observation log if measurements are provided.
|
||||
// Do this before creating a movement log for the asset.
|
||||
if (!empty($post_grazing_measurements)) {
|
||||
$post_grazing_log = farm_quantity_log_create('farm_observation', 'Post grazing observation', $timestamp, TRUE, array($asset), $post_grazing_measurements);
|
||||
|
||||
// Link the post grazing log to the quick form.
|
||||
if (function_exists('farm_quick_entity_link')) {
|
||||
farm_quick_entity_link('farm_livestock_move_form', 'log', $post_grazing_log);
|
||||
// Add post grazing pasture height measurement.
|
||||
if (!empty($form_state['values']['move']['observations']['post']['pasture_height'])) {
|
||||
$post_grazing_measurements[] = array(
|
||||
'measure' => 'length',
|
||||
'value' => $form_state['values']['move']['observations']['post']['pasture_height'],
|
||||
'units' => $pasture_height_units,
|
||||
'label' => 'Pasture Height',
|
||||
);
|
||||
}
|
||||
|
||||
// Link post grazing logs to the area(s) animals are moving from.
|
||||
$previous_areas = farm_movement_asset_location($asset);
|
||||
if (!empty($previous_areas)) {
|
||||
// Add post grazing forage quality measurement.
|
||||
if (!empty($form_state['values']['move']['observations']['post']['forage_quality'])) {
|
||||
$post_grazing_measurements[] = array(
|
||||
'measure' => 'rating',
|
||||
'value' => $form_state['values']['move']['observations']['post']['forage_quality'],
|
||||
'label' => 'Forage Quality',
|
||||
);
|
||||
}
|
||||
|
||||
// Save the photo file id.
|
||||
$post_grazing_file_id = $form_state['values']['move']['observations']['post']['photos'];
|
||||
|
||||
// Create post grazing observation log if measurements or photos are provided.
|
||||
// Do this before creating a movement log for the asset.
|
||||
if (!empty($post_grazing_measurements) || !empty($post_grazing_file_id)) {
|
||||
$post_grazing_log = farm_quantity_log_create('farm_observation', 'Post grazing observation', $timestamp, TRUE, $assets, $post_grazing_measurements);
|
||||
|
||||
// Link the post grazing log to the quick form.
|
||||
if (function_exists('farm_quick_entity_link')) {
|
||||
farm_quick_entity_link('farm_livestock_move_form', 'log', $post_grazing_log);
|
||||
}
|
||||
|
||||
// Create an entity metadata wrapper for the log.
|
||||
$log_wrapper = entity_metadata_wrapper('log', $post_grazing_log);
|
||||
|
||||
// Add areas to log.
|
||||
foreach($previous_areas as $area) {
|
||||
$log_wrapper->field_farm_area[] = $area;
|
||||
// Check if a file was uploaded.
|
||||
if (!empty($post_grazing_file_id)) {
|
||||
|
||||
// Load file.
|
||||
$file = file_load($post_grazing_file_id);
|
||||
|
||||
// Make the storage of the file permanent.
|
||||
$file->status = FILE_STATUS_PERMANENT;
|
||||
|
||||
// Save the file information.
|
||||
file_save($file);
|
||||
|
||||
// Save the image with the log.
|
||||
$log_wrapper->field_farm_images[] = array('fid' => $post_grazing_file_id);
|
||||
}
|
||||
|
||||
// Load current locations of all assets.
|
||||
$previous_areas = array();
|
||||
foreach ($assets as $asset) {
|
||||
$previous_areas = array_merge($previous_areas, farm_movement_asset_location($asset));
|
||||
}
|
||||
|
||||
// Link post grazing logs to the area(s) animals are moving from.
|
||||
if (!empty($previous_areas)) {
|
||||
|
||||
// Add areas to log.
|
||||
foreach ($previous_areas as $area) {
|
||||
$log_wrapper->field_farm_area[] = $area;
|
||||
}
|
||||
}
|
||||
|
||||
// Load current location geometry of all assets.
|
||||
$geoms = array();
|
||||
foreach ($assets as $asset) {
|
||||
$geoms[] = farm_movement_asset_geometry($asset);
|
||||
}
|
||||
|
||||
// Combine geometries.
|
||||
$combined_geometry = farm_map_combine_geoms($geoms);
|
||||
|
||||
// Add to log.
|
||||
if (!empty($combined_geometry)) {
|
||||
$log_wrapper->field_farm_geofield->set(array(array('geom' => $combined_geometry->out('wkt'))));
|
||||
}
|
||||
|
||||
// Save the log.
|
||||
|
@ -372,8 +671,59 @@ function farm_livestock_move_form_submit($form, &$form_state) {
|
|||
$geom = $form_state['values']['move']['area']['geometry']['data'];
|
||||
}
|
||||
|
||||
// Create activity log with asset movement to areas and specific geometry.
|
||||
$movement_log = farm_movement_create($asset, $areas, $timestamp, 'farm_activity', TRUE, $geom);
|
||||
// Edit planned movement log.
|
||||
if (!empty($form_state['values']['move']['log'])) {
|
||||
|
||||
// Get the movement log.
|
||||
$movement_log = $form_state['values']['move']['log'];
|
||||
|
||||
// Update status.
|
||||
$movement_log->done = $done;
|
||||
|
||||
// Update timestamp.
|
||||
$movement_log->timestamp = $timestamp;
|
||||
|
||||
// Update asset references.
|
||||
$movement_log->field_farm_asset[LANGUAGE_NONE] = array();
|
||||
foreach ($assets as $asset) {
|
||||
$movement_log->field_farm_asset[LANGUAGE_NONE][] = array('target_id' => $asset->id);
|
||||
}
|
||||
|
||||
// Update the movement info.
|
||||
$log_wrapper = entity_metadata_wrapper('log', $movement_log);
|
||||
if (!empty($log_wrapper->field_farm_movement)) {
|
||||
|
||||
// Get the movement wrapper.
|
||||
$movement_wrapper = $log_wrapper->field_farm_movement;
|
||||
|
||||
// Update values.
|
||||
$movement_wrapper->field_farm_move_to->set($areas);
|
||||
$movement_wrapper->field_farm_geofield->set(array(array('geom' => $geom)));
|
||||
$movement_wrapper->save();
|
||||
}
|
||||
|
||||
// Save the wrapper.
|
||||
$log_wrapper->save();
|
||||
|
||||
// Update log name.
|
||||
$movement_log->name = '';
|
||||
farm_movement_populate_name($movement_log);
|
||||
|
||||
// Display "Updated log" status message.
|
||||
$log_name = entity_label('log', $movement_log);
|
||||
$log_uri = entity_uri('log', $movement_log);
|
||||
$log_url = url($log_uri['path']);
|
||||
drupal_set_message(
|
||||
t('Log updated: <a href="@log_url">@log_name</a>',
|
||||
array('@log_url' => $log_url, '@log_name' => $log_name))
|
||||
);
|
||||
|
||||
}
|
||||
else {
|
||||
|
||||
// Create activity log with asset movement to areas and specific geometry.
|
||||
$movement_log = farm_movement_create($assets, $areas, $timestamp, 'farm_activity', $done, $geom);
|
||||
}
|
||||
|
||||
// Save the movement log.
|
||||
log_save($movement_log);
|
||||
|
@ -383,48 +733,80 @@ function farm_livestock_move_form_submit($form, &$form_state) {
|
|||
farm_quick_entity_link('farm_livestock_move_form', 'log', $movement_log);
|
||||
}
|
||||
|
||||
// Build pre grazing measurements.
|
||||
$pre_grazing_measurements = array();
|
||||
// Create pre grazing observation log if values were submitted.
|
||||
if (isset($form_state['values']['move']['observations']['pre'])) {
|
||||
|
||||
// Add pre grazing pasture height measurement.
|
||||
if (!empty($form_state['values']['move']['observations']['pre']['pasture_height'])) {
|
||||
$pre_grazing_measurements[] = array(
|
||||
'measure' => 'length',
|
||||
'value' => $form_state['values']['move']['observations']['pre']['pasture_height'],
|
||||
'units' => $pasture_height_units,
|
||||
'label' => 'Pasture Height',
|
||||
);
|
||||
}
|
||||
// Save the pasture height units.
|
||||
$pasture_height_units = $form_state['values']['move']['observations']['pasture_height_units'];
|
||||
|
||||
// Add pre grazing forage quality measurement.
|
||||
if (!empty($form_state['values']['move']['observations']['pre']['forage_quality'])) {
|
||||
$pre_grazing_measurements[] = array(
|
||||
'measure' => 'rating',
|
||||
'value' => $form_state['values']['move']['observations']['pre']['forage_quality'],
|
||||
'label' => 'Forage Quality',
|
||||
);
|
||||
}
|
||||
// Build pre grazing measurements.
|
||||
$pre_grazing_measurements = array();
|
||||
|
||||
// Create pre grazing observation log if measurements are provided.
|
||||
if (!empty($pre_grazing_measurements)) {
|
||||
$pre_grazing_log = farm_quantity_log_create('farm_observation', 'Pre grazing observation', $timestamp, TRUE, array($asset), $pre_grazing_measurements);
|
||||
|
||||
// Link the pre grazing log to the quick form.
|
||||
if (function_exists('farm_quick_entity_link')) {
|
||||
farm_quick_entity_link('farm_livestock_move_form', 'log', $pre_grazing_log);
|
||||
// Add pre grazing pasture height measurement.
|
||||
if (!empty($form_state['values']['move']['observations']['pre']['pasture_height'])) {
|
||||
$pre_grazing_measurements[] = array(
|
||||
'measure' => 'length',
|
||||
'value' => $form_state['values']['move']['observations']['pre']['pasture_height'],
|
||||
'units' => $pasture_height_units,
|
||||
'label' => 'Pasture Height',
|
||||
);
|
||||
}
|
||||
|
||||
// Link pre grazing logs to the area animals are moving to.
|
||||
if (!empty($areas)) {
|
||||
// Add pre grazing forage quality measurement.
|
||||
if (!empty($form_state['values']['move']['observations']['pre']['forage_quality'])) {
|
||||
$pre_grazing_measurements[] = array(
|
||||
'measure' => 'rating',
|
||||
'value' => $form_state['values']['move']['observations']['pre']['forage_quality'],
|
||||
'label' => 'Forage Quality',
|
||||
);
|
||||
}
|
||||
|
||||
// Save the photo file id.
|
||||
$pre_grazing_file_id = $form_state['values']['move']['observations']['pre']['photos'];
|
||||
|
||||
// Create pre grazing observation log if measurements or photos are provided.
|
||||
if (!empty($pre_grazing_measurements) || !empty($pre_grazing_file_id)) {
|
||||
$pre_grazing_log = farm_quantity_log_create('farm_observation', 'Pre grazing observation', $timestamp, TRUE, $assets, $pre_grazing_measurements);
|
||||
|
||||
// Link the pre grazing log to the quick form.
|
||||
if (function_exists('farm_quick_entity_link')) {
|
||||
farm_quick_entity_link('farm_livestock_move_form', 'log', $pre_grazing_log);
|
||||
}
|
||||
|
||||
// Create an entity metadata wrapper for the log.
|
||||
$log_wrapper = entity_metadata_wrapper('log', $pre_grazing_log);
|
||||
|
||||
// Add areas to log.
|
||||
foreach($areas as $area) {
|
||||
$log_wrapper->field_farm_area[] = $area;
|
||||
// Check if a file was uploaded.
|
||||
if (!empty($pre_grazing_file_id)) {
|
||||
|
||||
// Load file.
|
||||
$file = file_load($pre_grazing_file_id);
|
||||
|
||||
// Make the storage of the file permanent.
|
||||
$file->status = FILE_STATUS_PERMANENT;
|
||||
|
||||
// Save the file information.
|
||||
file_save($file);
|
||||
|
||||
// Save the image with the log.
|
||||
$log_wrapper->field_farm_images[] = array('fid' => $pre_grazing_file_id);
|
||||
}
|
||||
|
||||
// Save the log.
|
||||
// Link pre grazing logs to the area animals are moving to.
|
||||
if (!empty($areas)) {
|
||||
|
||||
// Add areas to log.
|
||||
foreach ($areas as $area) {
|
||||
$log_wrapper->field_farm_area[] = $area;
|
||||
}
|
||||
}
|
||||
|
||||
// Save custom geometry to pre-grazing logs.
|
||||
if (!empty($geom)) {
|
||||
$log_wrapper->field_farm_geofield->set(array(array('geom' => $geom)));
|
||||
}
|
||||
|
||||
// Save the log wrapper.
|
||||
$log_wrapper->save();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,6 +21,9 @@
|
|||
|
||||
// Make the layer editable.
|
||||
this.instance.addBehavior('edit', { layer: this.movementLayer });
|
||||
|
||||
// Add measure behavior.
|
||||
this.instance.addBehavior('measure', { layer: this.movementLayer});
|
||||
},
|
||||
|
||||
// Update the assets current location map layer.
|
||||
|
@ -45,6 +48,9 @@
|
|||
};
|
||||
this.currentLocationLayer = this.instance.addLayer('wkt', opts);
|
||||
this.instance.zoomToVectors();
|
||||
|
||||
// Add measure behavior.
|
||||
this.instance.addBehavior('measure', { layer: this.currentLocationLayer });
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -70,6 +76,9 @@
|
|||
// Make the layer editable.
|
||||
this.instance.addBehavior('edit', { layer: this.movementLayer });
|
||||
|
||||
// Add measure behavior.
|
||||
this.instance.addBehavior('measure', { layer: this.movementLayer});
|
||||
|
||||
// Zoom to all vector layers.
|
||||
this.instance.zoomToVectors();
|
||||
|
||||
|
|
Loading…
Reference in New Issue