array( 'title' => t('View farm logs'), 'description' => t('View all farm-related log items.'), ), ); } /** * Implements hook_menu_local_tasks_alter(). */ function farm_log_menu_local_tasks_alter(&$data, $router_item, $root_path) { // Define actions. $actions = array( 'activity' => array( 'title' => t('Add an activity'), 'href' => 'log/add/farm_activity', ), 'movement' => array( 'title' => t('Add a movement'), 'href' => 'log/add/farm_movement', ), 'issue' => array( 'title' => t('Add an issue'), 'href' => 'log/add/farm_issue', ), 'observation' => array( 'title' => t('Add an observation'), 'href' => 'log/add/farm_observation', ), ); // Define actions for various paths. $path_actions = array( 'farm/area/%/activities' => array('activity'), 'farm/asset/%' => array('movement', 'observation'), 'farm/asset/%/movements' => array('movement'), 'farm/asset/%/observations' => array('observation'), 'admin/farm' => array('activity', 'issue', 'observation'), 'admin/farm/plan/activities' => array('activity'), 'admin/farm/plan/movements' => array('movement'), 'admin/farm/plan/issues' => array('issue'), 'admin/farm/plan/observations' => array('observation'), 'taxonomy/term/%' => array('activity'), ); // Add actions depending on the root path. if (array_key_exists($root_path, $path_actions)) { foreach ($path_actions[$root_path] as $action) { $output = array( '#theme' => 'menu_local_action', '#link' => array( 'title' => $actions[$action]['title'], 'href' => $actions[$action]['href'], 'localized_options' => array( 'query' => array( 'destination' => $root_path, ), ), ), ); // If this is a farm asset movements path... if (in_array($root_path, array( 'farm/asset/%', 'farm/asset/%/movements' ))) { // Get the asset id from the path. $asset_id = check_plain(arg(2)); // Set the destination to the farm asset page. $output['#link']['localized_options']['query']['destination'] = 'farm/asset/' . $asset_id; // Set the farm_asset query string to the asset id. This will be used to // prepopulate asset reference fields in log entities. // See hook_form_alter() below $output['#link']['localized_options']['query']['farm_asset'] = $asset_id; } // Or, if this is an area path... elseif ($root_path == 'taxonomy/term/%' || substr($root_path, 0, 11) == 'farm/area/%') { // Get the asset id from the path. $area_id = check_plain(arg(2)); // Load the area. $farm_area = taxonomy_term_load($area_id); // If the taxonomy term is not a farm_area, bail. if (empty($farm_area->vocabulary_machine_name) || $farm_area->vocabulary_machine_name != 'farm_areas') { continue; } // Set the destination to the farm area page. $output['#link']['localized_options']['query']['destination'] = 'taxonomy/term/' . $area_id; // Set the farm_area query string to the area id. This will be used to // prepopulate area reference fields in log entities. // See hook_form_alter() below $output['#link']['localized_options']['query']['farm_area'] = $area_id; } // Add the action output. if (!empty($output)) { $data['actions']['output'][] = $output; } } } } /** * Implements hook_farm_area_links(). */ function farm_log_farm_area_links($id) { return array( array( 'title' => t('Activities'), 'href' => 'farm/area/' . $id . '/activities', 'weight' => -100, ), ); } /** * Implements hook_form_alter(). */ function farm_log_form_alter(&$form, &$form_state, $form_id) { // If this is the farm_movement log form... if ($form_id == 'log_form' && $form['#bundle'] == 'farm_movement') { // Alter the form using our helper function. $asset = farm_log_form_prepopulate_asset($form, 'field_farm_asset'); // If no asset was returned, 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; } } } // If this is a log form with an area(s) reference field... if ($form_id == 'log_form' && (!empty($form['field_farm_area']) || !empty($form['field_farm_areas']))) { // First choice is farm_area, second is farm_areas. $field_name = (!empty($form['field_farm_area'])) ? 'field_farm_area' : 'field_farm_areas'; // Alter the form with the farm_log helper function. farm_log_form_prepopulate_area($form, $field_name); } } /** * Find the location of an asset. * * @param FarmAsset $asset * The farm_asset object to look for. * * @return area * Returns the area that the asset is in. */ function farm_log_asset_location(FarmAsset $asset) { $query = new EntityFieldQuery(); $query->entityCondition('entity_type', 'log') ->entityCondition('bundle', 'farm_movement') ->fieldCondition('field_farm_asset', 'target_id', $asset->id) ->fieldCondition('field_farm_date', 'value', REQUEST_TIME, '<=') ->fieldOrderBy('field_farm_date', 'value', 'DESC') ->propertyOrderBy('id', 'DESC') ->range(0, 1); $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. * * @return FarmAsset farm_asset * Returns the asset object, if found. */ function farm_log_form_prepopulate_asset(&$form, $field_name = 'field_farm_asset') { $asset = NULL; // 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($form[$field_name][LANGUAGE_NONE][0]['target_id']['#default_value'])) { $form[$field_name][LANGUAGE_NONE][0]['target_id']['#default_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($form[$field_name][LANGUAGE_NONE][0]['target_id']['#default_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; // 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($form[$field_name][LANGUAGE_NONE]['#default_value'])) { $form[$field_name][LANGUAGE_NONE]['#default_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) { // "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, ); 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'], ); } /** * 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->field_farm_date[LANGUAGE_NONE][] = array( 'value' => REQUEST_TIME, ); // 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'], ); // Save the movement. log_save($log); }