/** * Return the generated form output. * @return Form HTML. */ public static function get_form($args) { data_entry_helper::enable_tabs(array('divId' => 'controls')); $r = "<form method=\"post\">\n"; // Get authorisation tokens to update and read from the Warehouse. $r .= data_entry_helper::get_auth($args['website_id'], $args['password']); $readAuth = data_entry_helper::get_read_auth($args['website_id'], $args['password']); $r .= "<input type=\"hidden\" id=\"website_id\" name=\"website_id\" value=\"" . $args['website_id'] . "\" />\n"; $r .= "<input type=\"hidden\" id=\"record_status\" name=\"record_status\" value=\"C\" />\n"; $r .= "<div id=\"controls\">\n"; // Create a list which jQuery can parse to create the tabs. $r .= "<ul>\r\n <li><a href=\"#recorder\"><span>Recorder</span></a></li>\r\n <li><a href=\"#site\"><span>Site</span></a></li>\r\n <li><a href=\"#species_tab_1\"><span>" . $args['tab_title_1'] . "</span></a></li>\n"; if ($args['list_id_2']) { $r .= "<li><a href=\"#species_tab_2\"><span>" . $args['tab_title_2'] . "</span></a></li>\n"; } if ($args['list_id_3']) { $r .= "<li><a href=\"#species_tab_3\"><span>" . $args['tab_title_3'] . "</span></a></li>\n"; } if ($args['list_id_4']) { $r .= "<li><a href=\"#species_tab_4\"><span>" . $args['tab_title_4'] . "</span></a></li>\n"; } $r .= "</ul>\n"; $r .= "<div id=\"recorder\">\n"; $r .= data_entry_helper::select(array('label' => 'Title', 'fieldname' => 'smpAttr:5', 'table' => 'termlists_term', 'captionField' => 'term', 'valueField' => 'id', 'extraParams' => $readAuth + array('termlist_external_key' => 'indicia:titles'))); $r .= data_entry_helper::text_input(array('label' => 'First name', 'fieldname' => 'smpAttr:6')); $r .= data_entry_helper::text_input(array('label' => 'Last name', 'fieldname' => 'smpAttr:7')); $r .= data_entry_helper::text_input(array('label' => 'Email', 'fieldname' => 'smpAttr:8')); // Postcode before address since entering the postcode auto-populates part of the address. $r .= data_entry_helper::postcode_textbox(array('label' => 'Postcode', 'fieldname' => 'smpAttr:10', 'linkedAddressBoxId' => 'address', 'hiddenFields' => false)); $r .= data_entry_helper::textarea(array('label' => 'Address', 'fieldname' => 'smpAttr:9', 'id' => 'address')); $r .= "</div>\n"; $r .= "<div id=\"site\">\n"; $r .= data_entry_helper::map(); $r .= data_entry_helper::date_picker(array('label' => 'Date', 'fieldname' => 'sample:date')); $r .= "</div>\n"; $r .= "<div id=\"species_tab_1\">\n"; $species_list_args = array('label' => 'Species', 'fieldname' => 'occurrence:taxa_taxon_list_id', 'table' => 'taxa_taxon_list', 'captionField' => 'taxon', 'valueField' => 'id', 'columns' => 2, 'extraParams' => $readAuth + array('taxon_list_id' => $args['list_id_1'])); $r .= data_entry_helper::species_checklist($species_list_args); $r .= "</div>\n"; $r .= "</div>\n"; $r .= "<input type=\"submit\" class=\"ui-state-default ui-corner-all\" value=\"Save\" />\n"; $r .= "</form>"; return $r; }
/** * Get the control for species input, either a grid or a single species input control. */ private static function get_control_species($auth, $args, $tabalias, $options) { $extraParams = $auth['read']; if ($args['species_names_filter'] == 'preferred') { $extraParams += array('preferred' => 't'); } if ($args['species_names_filter'] == 'language') { $extraParams += array('language' => iform_lang_iso_639_2($user->lang)); } if (self::getGridMode($args)) { // multiple species being input via a grid $species_ctrl_opts = array_merge(array('listId' => $args['list_id'], 'label' => lang::get('occurrence:taxa_taxon_list_id'), 'columns' => 1, 'extraParams' => $extraParams, 'survey_id' => $args['survey_id'], 'occurrenceComment' => $args['occurrence_comment'], 'occurrenceImages' => $args['occurrence_images'], 'PHPtaxonLabel' => true), $options); if ($args['extra_list_id']) { $species_ctrl_opts['lookupListId'] = $args['extra_list_id']; } if (isset($args['col_widths']) && $args['col_widths']) { $species_ctrl_opts['colWidths'] = explode(',', $args['col_widths']); } self::build_grid_taxon_label_function($args); self::build_grid_autocomplete_function($args); // Start by outputting a hidden value that tells us we are using a grid when the data is posted, // then output the grid control return '<input type="hidden" value="true" name="gridmode" />' . data_entry_helper::species_checklist($species_ctrl_opts); } else { // A single species entry control of some kind if (count(self::$occurrenceIds) == 1) { // output a hidden input to contain the occurrence id $r .= '<input type="hidden" name="occurrence:id" value="' . self::$occurrenceIds[0] . '" />' . "\n"; } if ($args['extra_list_id'] == '') { $extraParams['taxon_list_id'] = $args['list_id']; } elseif ($args['species_ctrl'] == 'autocomplete') { $extraParams['taxon_list_id'] = $args['extra_list_id']; } else { $extraParams['taxon_list_id'] = array($args['list_id'], $args['extra_list_id']); } $species_ctrl_opts = array_merge(array('label' => lang::get('occurrence:taxa_taxon_list_id'), 'fieldname' => 'occurrence:taxa_taxon_list_id', 'table' => 'taxa_taxon_list', 'captionField' => 'taxon', 'valueField' => 'id', 'columns' => 2, 'parentField' => 'parent_id', 'extraParams' => $extraParams), $options); if ($args['species_ctrl'] == 'tree_browser') { // change the node template to include images global $indicia_templates; $indicia_templates['tree_browser_node'] = '<div>' . '<img src="' . data_entry_helper::$base_url . '/upload/thumb-{image_path}" alt="Image of {caption}" width="80" /></div>' . '<span>{caption}</span>'; } // Dynamically generate the species selection control required. return call_user_func(array('data_entry_helper', $args['species_ctrl']), $species_ctrl_opts); } }
/** * Returns the species checklist input control. * @param array $auth Read authorisation tokens * @param array $args Form configuration * @param array $extraParams Extra parameters array, pre-configured with filters for taxa and name types. * @param array $options additional options for the control, e.g. those configured in the form structure. * @return HTML for the species_checklist control. */ protected static function get_control_species_checklist($auth, $args, $extraParams, $options) { global $user; // Build the configuration options if (isset($options['view'])) { $extraParams['view'] = $options['view']; } // There may be options in the form occAttr:n|param => value targetted at specific attributes $occAttrOptions = array(); $optionToUnset = array(); foreach ($options as $option => $value) { // split the id of the option into the attribute name and option name. $optionParts = explode('|', $option); if ($optionParts[0] != $option) { // an occurrence attribute option was found $attrName = $optionParts[0]; $optName = $optionParts[1]; // split the attribute name into the type and id (type will always be occAttr) $attrParts = explode(':', $attrName); $attrId = $attrParts[1]; if (!isset($occAttrOptions[$attrId])) { $occAttrOptions[$attrId] = array(); } $occAttrOptions[$attrId][$optName] = apply_user_replacements($value); $optionToUnset[] = $option; } } // tidy up options array foreach ($optionToUnset as $value) { unset($options[$value]); } // make sure that if extraParams is specified as a config option, it does not replace the essential stuff if (isset($options['extraParams'])) { $options['extraParams'] = array_merge($extraParams, $options['extraParams']); } $species_ctrl_opts = array_merge(array('occAttrOptions' => $occAttrOptions, 'listId' => $args['list_id'], 'label' => lang::get('occurrence:taxa_taxon_list_id'), 'columns' => 1, 'extraParams' => $extraParams, 'survey_id' => $args['survey_id'], 'occurrenceComment' => $args['occurrence_comment'], 'occurrenceSensitivity' => isset($args['occurrence_sensitivity']) ? $args['occurrence_sensitivity'] : false, 'occurrenceImages' => $args['occurrence_images'], 'PHPtaxonLabel' => true, 'language' => iform_lang_iso_639_2(hostsite_get_user_field('language')), 'cacheLookup' => $args['cache_lookup'], 'speciesNameFilterMode' => self::getSpeciesNameFilterMode($args), 'userControlsTaxonFilter' => isset($args['user_controls_taxon_filter']) ? $args['user_controls_taxon_filter'] : false, 'subSpeciesColumn' => $args['sub_species_column'], 'copyDataFromPreviousRow' => !empty($args['copy_species_row_data_to_new_rows']) && $args['copy_species_row_data_to_new_rows'], 'previousRowColumnsToInclude' => empty($args['previous_row_columns_to_include']) ? '' : $args['previous_row_columns_to_include'], 'editTaxaNames' => !empty($args['edit_taxa_names']) && $args['edit_taxa_names'], 'includeSpeciesGridLinkPage' => !empty($args['include_species_grid_link_page']) && $args['include_species_grid_link_page'], 'speciesGridPageLinkUrl' => $args['species_grid_page_link_url'], 'speciesGridPageLinkParameter' => $args['species_grid_page_link_parameter'], 'speciesGridPageLinkTooltip' => $args['species_grid_page_link_tooltip']), $options); if ($groups = hostsite_get_user_field('taxon_groups')) { $species_ctrl_opts['usersPreferredGroups'] = unserialize($groups); } if ($args['extra_list_id']) { $species_ctrl_opts['lookupListId'] = $args['extra_list_id']; } //We only do the work to setup the filter if the user has specified a filter in the box if (!empty($args['taxon_filter_field']) && !empty($args['taxon_filter'])) { $species_ctrl_opts['taxonFilterField'] = $args['taxon_filter_field']; $filterLines = helper_base::explode_lines($args['taxon_filter']); $species_ctrl_opts['taxonFilter'] = $filterLines; } if (isset($args['col_widths']) && $args['col_widths']) { $species_ctrl_opts['colWidths'] = explode(',', $args['col_widths']); } call_user_func(array(self::$called_class, 'build_grid_taxon_label_function'), $args, $options); if (self::$mode == self::MODE_CLONE) { $species_ctrl_opts['useLoadedExistingRecords'] = true; } // Start by outputting a hidden value that tells us we are using a grid when the data is posted, // then output the grid control return '<input type="hidden" value="true" name="gridmode" />' . data_entry_helper::species_checklist($species_ctrl_opts); }
/** * Get the control for species input, either a grid or a single species input control. */ protected static function get_control_species($auth, $args, $tabalias, $options) { global $user; $extraParams = $auth['read']; $fieldPrefix = !empty($options['fieldprefix']) ? $options['fieldprefix'] : ''; if (!empty($args['taxon_filter_field']) && !empty($args['taxon_filter'])) { $filterLines = helper_base::explode_lines($args['taxon_filter']); if ($args['multiple_subject_observation_mode'] !== 'single' && $args['taxon_filter_field'] !== 'taxon_group' && count($filterLines) === 1) { // The form is configured for filtering by taxon name or meaning id. If there is only one specified then the form // cannot display a species checklist, as there is no point. So, convert our preferred taxon name or meaning ID to find the // preferred taxa_taxon_list_id from the selected checklist, and then output a hidden ID. if (empty($args['list_id'])) { throw new exception(lang::get('Please configure the Initial Species List parameter to define which list the species to record is selected from.')); } $filter = array('preferred' => 't', 'taxon_list_id' => $args['list_id']); if ($args['taxon_filter_field'] == 'preferred_name') { $filter['taxon'] = $filterLines[0]; } else { $filter[$args['taxon_filter_field']] = $filterLines[0]; } $options = array('table' => 'taxa_taxon_list', 'extraParams' => $auth['read'] + $filter); $response = data_entry_helper::get_population_data($options); if (count($response) === 0) { throw new exception(lang::get('Failed to find the single species that this form is setup to record in the defined list.')); } if (count($response) > 1) { throw new exception(lang::get('This form is setup for single species recording, but more than one species with the same name exists in the list.')); } return '<input type="hidden" name="' . $fieldPrefix . 'occurrence:taxa_taxon_list_id" value="' . $response[0]['id'] . "\"/>\n"; } } if (call_user_func(array(get_called_class(), 'getGridMode'), $args)) { // multiple species being input via a grid $species_ctrl_opts = array_merge(array('listId' => $args['list_id'], 'label' => lang::get('occurrence:taxa_taxon_list_id'), 'columns' => 1, 'extraParams' => $extraParams, 'survey_id' => $args['survey_id'], 'occurrenceComment' => $args['occurrence_comment'], 'occurrenceSensitivity' => isset($args['subject_observation_confidential']) ? $args['subject_observation_confidential'] : false, 'occurrenceImages' => $args['observation_images'], 'PHPtaxonLabel' => true, 'language' => iform_lang_iso_639_2(hostsite_get_user_field('language')), 'cacheLookup' => isset($args['cache_lookup']) && $args['cache_lookup'], 'speciesNameFilterMode' => self::getSpeciesNameFilterMode($args)), $options); if ($args['extra_list_id']) { $species_ctrl_opts['lookupListId'] = $args['extra_list_id']; } if (!empty($args['taxon_filter_field']) && !empty($args['taxon_filter'])) { $species_ctrl_opts['taxonFilterField'] = $args['taxon_filter_field']; $species_ctrl_opts['taxonFilter'] = $filterLines; } if (isset($args['col_widths']) && $args['col_widths']) { $species_ctrl_opts['colWidths'] = explode(',', $args['col_widths']); } call_user_func(array(get_called_class(), 'build_grid_taxon_label_function'), $args); call_user_func(array(get_called_class(), 'build_grid_autocomplete_function'), $args); // Start by outputting a hidden value that tells us we are using a grid when the data is posted, // then output the grid control return '<input type="hidden" value="true" name="gridmode" />' . data_entry_helper::species_checklist($species_ctrl_opts); } else { // A single species entry control of some kind if ($args['extra_list_id'] == '') { $extraParams['taxon_list_id'] = $args['list_id']; } elseif ($args['species_ctrl'] == 'autocomplete') { $extraParams['taxon_list_id'] = empty($args['extra_list_id']) ? $args['list_id'] : $args['extra_list_id']; } else { $extraParams['taxon_list_id'] = array($args['list_id'], $args['extra_list_id']); } if (!empty($args['taxon_filter_field']) && !empty($args['taxon_filter'])) { // filter the taxa available to record $query = array('in' => array($args['taxon_filter_field'], helper_base::explode_lines($args['taxon_filter']))); } else { $query = array(); } // Apply the species names filter to the single species picker control if (isset($args['species_names_filter'])) { $languageFieldName = isset($args['cache_lookup']) && $args['cache_lookup'] ? 'language_iso' : 'language'; switch ($args['species_names_filter']) { case 'preferred': $extraParams += array('preferred' => 't'); break; case 'currentLanguage': if (isset($options['language'])) { $extraParams += array($languageFieldName => $options['language']); } break; case 'excludeSynonyms': $query['where'] = array("(preferred='t' OR {$languageFieldName}<>'lat')"); break; } } if (count($query)) { $extraParams['query'] = json_encode($query); } $species_ctrl_opts = array_merge(array('label' => lang::get('occurrence:taxa_taxon_list_id'), 'fieldname' => $fieldPrefix . 'occurrence:taxa_taxon_list_id', 'table' => 'taxa_taxon_list', 'captionField' => 'taxon', 'valueField' => 'id', 'columns' => 2, 'parentField' => 'parent_id', 'extraParams' => $extraParams, 'blankText' => 'Please select'), $options); if (isset($args['cache_lookup']) && $args['cache_lookup']) { $species_ctrl_opts['extraParams']['view'] = 'cache'; } global $indicia_templates; if (isset($args['species_include_both_names']) && $args['species_include_both_names']) { if ($args['species_names_filter'] == 'all') { $indicia_templates['species_caption'] = '{taxon}'; } elseif ($args['species_names_filter'] == 'language') { $indicia_templates['species_caption'] = '{taxon} - {preferred_name}'; } else { $indicia_templates['species_caption'] = '{taxon} - {common}'; } $species_ctrl_opts['captionTemplate'] = 'species_caption'; } if ($args['species_ctrl'] == 'tree_browser') { // change the node template to include images $indicia_templates['tree_browser_node'] = '<div>' . '<img src="' . self::warehouseUrl() . '/upload/thumb-{image_path}" alt="Image of {caption}" width="80" /></div>' . '<span>{caption}</span>'; } // Dynamically generate the species selection control required. return call_user_func(array('data_entry_helper', $args['species_ctrl']), $species_ctrl_opts); } }
/** * Return the generated form output. * @param array $args List of parameter values passed through to the form depending on how the form has been configured. * This array always contains a value for language. * @param object $node The Drupal node object. * @param array $response When this form is reloading after saving a submission, contains the response from the service call. * Note this does not apply when redirecting (in this case the details of the saved object are in the $_GET data). * @return Form HTML. * @todo: Implement this method */ public static function get_form($args, $node, $response = null) { global $indicia_templates, $user; data_entry_helper::enable_validation('entry_form'); $url = !empty($_SERVER['HTTPS']) ? "https://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'] : "http://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']; $r = data_entry_helper::loading_block_start(); $r .= "<form method=\"post\" id=\"entry_form\" action=\"{$url}\">\n"; $readAuth = data_entry_helper::get_read_auth($args['website_id'], $args['password']); $r .= "<div id=\"controls\">\n"; if ($args['interface'] != 'one_page') { $r .= "<ul>\n"; if ($user->uid == 0) { $r .= ' <li><a href="#about_you"><span>' . lang::get('about you') . "</span></a></li>\n"; } $r .= ' <li><a href="#species"><span>' . lang::get('what did you see') . "</span></a></li>\n"; $r .= ' <li><a href="#place"><span>' . lang::get('where was it') . "</span></a></li>\n"; $r .= ' <li><a href="#other"><span>' . lang::get('other information') . "</span></a></li>\n"; $r .= "</ul>\n"; data_entry_helper::enable_tabs(array('divId' => 'controls', 'style' => $args['interface'])); } if ($user->uid == 0) { $r .= "<fieldset id=\"about_you\">\n"; if ($args['interface'] == 'one_page') { $r .= '<legend>' . lang::get('about you') . '</legend>'; } $r .= data_entry_helper::text_input(array('label' => lang::get('first name'), 'fieldname' => 'smpAttr:' . $args['first_name_attr_id'], 'class' => 'control-width-4', 'validation' => array('required'))); $r .= data_entry_helper::text_input(array('label' => lang::get('surname'), 'fieldname' => 'smpAttr:' . $args['surname_attr_id'], 'class' => 'control-width-4', 'validation' => array('required'))); $r .= data_entry_helper::text_input(array('label' => lang::get('phone number'), 'fieldname' => 'smpAttr:' . $args['phone_attr_id'], 'class' => 'control-width-4')); $r .= data_entry_helper::text_input(array('label' => lang::get('email'), 'fieldname' => 'smpAttr:' . $args['email_attr_id'], 'class' => 'control-width-4 optional', 'validation' => array('email'))); if ($args['interface'] == 'wizard') { $r .= data_entry_helper::wizard_buttons(array('divId' => 'controls', 'page' => 'first')); } $r .= "</fieldset>\n"; } // Species tab $r .= "<fieldset id=\"species\">\n"; if ($args['interface'] == 'one_page') { $r .= '<legend>' . lang::get('what did you see') . '</legend>'; } $species_list_args = array('label' => lang::get('Species'), 'fieldname' => 'occurrence:taxa_taxon_list_id', 'table' => 'taxa_taxon_list', 'captionField' => 'taxon', 'valueField' => 'id', 'listId' => $args['species_list_id'], 'columns' => 1, 'parentField' => 'parent_id', 'checkboxCol' => false, 'occAttrs' => array($args['abundance_attr_id']), 'extraParams' => $readAuth + array('view' => 'detail', 'orderby' => 'taxonomic_sort_order'), 'survey_id' => $args['survey_id'], 'header' => false, 'view' => 'detail', 'PHPtaxonLabel' => true); // Build a nice template to show a picture of each species, with fancybox. data_entry_helper::add_resource('fancybox'); data_entry_helper::$javascript .= "jQuery('a.fancybox').fancybox();\n"; $indicia_templates['taxon_label'] = 'return \'<div class="taxon-cell">' . '<a href="' . data_entry_helper::$base_url . 'upload/{image_path}" class="fancybox" >' . '<img alt="{taxon}" src="' . data_entry_helper::$base_url . 'upload/med-{image_path}" width="250"/></a>' . '<div>{taxon}</div></div>' . '<div class="taxon-desc"><ul><li>\'.str_replace("\\n", "</li><li>","{description_in_list}").\'</li></ul>' . '<a href="http://www.marine-life.org.uk/northeastcetaceans/?q=\'. strtolower(str_replace(array(" ", "\\\'"), array("-", ""), "{taxon}")). \'" target="_blank" class="ui-state-default ui-corner-all indicia-button">' . lang::get('More Info') . '...</a></div>\';'; // Template the taxon label cell $indicia_templates['taxon_label_cell'] = "\n<td class='scTaxonCell'>{content}</td>"; // Also template the attribute controls to show the label in place. $indicia_templates['attribute_cell'] = "\n<td class='scOccAttrCell'><label>{label}:</label><br/>{content}</td>"; $r .= data_entry_helper::species_checklist($species_list_args); if ($args['interface'] == 'wizard') { $r .= data_entry_helper::wizard_buttons(array('divId' => 'controls', 'page' => $user->uid == 0 ? 'middle' : 'first')); } $r .= "</fieldset>"; // --Place tab-- $r .= "<fieldset id=\"place\">\n"; if ($args['interface'] == 'one_page') { $r .= '<legend>' . lang::get('where was it') . '</legend>'; } $r .= data_entry_helper::radio_group(array('label' => 'Where were you when you made the sighting?', 'fieldname' => 'smpAttr:' . $args['platform_attr_id'], 'table' => 'termlists_term', 'captionField' => 'term', 'valueField' => 'id', 'extraParams' => $readAuth + array('termlist_id' => $args['platform_termlist_id']), 'sep' => '<br />', 'labelClass' => 'auto', 'class' => 'inline sighting-platform', 'validation' => array('required'))); $r .= '<div id="place_wrapper" class="hidden">'; // Some instructions only visible when entering data from a boat $r .= '<p class="boat_mode page-notice ui-state-highlight ui-corner-all">' . lang::get('Instructions for when on boat') . '</p>'; // Some instructions only visible when entering data from the shore $r .= '<p class="shore_mode page-notice ui-state-highlight ui-corner-all">' . lang::get('Instructions for clicking on map') . '</p>'; $r .= '<div class="boat_mode">'; // Add help examples to the lat and long boxes $indicia_templates['sref_textbox_latlong'] = '<label for="{idLat}">{labelLat}:</label>' . '<input type="text" id="{idLat}" name="{fieldnameLat}" {class} {disabled} value="{default}" /> <p class="helpText">e.g. 55:12.345N</p>' . '<label for="{idLong}">{labelLong}:</label>' . '<input type="text" id="{idLong}" name="{fieldnameLong}" {class} {disabled} value="{default}" /> <p class="helpText">e.g. 0:45.678W</p>' . '<input type="hidden" id="imp-geom" name="{table}:geom" value="{defaultGeom}" />' . '<input type="text" id="{id}" name="{fieldname}" style="display:none" value="{default}" />'; $r .= data_entry_helper::sref_and_system(array('systems' => array(4326 => lang::get('Latitude, Longitude')), 'splitLatLong' => true, 'helpText' => lang::get('Instructions for latlong'))); $r .= '</div>'; // Initially, we hide the map. Only show it when the user selects the sighting was from the shore, // as a click on the map for boat recordings will not be accurate. $r .= '<div class="shore_mode">'; $options = iform_map_get_map_options($args, $readAuth); $olOptions = iform_map_get_ol_options($args); $options['maxZoom'] = 9; // Switch to degrees and decimal minutes for lat long. $options['latLongFormat'] = 'DM'; $r .= data_entry_helper::map_panel($options, $olOptions); // Now, add some JavaScript to show or hide the map. Show it for when the sighting was from the shore. // Hide it for boat based sightings as we want a GPS coordinate in this case. The JavaScript looks for the // checked radio button to see the value data_entry_helper::$javascript .= 'jQuery(".sighting-platform input").click( function() { var platformId = jQuery("input[name=smpAttr\\\\:' . $args['platform_attr_id'] . ']:checked").val(); if (platformId == ' . $args['platform_mapped_term_id'] . ') { jQuery("#place_wrapper").removeClass("hidden"); jQuery(".shore_mode").removeClass("hidden"); jQuery(".boat_mode").addClass("hidden"); } else { jQuery("#place_wrapper").removeClass("hidden"); jQuery(".shore_mode").addClass("hidden"); jQuery(".boat_mode").removeClass("hidden"); } } );' . "\n"; // Force existing setting of the radio buttons to reload when showign page after validation failure data_entry_helper::$onload_javascript .= ' jQuery("input[name=smpAttr\\\\:' . $args['platform_attr_id'] . ']:checked").trigger("click"); '; $r .= '</div></div>'; if ($args['interface'] == 'wizard') { $r .= data_entry_helper::wizard_buttons(array('divId' => 'controls')); } $r .= '</fieldset>'; // --Other information tab-- $r .= "<fieldset id=\"other\">\n"; // Get authorisation tokens to update and read from the Warehouse. $r .= data_entry_helper::get_auth($args['website_id'], $args['password']); $r .= "<input type=\"hidden\" name=\"website_id\" value=\"" . $args['website_id'] . "\" />\n"; $r .= "<input type=\"hidden\" name=\"survey_id\" value=\"" . $args['survey_id'] . "\" />\n"; $r .= "<input type=\"hidden\" name=\"occurrence:record_status\" value=\"C\" />\n"; if ($args['interface'] == 'one_page') { $r .= '<legend>' . lang::get('other information') . '</legend>'; } $r .= data_entry_helper::date_picker(array('label' => lang::get('Sighting Date'), 'fieldname' => 'sample:date')); $indicia_templates['timeFormat'] = '<label>hh:mm</label><br/>'; $r .= data_entry_helper::text_input(array('label' => lang::get('Sighting Time'), 'fieldname' => 'smpAttr:' . $args['sample_time_attr_id'], 'class' => 'control-width-1', 'suffixTemplate' => 'timeFormat')); $r .= data_entry_helper::textarea(array('label' => lang::get('Any other information'), 'fieldname' => 'sample:comment', 'class' => 'control-width-6', 'helpText' => lang::get('Instructions for any other info'))); $r .= '<div class="footer">' . data_entry_helper::checkbox(array('label' => lang::get('happy for contact'), 'labelClass' => 'auto', 'fieldname' => 'smpAttr:' . $args['contact_attr_id'])) . '</div>'; if ($args['interface'] == 'wizard') { $r .= data_entry_helper::wizard_buttons(array('divId' => 'controls', 'page' => 'last')); } else { $r .= "<input type=\"submit\" class=\"ui-state-default ui-corner-all\" value=\"Save\" />\n"; } $r .= "</fieldset></div>"; $r .= "</form>"; $r .= data_entry_helper::loading_block_end(); return $r; }
/** * Return the generated form output. * @return Form HTML. */ public static function get_form($args, $node) { global $user; $logged_in = $user->uid > 0; $r = ''; // Get authorisation tokens to update and read from the Warehouse. $writeAuth = data_entry_helper::get_auth($args['website_id'], $args['password']); $readAuth = data_entry_helper::get_read_auth($args['website_id'], $args['password']); $svcUrl = data_entry_helper::$base_url . '/index.php/services'; $mode = 0; // default mode : display survey selector // mode 1: display new sample // mode 2: display existing sample $loadID = null; $displayThisOcc = true; // when populating from the DB rather than POST we have to be // careful with selection object, as geom in wrong format. if ($_POST) { if (!is_null(data_entry_helper::$entity_to_load)) { $mode = 2; // errors with new sample, entity poulated with post, so display this data. } // else valid save, so go back to gridview: default mode 0 } else { if (array_key_exists('sample_id', $_GET)) { $mode = 2; $loadID = $_GET['sample_id']; } else { if (array_key_exists('newSample', $_GET)) { $mode = 1; data_entry_helper::$entity_to_load = array(); } } // else default to mode 0 } /////////////////////////////////////////////////////////////////// // default mode 0 : display survey selector /////////////////////////////////////////////////////////////////// if ($mode == 0) { // Create the Sample list datagrid for this user. drupal_add_js(drupal_get_path('module', 'iform') . '/media/js/hasharray.js', 'module'); drupal_add_js(drupal_get_path('module', 'iform') . '/media/js/jquery.datagrid.js', 'module'); drupal_add_js("jQuery(document).ready(function(){\n \$('div#smp_grid').indiciaDataGrid('rpt:mnhnl_collab_list_samples', {\n indiciaSvc: '" . $svcUrl . "',\n dataColumns: ['location_name', 'entered_sref', 'date', 'num_occurrences', 'completed'],\n reportColumnTitles: {location_name : '" . lang::get('LANG_Location') . "', entered_sref : '" . lang::get('LANG_Spatial_ref') . "', date : '" . lang::get('LANG_Date') . "', num_occurrences : '" . lang::get('LANG_Num_Occurrences') . "', completed : '" . lang::get('LANG_Completed') . "'},\n actionColumns: {" . lang::get('LANG_Edit') . " : \"" . url('node/' . $node->nid, array('query' => 'sample_id=�id�')) . "\"},\n auth : { nonce : '" . $readAuth['nonce'] . "', auth_token : '" . $readAuth['auth_token'] . "'},\n parameters : {\n \t\t\tsurvey_id : '" . $args['survey_id'] . "',\n \t\t\tuserID_attr_id : '" . $args['uid_attr_id'] . "',\n \t\t\tuserID : '" . $user->uid . "'\n \t\t\t\t},\n itemsPerPage : 12 \n });\n});\n\n", 'inline'); $r .= '<div id="sampleList" class="mnhnl-btw-datapanel"><div id="smp_grid"></div>'; $r .= '<form><input type="button" value="' . lang::get('LANG_Add_Sample') . '" onclick="window.location.href=\'' . url('node/' . $node->nid, array('query' => 'newSample')) . '\'"></form></div>'; $r .= "</div>\n"; return $r; } /////////////////////////////////////////////////////////////////// data_entry_helper::$javascript .= "\n// Create vector layers: one to display the location onto, and another for the occurrence list\n// the default edit layer is used for the occurrences themselves\nlocStyleMap = new OpenLayers.StyleMap({\n \"default\": new OpenLayers.Style({\n fillColor: \"Green\",\n strokeColor: \"Black\",\n fillOpacity: 0.3,\n strokeWidth: 1\n })\n });\nlocationLayer = new OpenLayers.Layer.Vector(\"" . lang::get("LANG_Location_Layer") . "\",\n {styleMap: locStyleMap});\n"; if ($loadID) { // Can't cache these as data may have just changed data_entry_helper::$entity_to_load['occurrence:record_status'] = 'I'; $url = $svcUrl . '/data/sample/' . $loadID; $url .= "?mode=json&view=detail&auth_token=" . $readAuth['auth_token'] . "&nonce=" . $readAuth["nonce"]; $session = curl_init($url); curl_setopt($session, CURLOPT_RETURNTRANSFER, true); $entity = json_decode(curl_exec($session), true); // Attributes should be loaded by get_attributes. data_entry_helper::$entity_to_load = array(); foreach ($entity[0] as $key => $value) { data_entry_helper::$entity_to_load['sample:' . $key] = $value; } $url = $svcUrl . '/data/occurrence'; $url .= "?mode=json&view=detail&auth_token=" . $readAuth['auth_token'] . "&nonce=" . $readAuth["nonce"] . "&sample_id=" . $loadID . "&deleted=FALSE"; $session = curl_init($url); curl_setopt($session, CURLOPT_RETURNTRANSFER, true); $entities = json_decode(curl_exec($session), true); foreach ($entities as $entity) { data_entry_helper::$entity_to_load['occurrence:record_status'] = $entity['record_status']; data_entry_helper::$entity_to_load['sc:' . $entity['taxa_taxon_list_id'] . ':' . $entity['id'] . ':present'] = true; } data_entry_helper::$entity_to_load['sample:geom'] = ''; // value received from db is not WKT, which is assumed by all the code. data_entry_helper::$entity_to_load['sample:date'] = data_entry_helper::$entity_to_load['sample:date_start']; // bit of a bodge to get around vague dates. } $defAttrOptions = array('extraParams' => $readAuth); // $r .= "<h1>MODE = ".$mode."</h1>"; // $r .= "<h2>readOnly = ".$readOnly."</h2>"; $r = "<form method=\"post\" id=\"entry_form\">\n"; // Get authorisation tokens to update and read from the Warehouse. $r .= $writeAuth; $r .= "<input type=\"hidden\" id=\"website_id\" name=\"website_id\" value=\"" . $args['website_id'] . "\" />\n"; $r .= "<input type=\"hidden\" id=\"sample:survey_id\" name=\"sample:survey_id\" value=\"" . $args['survey_id'] . "\" />\n"; if (array_key_exists('sample:id', data_entry_helper::$entity_to_load)) { $r .= "<input type=\"hidden\" id=\"sample:id\" name=\"sample:id\" value=\"" . data_entry_helper::$entity_to_load['sample:id'] . "\" />\n"; } // request automatic JS validation data_entry_helper::enable_validation('entry_form'); $attributes = data_entry_helper::getAttributes(array('id' => data_entry_helper::$entity_to_load['sample:id'], 'valuetable' => 'sample_attribute_value', 'attrtable' => 'sample_attribute', 'key' => 'sample_id', 'fieldprefix' => 'smpAttr', 'extraParams' => $readAuth, 'survey_id' => $args['survey_id'])); if ($logged_in) { // If logged in, output some hidden data about the user $uid = $user->uid; $email = $user->mail; $username = $user->name; $uid_attr_id = $args['uid_attr_id']; $email_attr_id = $args['email_attr_id']; $username_attr_id = $args['username_attr_id']; // This assumes that we have the following attributes : no built in error checking. $r .= "<input type=\"hidden\" name=\"" . $attributes[$uid_attr_id]['fieldname'] . "\" value=\"{$uid}\" />\n"; $r .= "<input type=\"hidden\" name=\"" . $attributes[$email_attr_id]['fieldname'] . "\" value=\"{$email}\" />\n"; $r .= "<input type=\"hidden\" name=\"" . $attributes[$username_attr_id]['fieldname'] . "\" value=\"{$username}\" />\n"; } $r .= "<div id=\"controls\">\n"; if ($args['interface'] != 'one_page') { $r .= "<ul>\n"; if (!$logged_in) { $r .= ' <li><a href="#about_you"><span>' . lang::get('LANG_About_You_Tab') . "</span></a></li>\n"; } $r .= ' <li><a href="#species"><span>' . lang::get('LANG_Species_Tab') . "</span></a></li>\n"; $r .= ' <li><a href="#place"><span>' . lang::get('LANG_Place_Tab') . "</span></a></li>\n"; $r .= ' <li><a href="#other"><span>' . lang::get('LANG_Other_Information_Tab') . "</span></a></li>\n"; $r .= "</ul>\n"; data_entry_helper::enable_tabs(array('divId' => 'controls', 'style' => $args['interface'])); } //////////////////////////////////////////////////////////////////////////////////////////////////////////// if (!$logged_in) { $r .= "<div id=\"about_you\">\n"; $r .= '<p class="page-notice ui-state-highlight ui-corner-all">' . lang::get('LANG_About_You_Tab_Instructions') . "</p>"; $defAttrOptions['class'] = 'control-width-4'; $r .= data_entry_helper::outputAttribute($attributes[$args['first_name_attr_id']], $defAttrOptions); $r .= data_entry_helper::outputAttribute($attributes[$args['surname_attr_id']], $defAttrOptions); $r .= data_entry_helper::outputAttribute($attributes[$args['email_attr_id']], $defAttrOptions); $r .= data_entry_helper::outputAttribute($attributes[$args['phone_attr_id']], $defAttrOptions); if ($args['interface'] == 'wizard') { $r .= data_entry_helper::wizard_buttons(array('divId' => 'controls', 'page' => 'first')); } unset($defAttrOptions['class']); $r .= "</div>\n"; } //////////////////////////////////////////////////////////////////////////////////////////////////////////// global $indicia_templates; $indicia_templates['taxon_label'] = '<div class="biota"><span class="nobreak sci binomial"><em>{taxon}</em></span> {authority}</div>'; $r .= "<div id=\"species\">\n"; $r .= '<p class="page-notice ui-state-highlight ui-corner-all">' . lang::get('LANG_Species_Tab_Instructions') . "</p>"; $extraParams = $readAuth + array('taxon_list_id' => $args['list_id']); $species_list_args = array('label' => lang::get('occurrence:taxa_taxon_list_id'), 'fieldname' => 'occurrence:taxa_taxon_list_id', 'table' => 'taxa_taxon_list', 'captionField' => 'taxon', 'valueField' => 'id', 'columns' => 1, 'view' => 'detail', 'parentField' => 'parent_id', 'occAttrs' => explode(',', $args['checklist_attributes']), 'extraParams' => $extraParams, 'survey_id' => $args['survey_id']); $r .= data_entry_helper::species_checklist($species_list_args); $r .= "<label for=\"sample:comment\">" . lang::get('LANG_Sample_Comment_Label') . "</label><input type=\"text\" id=\"sample:comment\" name=\"sample:comment\" value=\"" . data_entry_helper::$entity_to_load['sample:comment'] . "\" />\n"; if ($args['interface'] == 'wizard') { $r .= data_entry_helper::wizard_buttons(array('divId' => 'controls', 'page' => $user->id == 0 ? 'first' : 'middle')); } $r .= "</div>\n"; //////////////////////////////////////////////////////////////////////////////////////////////////////////// $r .= "<div id=\"place\">\n"; $r .= '<p class="page-notice ui-state-highlight ui-corner-all">' . lang::get('LANG_Place_Tab_Instructions') . "</p>"; // Build the array of spatial reference systems into a format Indicia can use. $systems = array(); $list = explode(',', str_replace(' ', '', $args['spatial_systems'])); foreach ($list as $system) { $systems[$system] = lang::get($system); } $r .= data_entry_helper::sref_and_system(array('label' => lang::get('LANG_SRef_Label'), 'systems' => $systems)); $location_list_args = array('label' => lang::get('LANG_Location_Label'), 'view' => 'detail', 'extraParams' => array_merge(array('view' => 'detail', 'orderby' => 'name'), $extraParams)); $r .= call_user_func(array('data_entry_helper', $args['location_ctrl']), $location_list_args); $r .= data_entry_helper::georeference_lookup(array('label' => lang::get('LANG_Georef_Label'), 'georefPreferredArea' => $args['georefPreferredArea'], 'georefCountry' => $args['georefCountry'], 'georefLang' => $args['language'])); $options = iform_map_get_map_options($args, $readAuth); $options['layers'][] = 'locationLayer'; $olOptions = iform_map_get_ol_options($args); $r .= data_entry_helper::map_panel($options, $olOptions); if ($args['interface'] == 'wizard') { $r .= data_entry_helper::wizard_buttons(array('divId' => 'controls')); } $r .= "</div>\n"; //////////////////////////////////////////////////////////////////////////////////////////////////////////// $r .= "<div id=\"other\">\n"; $r .= '<p class="page-notice ui-state-highlight ui-corner-all">' . lang::get('LANG_Other_Information_Tab_Instructions') . "</p>"; $r .= data_entry_helper::date_picker(array('label' => lang::get('LANG_Date'), 'fieldname' => 'sample:date')); $r .= data_entry_helper::outputAttribute($attributes[$args['biotope_attr_id']], $defAttrOptions); $r .= data_entry_helper::outputAttribute($attributes[$args['voucher_attr_id']], $defAttrOptions); $values = array('I', 'C'); // not initially doing V=Verified $r .= '<label for="occurrence:record_status">' . lang::get('LANG_Record_Status_Label') . '</label><select id="occurrence:record_status" name="occurrence:record_status">'; foreach ($values as $value) { $r .= '<option value="' . $value . '"'; if (isset(data_entry_helper::$entity_to_load['occurrence:record_status'])) { if (data_entry_helper::$entity_to_load['occurrence:record_status'] == $value) { $r .= ' selected="selected"'; } } $r .= '>' . lang::get('LANG_Record_Status_' . $value) . '</option>'; } $r .= '</select>'; // TODO image upload - not sure how to do this as images are attached to occurrences, and occurrences // are embedded in the species list. // $r .= "<label for='occurrence:image'>".lang::get('LANG_Image_Label')."</label>\n". // data_entry_helper::image_upload('occurrence:image'); $r .= '<br/><br/>'; if ($args['interface'] == 'wizard') { $r .= data_entry_helper::wizard_buttons(array('divId' => 'controls', 'page' => 'last')); } else { $r .= "<input type=\"submit\" class=\"ui-state-default ui-corner-all\" value=\"" . lang::get('LANG_Save') . "\" />\n"; } $r .= "</div>\n"; $r .= "</div>\n"; if (!empty(data_entry_helper::$validation_errors)) { $r .= data_entry_helper::dump_remaining_errors(); } $r .= "</form>"; // may need to keep following code for location change functionality data_entry_helper::$onload_javascript .= "\n \nlocationChange = function(obj){\n\tlocationLayer.destroyFeatures();\n\tif(obj.value != ''){\n\t\tjQuery.getJSON(\"" . $svcUrl . "\" + \"/data/location/\"+obj.value +\n\t\t\t\"?mode=json&view=detail&auth_token=" . $readAuth['auth_token'] . "&nonce=" . $readAuth["nonce"] . "\" +\n\t\t\t\"&callback=?\", function(data) {\n if (data.length>0) {\n \tvar parser = new OpenLayers.Format.WKT();\n \tfor (var i=0;i<data.length;i++)\n\t\t\t\t{\n\t \t\t\tif(data[i].centroid_geom){\n\t\t\t\t\t\tfeature = parser.read(data[i].centroid_geom);\n\t\t\t\t\t\tcentre = feature.geometry.getCentroid();\n\t\t\t\t\t\tcentrefeature = new OpenLayers.Feature.Vector(centre, {}, {label: data[i].name});\n\t\t\t\t\t\tlocationLayer.addFeatures([feature, centrefeature]); \n\t\t\t\t\t}\n\t\t\t\t\tif(data[i].boundary_geom){\n\t\t\t\t\t\tfeature = parser.read(data[i].boundary_geom);\n\t\t\t\t\t\tfeature.style = {strokeColor: \"Blue\",\n \t \tstrokeWidth: 2,\n \t\t\t\t\t\t\tlabel: (data[i].centroid_geom ? \"\" : data[i].name)};\n\t\t\t\t\t\tlocationLayer.addFeatures([feature]);\n \t\t\t\t\t}\n \t\t\t\tlocationLayer.map.zoomToExtent(locationLayer.getDataExtent());\n \t\t\t\t}\n\t\t\t}\n\t\t});\n }\n};\njQuery('#imp-location').unbind('change');\njQuery('#imp-location').change(function(){\n\tlocationChange(this);\n});\n// upload location & sref initial values into map.\njQuery('#imp-location').change();\njQuery('#imp-sref').change();\n\n"; return $r; }
/** * Returns the species checklist input control. * @param array $auth Read authorisation tokens * @param array $args Form configuration * @param array $extraParams Extra parameters array, pre-configured with filters for taxa and name types. * @param array $options additional options for the control, e.g. those configured in the form structure. * @return HTML for the species_checklist control. */ protected static function get_control_species_checklist($auth, $args, $extraParams, $options) { global $user; // Build the configuration options if (isset($options['view'])) { $extraParams['view'] = $options['view']; } // make sure that if extraParams is specified as a config option, it does not replace the essential stuff if (isset($options['extraParams'])) { $options['extraParams'] = array_merge($extraParams, $options['extraParams']); } $species_ctrl_opts = array_merge(array('occAttrOptions' => array(), 'listId' => '', 'label' => lang::get('occurrence:taxa_taxon_list_id'), 'columns' => 1, 'extraParams' => $extraParams, 'survey_id' => $args['survey_id'], 'occurrenceComment' => $args['occurrence_comment'], 'occurrenceSensitivity' => isset($args['occurrence_sensitivity']) ? $args['occurrence_sensitivity'] : false, 'occurrenceImages' => $args['occurrence_images'], 'PHPtaxonLabel' => true, 'language' => iform_lang_iso_639_2(hostsite_get_user_field('language')), 'cacheLookup' => $args['cache_lookup'], 'speciesNameFilterMode' => self::getSpeciesNameFilterMode($args), 'userControlsTaxonFilter' => false, 'subSpeciesColumn' => false, 'copyDataFromPreviousRow' => false, 'editTaxaNames' => !empty($args['edit_taxa_names']) && $args['edit_taxa_names']), $options); if ($groups = hostsite_get_user_field('taxon_groups')) { $species_ctrl_opts['usersPreferredGroups'] = unserialize($groups); } if ($args['map_taxon_list_id']) { $species_ctrl_opts['lookupListId'] = $args['map_taxon_list_id']; } //We only do the work to setup the filter if the user has specified a filter in the box if (!empty($args['map_taxon_filter_field']) && !empty($args['map_taxon_filter'])) { $species_ctrl_opts['taxonFilterField'] = $args['map_taxon_filter_field']; $filterLines = helper_base::explode_lines($args['map_taxon_filter']); $species_ctrl_opts['taxonFilter'] = $filterLines; } if (isset($args['col_widths']) && $args['col_widths']) { $species_ctrl_opts['colWidths'] = explode(',', $args['col_widths']); } self::build_grid_taxon_label_function($args, $options); // Start by outputting a hidden value that tells us we are using a grid when the data is posted, // then output the grid control return '<input type="hidden" value="true" name="gridmode" />' . data_entry_helper::species_checklist($species_ctrl_opts); }
$readAuth = $auth['read']; ?> <input type='hidden' name='website_id' value='<?php echo $config['website_id']; ?> ' /> <input type='hidden' name='survey_id' value='<?php echo $config['survey_id']; ?> ' /> <input type='hidden' name='occurrence:record_status' value='C' /> <?php echo data_entry_helper::date_picker(array('label' => 'Date', 'fieldname' => 'sample:date')); echo data_entry_helper::sref_and_system(array('label' => 'Grid Ref', 'fieldname' => 'sample:entered_sref')); ?> <div class="smaller"> <?php echo data_entry_helper::species_checklist(array('listId' => $config['species_checklist_taxon_list'], 'lookupListId' => $config['species_checklist_alt_list'], 'extraParams' => $readAuth, 'survey_id' => $config['survey_id'])); ?> </div> <br /> <input type='submit' value='Save' /> </form> </div> </body> <?php echo data_entry_helper::dump_javascript(); ?> </html>
<body> <div id="wrap"> <h1>Species Checklist</h1> <p>Now please enter details of the list of species you observed in this sample.</p> <form action="save.php" method="post"> <fieldset> <legend>Species List</legend> <?php echo data_entry_helper::get_auth($config['website_id'], $config['password']); ?> <input type="hidden" class="auto" name="website_id" id="website_id" value="<?php echo $config['website_id']; ?> " /> <input type="hidden" class="auto" name="survey_id" id="website_id" value="<?php echo $config['survey_id']; ?> " /> <?php echo data_entry_helper::species_checklist($config['species_checklist_taxon_list'], $config['species_checklist_occ_attributes'], $readAuth, null, $config['species_checklist_alt_list']); ?> <br /> <input type="submit" value="Save" class="auto" /> </fieldset> </form> </div> <?php echo data_entry_helper::dump_javascript(); ?> </body> </html>
protected static function tab_species_npms_paths($args, $auth, $offset, $limit, $tabNum, $numSpeciesTabs) { $r = ''; //Get user configured instruction if it is available. if (!empty($args['species_tab_instruction'])) { $r .= '<p>' . $args['species_tab_instruction'] . '</p>'; } else { $r .= '<p>Please select the percentage cover of each species that is present in each plot from the list below.</p>'; } global $indicia_templates; $indicia_templates['taxon_label'] = '<div class="biota nobreak"><span class="vernacular">{common}</span>' . '<br/><span class="sci binomial"><em>{taxon}</em></span> {authority}</div>'; $r .= data_entry_helper::species_checklist(array('id' => "species-{$offset}", 'label' => 'Species', 'listId' => $args['list_id'], 'columns' => 2, 'rowInclusionCheck' => 'hasData', 'class' => 'checklist', 'survey_id' => $args['survey_id'], 'extraParams' => $auth['read'] + array('taxon_list_id' => $args['list_id'], 'limit' => $limit, 'offset' => $offset, 'orderby' => 'common', 'sortdir' => 'ASC', 'view' => 'detail'), 'occAttrClasses' => array('coverage'), 'speciesNameFilterMode' => 'preferred', 'language' => 'eng', 'useLoadedExistingRecords' => $offset > 0)); //If the last tab, then use a submit button, otherwise we have Previous/Next Step if ($tabNum == $numSpeciesTabs) { $r .= '<p class="highlight">' . lang::get('Please review all tabs of the form before submitting the survey.') . '</p>'; $r .= data_entry_helper::wizard_buttons(array('divId' => 'tabs', 'page' => 'last', 'captionSave')); } else { $r .= data_entry_helper::wizard_buttons(array('divId' => 'tabs', 'page' => 'middle')); } return $r; }
protected static function tab_other_species($args, $auth) { $r = ''; $indicia_templates['taxon_label'] = '<div class="biota nobreak"><span class="vernacular">{common}</span>' . '<br/><span class="sci binomial"><em>{taxon}</em></span> {authority}</div>'; $extraParams = $auth['read']; $species_ctrl_opts = array('id' => "species-other", 'label' => 'Species', 'lookupListId' => $args['other_list_id'], 'cacheLookup' => isset($args['cache_lookup']) && $args['cache_lookup'], 'PHPtaxonLabel' => true, 'class' => 'checklist', 'survey_id' => $args['survey_id'], 'extraParams' => $extraParams, 'language' => 'eng', 'occAttrClasses' => array('coverage'), 'reloadExtraParams' => array('taxon_list_id' => $args['other_list_id']), 'speciesNameFilterMode' => 'excludeSynonyms', 'helpText' => 'Please provide details of any additional species you would like to record that you observed during your wildflower count. ' . 'Type the species name into the box on the left of the grid then select the correct name from the drop-down list of suggestions. ' . 'Make sure you input the information about whether the species was recorded on the path or linear/square transect.'); if (!empty($args['taxon_filter_field']) && !empty($args['taxon_filter'])) { $filterLines = helper_base::explode_lines($args['taxon_filter']); $species_ctrl_opts['taxonFilterField'] = $args['taxon_filter_field']; $species_ctrl_opts['taxonFilter'] = $filterLines; } self::build_grid_taxon_label_function($args); self::build_grid_autocomplete_function($args); $r .= data_entry_helper::species_checklist($species_ctrl_opts); $r .= '<p class="highlight">' . lang::get('Please review all tabs of the form before submitting the survey.') . '</p>'; $r .= data_entry_helper::wizard_buttons(array('divId' => 'tabs', 'page' => 'last', 'captionSave' => 'Submit')); return $r; }