public static function process($objectID = NULL, $fieldname = NULL, $state = 1, $returnArray = FALSE) { if ((string) $state != "1" && (string) $state != "3") { errorHandle::newError(__METHOD__ . "() - Invalid state provided: " . $state, errorHandle::DEBUG); return FALSE; } // was a valid objectID provided if (!isnull($objectID) && validate::integer($objectID)) { $objectWhere = sprintf(" AND `objectID`='%s'", mfcs::$engine->openDB->escape($objectID)); } else { if (!isnull($objectID) && !validate::integer($objectID)) { errorHandle::newError(__METHOD__ . "() - Invalid Object ID: " . $objectID, errorHandle::DEBUG); return FALSE; } else { $objectWhere = ""; } } // was a valid fieldname provided if (!isnull($fieldname) && is_string($fieldname)) { $fieldnameWhere = sprintf(" AND `fieldName`='%s'", mfcs::$engine->openDB->escape($fieldname)); } else { $fieldnameWhere = ""; } $sql = sprintf("SELECT * FROM `objectProcessing` WHERE `objectProcessing`.`state`='%s'%s%s", mfcs::$engine->openDB->escape($state), $objectWhere, $fieldnameWhere); $sqlResult = mfcs::$engine->openDB->query($sql); // I'm not sure about database transactions here // We are modifying the file system (exports). transaction rollbacks would // have to be done on the file system as well. while ($row = mysql_fetch_array($sqlResult['result'], MYSQL_ASSOC)) { // set the state of the row to 2 self::setProcessingState($row['ID'], 2); // get the object, and ignore the cache since we are updating in a loop $object = objects::get($row['objectID'], TRUE); $files = $object['data'][$row['fieldName']]; $assetsID = $files['uuid']; $fieldOptions = forms::getField($object['formID'], $row['fieldName']); // do we need to do any processing? // @TODO, i don't like how these are hard coded $combine = str2bool($fieldOptions['combine']); $convert = str2bool($fieldOptions['convert']); $ocr = str2bool($fieldOptions['ocr']); $thumbnail = str2bool($fieldOptions['thumbnail']); $mp3 = str2bool($fieldOptions['mp3']); if (!$combine && !$convert && !$ocr && !$thumbnail && !$mp3) { self::setProcessingState($row['ID'], 0); continue; } $processedFiles = self::processObjectFiles($assetsID, $fieldOptions); $files['files'] = array_merge($files['files'], $processedFiles); $object['data'][$row['fieldName']] = $files; $return = objects::update($objectID, $object['formID'], $object['data'], $object['metadata'], $object['parentID']); // @TODO this return value isn't descriptive enough. It can fail and still // return a valid array. we likely need to return an array with an error // code as well as the array to save to the data if (!$return) { $setRowValue = 3; } else { $setRowValue = 0; } // Processing is done, set state to 0 self::setProcessingState($row['ID'], $setRowValue); if ($returnArray === TRUE) { return $object['data'][$row['fieldName']]; } } return TRUE; }
public static function submit($formID, $objectID = NULL, $importing = FALSE) { $engine = mfcs::$engine; $backgroundProcessing = array(); if (isnull($objectID)) { $newObject = TRUE; } else { $newObject = FALSE; } // Get the current Form if (($form = self::get($formID)) === FALSE) { errorHandle::newError(__METHOD__ . "() - retrieving form by formID", errorHandle::DEBUG); return FALSE; } // the form is an object form, make sure that it has an ID field defined. // @TODO this check can probably be removed, its being checked in object class if ($form['metadata'] == "0") { $idnoInfo = self::getFormIDInfo($formID); if ($idnoInfo === FALSE) { errorHandle::newError(__METHOD__ . "() - no IDNO field for object form.", errorHandle::DEBUG); return FALSE; } } $fields = $form['fields']; if (usort($fields, 'sortFieldsByPosition') !== TRUE) { errorHandle::newError(__METHOD__ . "() - usort", errorHandle::DEBUG); if (!$importing) { errorHandle::errorMsg("Error retrieving form."); } return FALSE; } $values = array(); // go through all the fields, get their values foreach ($fields as $field) { $value = isset($engine->cleanPost['RAW'][$field['name']]) ? $engine->cleanPost['RAW'][$field['name']] : ""; $validationTests = self::validateSubmission($formID, $field, $value, $objectID); if (isnull($validationTests) || $validationTests === FALSE) { continue; } if (strtolower($field['readonly']) == "true") { // need to pull the data that loaded with the form if ($newObject === FALSE) { // grab it from the database $oldObject = objects::get($objectID); $values[$field['name']] = $oldObject['data'][$field['name']]; } else { // If the form has a variable in the value we apply the variable, otherwise, field value. // we need to check for disabled on insert form if (!isset($field['disabledInsert']) || isset($field['disabledInsert']) && $field['disabledInsert'] == "false") { $values[$field['name']] = self::hasFieldVariables($field['value']) ? self::applyFieldVariables($value) : $field['value']; } // grab the default value from the form. // $values[$field['name']] = $field['value']; } } else { if (strtolower($field['type']) == "file" && isset($engine->cleanPost['MYSQL'][$field['name']])) { // Process uploaded files $uploadID = $engine->cleanPost['MYSQL'][$field['name']]; // Process the uploads and put them into their archival locations if (($tmpArray = files::processObjectUploads($objectID, $uploadID)) === FALSE) { errorHandle::newError(__METHOD__ . "() - Archival Location", errorHandle::DEBUG); return FALSE; } if ($tmpArray !== TRUE) { // didn't generate a proper uuid for the items, rollback if (!isset($tmpArray['uuid'])) { $engine->openDB->transRollback(); $engine->openDB->transEnd(); errorHandle::newError(__METHOD__ . "() - No UUID", errorHandle::DEBUG); return FALSE; } // ads this field to the files object // we can't do inserts yet because we don't have the objectID on // new objects files::addProcessingField($field['name']); // Should the files be processed now or later? if (isset($field['bgProcessing']) && str2bool($field['bgProcessing']) === TRUE) { $backgroundProcessing[$field['name']] = TRUE; } else { $backgroundProcessing[$field['name']] = FALSE; } $values[$field['name']] = $tmpArray; } else { // if we don't have files, and this is an update, we need to pull the files information from the // version that is already in the system. $oldObject = objects::get($objectID); if ($newObject === FALSE && objects::hasFiles($objectID, $field['name']) === TRUE) { $values[$field['name']] = $oldObject['data'][$field['name']]; } } } else { $values[$field['name']] = $value; } } } if (isset($engine->errorStack['error']) && count($engine->errorStack['error']) > 0) { // errorHandle::newError(__METHOD__."() - Error stack not empty.", errorHandle::DEBUG); return FALSE; } // start transactions $result = $engine->openDB->transBegin("objects"); if ($result !== TRUE) { if (!$importing) { errorHandle::errorMsg("Database transactions could not begin."); } errorHandle::newError(__METHOD__ . "() - unable to start database transactions", errorHandle::DEBUG); return FALSE; } if ($newObject === TRUE) { if (objects::create($formID, $values, $form['metadata'], isset($engine->cleanPost['MYSQL']['parentID']) ? $engine->cleanPost['MYSQL']['parentID'] : "0") === FALSE) { $engine->openDB->transRollback(); $engine->openDB->transEnd(); if (!$importing) { errorHandle::errorMsg("Error inserting new object."); } errorHandle::newError(__METHOD__ . "() - Error inserting new object.", errorHandle::DEBUG); return FALSE; } // Grab the objectID of the new object $objectID = localvars::get("newObjectID"); } else { if (objects::update($objectID, $formID, $values, $form['metadata'], isset($engine->cleanPost['MYSQL']['parentID']) ? $engine->cleanPost['MYSQL']['parentID'] : "0") === FALSE) { $engine->openDB->transRollback(); $engine->openDB->transEnd(); if (!$importing) { errorHandle::errorMsg("Error updating."); } errorHandle::newError(__METHOD__ . "() - Error updating.", errorHandle::DEBUG); return FALSE; } } // Now that we have a valid objectID, we insert into the processing table if (files::insertIntoProcessingTable($objectID) === FALSE) { $engine->openDB->transRollback(); $engine->openDB->transEnd(); errorHandle::newError(__METHOD__ . "() - Processing Table", errorHandle::DEBUG); return FALSE; } // end transactions $engine->openDB->transCommit(); $engine->openDB->transEnd(); if (!is_empty($backgroundProcessing)) { foreach ($backgroundProcessing as $fieldName => $V) { if ($V === FALSE) { // No background processing. do it now. files::process($objectID, $fieldName); } } } if ($newObject === TRUE) { if (!$importing) { errorHandle::successMsg("Object created successfully."); } } else { if (!$importing) { errorHandle::successMsg("Object updated successfully."); } } return TRUE; }
$form = forms::get($object['formID']); $fields = $form['fields']; if (mfcsPerms::isEditor($form['ID']) === FALSE) { throw new Exception("Permission Denied to view objects created with this form."); } log::insert("Data Entry: Revision: View Page", $objectID); ############################################################################################################### // Catch a form submition (which would be a revision being reverted to) if (isset($engine->cleanPost['MYSQL']['revisionID'])) { log::insert("Data Entry: Revision: Revert", $objectID); // @TODO this should use revert2Revision() method instead of this ... $revisionID = $revisions->getRevisionID($engine->cleanGet['MYSQL']['objectID'], $engine->cleanPost['MYSQL']['revisionID']); if (($revision = $revisions->getMetadataForID($revisionID)) === FALSE) { throw new Exception('Could not load revision.'); } if (objects::update($engine->cleanGet['MYSQL']['objectID'], $revision['formID'], decodeFields($revision['data']), $revision['metadata'], $revision['parentID']) !== FALSE) { // Reload the object - To refresh the data $object = objects::get($objectID, TRUE); } else { throw new Exception('Could not update object with revision.'); } } ############################################################################################################### // Is this just a revision AJAX request? if (isset($engine->cleanGet['MYSQL']['revisionID'])) { $revisionID = $revisions->getRevisionID($engine->cleanGet['MYSQL']['objectID'], $engine->cleanGet['MYSQL']['revisionID']); $revision = $revisions->getMetadataForID($revisionID); if (!$revision) { die('Error reading revision'); } else { die(revisions::generateFieldDisplay($revision, $fields));