/** * Declare the list of permissions we've got set up to pass to the CMS' permissions code. * @param int $nid Node ID, not used * @param array $args Form parameters array, used to extract the defined permissions. * @return array List of distinct permissions. */ public static function get_perms($nid, $args) { $perms = array(); if (!empty($args['structure'])) { // scan for @permission=... in the form structure $structure = data_entry_helper::explode_lines($args['structure']); $permissions = preg_grep('/^@((smp|occ|loc)Attr:\\d+|)?permission=/', $structure); foreach ($permissions as $permission) { $parts = explode('=', $permission, 2); $perms[] = array_pop($parts); } } return $perms; }
/** * Declare the list of permissions we've got set up to pass to the CMS' permissions code. * @param int $nid Node ID, not used * @param array $args Form parameters array, used to extract the defined permissions. * @return array List of distinct permissions. */ public static function get_perms($nid, $args) { $perms = array('biotope codes'); if (!empty($args['edit_permission'])) { $perms[] = $args['edit_permission']; } if (!empty($args['ro_permission'])) { $perms[] = $args['ro_permission']; } // scan for @permission=... in the form structure // @todo Refactor this into dynamic.php so that all types of dynamic form benefit $structure = data_entry_helper::explode_lines($args['structure']); $permissions = preg_grep('/^@((smp|occ|loc)Attr:\\d+|)?permission=/', $structure); foreach ($permissions as $permission) { $parts = explode('=', $permission, 2); $perms[] = array_pop($parts); } return $perms; }
public static function simple_user_square_upload($auth, $args, $tabalias, $options, $path) { if (empty($options['minimumLocationDate'])) { drupal_set_message('Please enter a @minimumLocationDate option to specify minimum square created_on date to look for'); return false; } $minSquareDate = new DateTime($options['minimumLocationDate']); $r = ''; //Need to call this so we can use indiciaData.read data_entry_helper::$js_read_tokens = $auth['read']; if (!function_exists('iform_ajaxproxy_url')) { return 'An AJAX Proxy module must be enabled for user sites administration to work.'; } $r .= '<div><form method="post"><textarea id="upload-data" name="upload-data" cols="20" rows="50"></textarea>'; $r .= '<input type="submit" id="upload-squares" value="Upload"></form></div><br>'; $postUrl = iform_ajaxproxy_url(null, 'person_attribute_value'); //If there is data to upload then get the lines of data if (!empty($_POST['upload-data'])) { $uploadLines = data_entry_helper::explode_lines($_POST['upload-data']); } $convertedUploadData = array(); $convertedUploadIdx = 0; if (!empty($uploadLines)) { //Get existing data to detect duplicates $existingPersonAttrVals = data_entry_helper::get_population_data(array('table' => 'person_attribute_value', 'extraParams' => $auth['read'] + array(), 'nocache' => true)); //Cycle through all the lines in the upload data foreach ($uploadLines as $lineIdx => $uploadLine) { //Split each line up into cells, cell 2 (index 1) onwards contain all the squares we are going to attach to people. $lineParts = explode(",", $uploadLine); $email = $lineParts[0]; //Get the id of the person to attach squares to $personData = data_entry_helper::get_population_data(array('table' => 'person', 'extraParams' => $auth['read'] + array('email_address' => $email, 'view' => 'detail'), 'nocache' => true)); if (empty($personData[0]['id'])) { $personData = data_entry_helper::get_report_data(array('dataSource' => 'reports_for_prebuilt_forms/Splash/get_person_for_email_address', 'readAuth' => $auth['read'], 'extraParams' => array('email_address' => $email))); } //Cycle through all the squares we want to attach to a person. for ($idx2 = 1; $idx2 < count($lineParts); $idx2++) { if (!empty($lineParts[$idx2])) { //Get the name of the square to attach and then its id. $location = $lineParts[$idx2]; $locationData = data_entry_helper::get_population_data(array('table' => 'location', 'extraParams' => $auth['read'] + array('name' => $location, 'view' => 'detail'), 'nocache' => true)); //Save the data ready to import. if (!empty($personData[0]['id']) && !empty($locationData[0]['id'])) { $locationCreatedOnDate = new DateTime($locationData[0]['created_on']); //Only attach squares if they are newer than the specified minimum created_on option if ($locationCreatedOnDate >= $minSquareDate) { $convertedUploadData[$convertedUploadIdx][0] = $personData[0]['id']; $convertedUploadData[$convertedUploadIdx][1] = $locationData[0]['id']; $convertedUploadIdx++; } } else { drupal_set_message('An upload issue has been detected.'); if (empty($personData[0]['id'])) { drupal_set_message('Could not upload to person. The following email address was not found ' . $email); } if (empty($locationData[0]['id'])) { drupal_set_message('Could not upload square. The following location was not found ' . $location); } } } } } data_entry_helper::$javascript .= "\n var i;\n var i2;\n var uploadLines = " . json_encode($convertedUploadData) . ";\n var existingPersonAttrVals = " . json_encode($existingPersonAttrVals) . ";\n var duplicateDetected = false;\n for (i=0; i<uploadLines.length; i++) {\n for (i2=0; i2<existingPersonAttrVals .length; i2++) {\n if (uploadLines[i][1]==existingPersonAttrVals[i2]['value']&&uploadLines[i][0]==existingPersonAttrVals[i2]['person_id']) {\n duplicateDetected=true;\n }\n }\n if (duplicateDetected==false) {\n \$.post('{$postUrl}', \n {\"website_id\":" . $args['website_id'] . ",\"person_attribute_id\":" . $options['mySitesPsnAttrId'] . ",\"person_id\":uploadLines[i][0],\"int_value\":uploadLines[i][1]},\n function (data) {\n if (typeof data.error !== 'undefined') {\n alert(data.error);\n } \n },\n 'json'\n );\n var emptyObj={};\n emptyObj.value=uploadLines[i][1];\n emptyObj.person_id=uploadLines[i][0];\n\n existingPersonAttrVals.push(emptyObj);\n } else {\n alert('A duplicate entry upload has been attempted for person id ' + uploadLines[i][0] + ' location id ' + uploadLines[i][1]); \n }\n duplicateDetected=false;\n }\n alert('Import Complete');"; } return $r; }
/** * 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) { if (empty($args['group_id'])) { drupal_set_message('Please specify a group_id in the page configuration.'); } if (empty($args['instructions_configuration'])) { drupal_set_message('Please provide a page configuration in the User Interface options.'); } //Only perform if the user has specified an instruction to appear under each page like. if (!empty($args['instructions_configuration'])) { $configuration = data_entry_helper::explode_lines($args['instructions_configuration']); $key = ''; $description = ''; //Keep track of the ordering of the titles $titleNumber = 0; //For each configured line we need to find all the descriptions and store them against the page titles in an array foreach ($configuration as $configLineNum => $configurationLine) { //If line is a link title (specified inside square brackets) if (preg_match('/^\\[.+\\]$/', $configurationLine)) { //If this isn't the first title, then we need to store the description for the previous title into an //array. The key is a number representing the order of the titles in the configuration, the sub array key is the name of the page link. if (!empty($key)) { $titleDescriptions[$titleNumber] = array($key => $description); $description = ''; } //Get the next array key we will use from the specified page link title. Chop the square brackets off the ends. $key = substr($configurationLine, 1, -1); $titleNumber++; } else { //If the line does not use square brackets then we know it is part of the description/instruction. We do an //append as the instruction might span several lines. $description .= $configurationLine; } } //For the last description we still need to save it to the array. $titleDescriptions[$titleNumber] = array($key => $description); $description = ''; } $r = ''; global $user; $auth = data_entry_helper::get_read_write_auth($args['website_id'], $args['password']); //Get all the links to display $reportOptions = array('dataSource' => 'library/groups/groups_list', 'readAuth' => $auth['read'], 'mode' => 'report', 'extraParams' => array('currentUser' => hostsite_get_user_field('indicia_user_id'), 'id' => $args['group_id'], 'pending_path' => '{rootFolder}?q=groups/pending&group_id=', 'userFilterMode' => 'member')); // automatic handling for Drupal clean urls. $pathParam = function_exists('variable_get') && variable_get('clean_url', 0) == '0' ? 'q' : ''; $rootFolder = helper_base::getRootFolder() . (empty($pathParam) ? '' : "?{$pathParam}="); $groupsData = data_entry_helper::get_report_data($reportOptions); if (empty($groupsData)) { if (!empty($args['no_group_found_message'])) { $r = '<div>' . $args['no_group_found_message'] . '</div>'; } else { $r = '<div>' . 'Sorry, you do not appear to be a member of this group so there are no links to display.' . '</div>'; } return $r; } foreach ($groupsData as $groupDataItem) { $pageLinks = $groupDataItem['pages']; $groupTitle = $groupDataItem['title']; } //All the page links come out of the database in one cluster. Explode these so we have each link separately $explodedPageLinks = explode('</a>', $pageLinks); // reinsert the closing </a> used in the explode above foreach ($explodedPageLinks as &$pageLink) { $pageLink .= '</a>'; } $pageLinkHtml = ''; //Go through all the page links to display foreach ($titleDescriptions as $titleDescArr) { foreach ($explodedPageLinks as &$pageLink) { //Each page link is a html link, we just want the plain name $plainPageLink = trim(strip_tags($pageLink)); //If the user has specified an instruction/description for the page link, then display the instruction in the lines following the link //using italics. if (array_key_exists($plainPageLink, $titleDescArr)) { if (!empty($titleDescArr[$plainPageLink])) { $pageLinkHtml .= "<h3>{$pageLink}</a></h3><p>{$titleDescArr[$plainPageLink]}</p>\n"; } else { $pageLinkHtml .= "<h3>{$pageLink}</a></h3>"; } } } } $r = "<div><h2>{$groupTitle} Links</h2>"; $r .= str_replace(array('{rootFolder}', '{sep}'), array($rootFolder, strpos($rootFolder, '?') === FALSE ? '?' : '&'), $pageLinkHtml); $r .= '</div><br>'; $r .= parent::get_form($args, $node, $response = null); return $r; }