function formulize_calcDerivedColumns($entry, $metadata, $relationship_id, $form_id) { global $xoopsDB; static $parsedFormulas = array(); include_once XOOPS_ROOT_PATH . "/modules/formulize/class/data.php"; foreach ($entry as $formHandle => $record) { $data_handler = new formulizeDataHandler(formulize_getFormIdFromName($formHandle)); $formHandle = htmlspecialchars_decode($formHandle, ENT_QUOTES); if (isset($metadata[$formHandle])) { // if there are derived value formulas for this form if (!isset($parsedFormulas[$formHandle])) { formulize_includeDerivedValueFormulas($metadata[$formHandle], $formHandle, $relationship_id, $form_id); $parsedFormulas[$formHandle] = true; } foreach ($record as $primary_entry_id => $elements) { $dataToWrite = array(); foreach ($metadata[$formHandle] as $formulaNumber => $thisMetaData) { // if there's nothing already in the DB, then derive it, unless we're being asked specifically to update the derived values, which happens during a save operation. In that case, always do a derivation regardless of what's in the DB. if (isset($GLOBALS['formulize_forceDerivedValueUpdate']) and !isset($GLOBALS['formulize_doingExport'])) { $functionName = "derivedValueFormula_" . str_replace(array(" ", "-", "/", "'", "`", "\\", ".", "’", ",", ")", "(", "[", "]"), "_", $formHandle) . "_" . $formulaNumber; // want to turn off the derived value update flag for the actual processing of a value, since the function might have a getData call in it!! $resetDerivedValueFlag = false; if (isset($GLOBALS['formulize_forceDerivedValueUpdate'])) { unset($GLOBALS['formulize_forceDerivedValueUpdate']); $resetDerivedValueFlag = true; } $derivedValue = $functionName($entry, $form_id, $primary_entry_id, $relationship_id); if ($resetDerivedValueFlag) { $GLOBALS['formulize_forceDerivedValueUpdate'] = true; } // if the new value is the same as the previous one, then skip updating and saving if ($derivedValue != $entry[$formHandle][$primary_entry_id][$thisMetaData['handle']][0]) { $entry[$formHandle][$primary_entry_id][$thisMetaData['handle']][0] = $derivedValue; if ($xoopsDB) { // save value for writing to database if XOOPS is active $elementID = formulize_getIdFromElementHandle($thisMetaData['handle']); $dataToWrite[$elementID] = $derivedValue; } } } } if ($xoopsDB and count($dataToWrite) > 0) { // false for no proxy user, true to force the update even on get requests, false is do not update the metadata (modification user) $data_handler->writeEntry($primary_entry_id, $dataToWrite, false, true, false); } } } } return $entry; }
function calcValuePlusText($value, $handle, $col, $calc, $groupingValue) { if ($handle == "creation_date" or $handle == "mod_date" or $handle == "creation_datetime" or $handle == "mod_datetime" or $handle == "creator_email") { return $value; } if ($handle == "uid" or $handle == "proxyid" or $handle == "creation_uid" or $handle == "mod_uid" or $handle == "entry_id") { $member_handler = xoops_gethandler('member'); $userObject = $member_handler->getUser(display($entry, $handle)); $nameToDisplay = $userObject->getVar('name') ? $userObject->getVar('name') : $userObject->getVar('uname'); return $nameToDisplay; } if ($handle == "email" and strstr($value, "@")) { // creator e-mail metadata field will be treated as having handle "email" in the calculation SQL, so we need this special condition return $value; } $id = formulize_getIdFromElementHandle($handle); $element_handler =& xoops_getmodulehandler('elements', 'formulize'); $element = $element_handler->get($id); // check for fullnames/usernames and handle those $ele_type = $element->getVar('ele_type'); if ($ele_type == "select") { $ele_value = $element->getVar('ele_value'); if (key($ele_value[2]) === "{USERNAMES}" or key($ele_value[2]) === "{FULLNAMES}") { if (!isset($GLOBALS['formulize_fullNameUserNameCalculationReplacementList'][$col][$calc][$groupingValue])) { $GLOBALS['formulize_fullNameUserNameCalculationReplacementList'][$col][$calc][$groupingValue]['nametype'] = key($ele_value[2]) === "{USERNAMES}" ? "uname" : "name"; } $GLOBALS['formulize_fullNameUserNameCalculationReplacementList'][$col][$calc][$groupingValue]['values'][] = $value; // flag the value for replacement later return $value; } } $uitexts = $element->getVar('ele_uitext'); $value = isset($uitexts[$value]) ? $uitexts[$value] : $value; if (substr($value, 0, 6) == "{OTHER") { $value = _formulize_OPT_OTHER; } if ($element->getVar('ele_type') == 'yn') { if ($value == "1") { $value = _formulize_TEMP_QYES; } elseif ($value == "2") { $value = _formulize_TEMP_QNO; } else { $value = ""; } } return $value; }
function formulize_setupPreviousEntryUI($screen, $element_id, $type, $owner, $de = false, $entryId = "", $ele_handle, $fid) { // 1. need to get and cache the values of the entry for this screen // 2. need to put the values into a dropdown list with an onchange event that populates the actual form element // this should be cached in some other way, since every instance of the renderer will need to cache this. If it were a GLOBAL or this whole thing were in some other function, that would work. static $cachedEntries = array(); if (!isset($cachedEntries[$screen->getVar('sid')])) { // identify the entry belonging to this user's group(s) in the other form. Currently only group correspondence is supported. global $xoopsUser; $groups = $xoopsUser ? $xoopsUser->getGroups() : array(0 => XOOPS_GROUP_ANONYMOUS); $member_handler =& xoops_gethandler('member'); $gperm_handler =& xoops_gethandler('groupperm'); $mid = getFormulizeModId(); $owner_groups =& $member_handler->getGroupsByUser($owner, FALSE); // in this particular case, it's okay to make the owner_groups based on the users's memberships, since we want to present the single entry that belongs to whichever groups the user is a member of...I think. :-) $singleData = getSingle($screen->getVar('paraentryform'), $owner, $owner_groups, $member_handler, $gperm_handler, $mid); if ($singleData['flag'] == "group" and $singleData['entry'] > 0) { // only proceed if there is a one-entry-per-group situation in the target form formulize_benchmark("Ready to do previous entry query."); $cachedEntries[$screen->getVar('sid')] = getData("", $screen->getVar('paraentryform'), $singleData['entry']); formulize_benchmark("Done query."); } else { return ""; } } $entries = $cachedEntries[$screen->getVar('sid')]; // big assumption below is corresponding captions. In future there will be more ad hoc ways of describing which elements align to which other ones. // 1. figure out the corresponding element ID based on matching captions // 2. grab the previous value from the $entry/entries // 3. create the dropdown list with these values, including javascript $formHandler =& xoops_getmodulehandler('forms', 'formulize'); $currentForm = $formHandler->get($screen->getVar('fid')); $previousForm = $formHandler->get($screen->getVar('paraentryform')); $currentCaptions = $currentForm->getVar('elementCaptions'); $captionToMatch = $currentCaptions[$ele_handle]; $previousCaptions = $previousForm->getVar('elementCaptions'); $previousElementHandle = array_search($captionToMatch, $previousCaptions); if (!$previousElementHandle) { return ""; } $elementName = $de ? "de_" . $fid . "_" . $entryId . "_" . $element_id : "ele_" . $element_id; // displayElement elements have different names from regular elements $previousElementId = formulize_getIdFromElementHandle($previousElementHandle); // function is in extract.php // setup the javascript based on the type of question, and setup other data that is required switch ($type) { case "text": case "date": $javascript = "onchange='javascript:this.form." . $elementName . ".value=this.form.prev_" . $element_id . ".value;'"; break; case "radio": // need to get the options of the question so we know what to match $prevElementMetaData = formulize_getElementMetaData($previousElementId); // use this function in extract instead of the get element method in handler, since this is guaranteed to be already be cached in memory $prevElement_ele_value = unserialize($prevElementMetaData['ele_value']); $prevElementOptions = array_keys($prevElement_ele_value); $javascript = "onchange='javascript:if(this.form.prev_" . $element_id . ".value !== \"\") { this.form." . $elementName . "[this.form.prev_" . $element_id . ".value].checked=true; }'"; break; case "yn": $javascript = "onchange='javascript:if(this.form.prev_" . $element_id . ".value !== \"\") { this.form." . $elementName . "[this.form.prev_" . $element_id . ".value].checked=true; }'"; break; } $previousOptions = array(); $prevOptionsExist = false; foreach ($entries as $id => $entry) { $value = htmlspecialchars(strip_tags(display($entry, $previousElementHandle))); if (is_array($value)) { $value = printSmart(implode(", ", $value)); } if (trim($value) === "" or trim($value) == "0000-00-00") { continue; } $prevOptionsExist = true; switch ($type) { case "text": case "date": $previousOptions[$value] = $value; break; case "radio": $prevElementPosition = array_search($value, $prevElementOptions); // need to figure out which option matches the text of the value if ($prevElementPosition !== false) { $previousOptions[$prevElementPosition] = $value; // for radio buttons, we need to pass the position of the option } break; case "yn": if ($value == _formulize_TEMP_QYES) { $previousOptions[0] = $value; } elseif ($value == _formulize_TEMP_QNO) { $previousOptions[1] = $value; } break; } } if (!$prevOptionsExist) { return ""; } $prevUI = new xoopsFormSelect('', 'prev_' . $element_id, '123qweasdzxc', 1, false); // 123qweasdzxc is meant to be a unique value that will never be selected, since we don't ever want a previous selection showing by default $prevUI->addOption('', _AM_FORMULIZE_PREVIOUS_OPTION); $prevUI->addOptionArray($previousOptions); $prevUI->setExtra($javascript); return $prevUI; }
function formulize_numberFormat($value, $handle, $decimalOverride = 0) { if (!is_numeric($value) or substr($value, 0, 1) == "0") { return $value; } $id = formulize_getIdFromElementHandle($handle); $elementMetaData = formulize_getElementMetaData($id, false); if ($elementMetaData['ele_type'] == "text") { $ele_value = unserialize($elementMetaData['ele_value']); // value, decimaloverride, decimals, decsep exists, decsep, sep exists, sep, prefix exists, prefix return _formulize_numberFormat($value, $decimalOverride, $ele_value[5], isset($ele_value[7]), $ele_value[7], isset($ele_value[8]), $ele_value[8], isset($ele_value[6]), $ele_value[6], isset($ele_value[10]), $ele_value[10]); } elseif ($elementMetaData['ele_type'] == "derived") { $ele_value = unserialize($elementMetaData['ele_value']); // value, decimaloverride, decimals, decsep exists, decsep, sep exists, sep, prefix exists, prefix return _formulize_numberFormat($value, $decimalOverride, $ele_value[1], isset($ele_value[3]), $ele_value[3], isset($ele_value[4]), $ele_value[4], isset($ele_value[2]), $ele_value[2], isset($ele_value[5]), $ele_value[5]); } else { return $value; } }