Example #1
0
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;
 }
Example #4
0
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;
    }
}