function cloneForm($fid, $clonedata = false) { if (is_object($fid)) { if (!get_class($fid) == "formulizeForm") { return false; } $fid = $fid->getVar('id_form'); } elseif (!is_numeric($fid)) { return false; } // procedure: // duplicate row for that fid in db but use next incremental fid // duplicate rows in form table for that fid, but use new fid and increment ele_ids of course // redraw page $newtitle = $this->titleForClonedForm($fid); $getrow = q("SELECT * FROM " . $this->db->prefix("formulize_id") . " WHERE id_form = {$fid}"); $insert_sql = "INSERT INTO " . $this->db->prefix("formulize_id") . " ("; $start = 1; foreach ($getrow[0] as $field => $value) { if (is_null($value)) { continue; } if ($this->fieldShouldBeSkippedInCloning($field)) { continue; } if (!$start) { $insert_sql .= ", "; } $start = 0; $insert_sql .= $field; } $insert_sql .= ") VALUES ("; $start = 1; foreach ($getrow[0] as $field => $value) { if (is_null($value)) { continue; } if ($this->fieldShouldBeSkippedInCloning($field)) { continue; } if ($field == "desc_form") { $value = $newtitle; } if ($field == "form_handle") { $oldFormHandle = $value; $value = "replace_with_handle_and_id"; } if (!$start) { $insert_sql .= ", "; } $start = 0; $insert_sql .= '"' . formulize_db_escape($value) . '"'; } $insert_sql .= ")"; if (!($result = $this->db->query($insert_sql))) { print "error duplicating form: '{$title}'<br>SQL: {$insert_sql}<br>" . $xoopsDB->error(); return false; } $newfid = $this->db->getInsertId(); // replace formhandle of the new form $replaceSQL = "UPDATE " . $this->db->prefix("formulize_id") . " SET form_handle='" . formulize_db_escape($oldFormHandle . "_" . $newfid) . "' WHERE form_handle=\"replace_with_handle_and_id\""; if (!($result = $this->db->queryF($replaceSQL))) { print "error setting the form_handle for the new form.<br>" . $xoopsDB->error(); return false; } $getelements = q("SELECT * FROM " . $this->db->prefix("formulize") . " WHERE id_form = {$fid}"); $oldNewEleIdMap = array(); foreach ($getelements as $ele) { // for each element in the form.... $insert_sql = "INSERT INTO " . $this->db->prefix("formulize") . " ("; $start = 1; foreach ($ele as $field => $value) { if ($field == "ele_id") { continue; } if (!$start) { $insert_sql .= ", "; } $start = 0; $insert_sql .= $field; } $insert_sql .= ") VALUES ("; $start = 1; foreach ($ele as $field => $value) { if ($field == "id_form") { $value = "{$newfid}"; } if ($field == "ele_id") { continue; } if ($field == "ele_handle") { if ($value === $ele['ele_id']) { $value = "replace_with_ele_id"; } else { $firstUniqueCheck = true; $value .= "_cloned"; while (!($uniqueCheck = $this->isHandleUnique($value))) { if ($firstUniqueCheck) { $value = $value . "_" . $newfid; $firstUniqueCheck = false; } else { $value = $value . "_copy"; } } } $oldNewEleIdMap[$ele['ele_handle']] = $value; } if (!$start) { $insert_sql .= ", "; } $start = 0; $value = addslashes($value); $insert_sql .= "\"{$value}\""; } $insert_sql .= ")"; if (!($result = $this->db->query($insert_sql))) { print "error duplicating elements in form: '{$title}'<br>SQL: {$insert_sql}<br>" . $xoopsDB->error(); return false; } if ($oldNewEleIdMap[$ele['ele_handle']] == "replace_with_ele_id") { $oldNewEleIdMap[$ele['ele_handle']] = $this->db->getInsertId(); } } // replace ele_id flags that need replacing $replaceSQL = "UPDATE " . $this->db->prefix("formulize") . " SET ele_handle=ele_id WHERE ele_handle=\"replace_with_ele_id\""; if (!($result = $this->db->queryF($replaceSQL))) { print "error setting the ele_handle values for the new form.<br>" . $xoopsDB->error(); return false; } // Need to create the new data table now -- July 1 2007 if (!($tableCreationResult = $this->createDataTable($newfid, $fid, $oldNewEleIdMap))) { print "Error: could not make the necessary new datatable for form " . $newfid . ". Please delete the cloned form and report this error to <a href=\"mailto:formulize@freeformsolutions.ca\">Freeform Solutions</a>.<br>" . $xoopsDB->error(); return false; } if ($clonedata) { // July 1 2007 -- changed how cloning happens with new data structure include_once XOOPS_ROOT_PATH . "/modules/formulize/class/data.php"; // formulize data handler $dataHandler = new formulizeDataHandler($newfid); if (!($cloneResult = $dataHandler->cloneData($fid, $oldNewEleIdMap))) { print "Error: could not clone the data from the old form to the new form. Please delete the cloned form and report this error to <a href=\"mailto:formulize@freeformsolutions.ca\">Freeform Solutions</a>.<br>" . $xoopsDB->error(); return false; } } // if revisions are enabled for the cloned form, then create the revisions table $form_handler = xoops_getmodulehandler('forms', 'formulize'); $clonedFormObject = $form_handler->get($newfid); if ($clonedFormObject->getVar('store_revisions')) { if (!($tableCreationResult = $this->createDataTable($newfid, 0, false, true))) { print "Error: could not create revisions table for form {$newfid}. " . "Please delete the cloned form and report this error to " . "<a href=\"mailto:formulize@freeformsolutions.ca\">Freeform Solutions</a>.<br>" . $xoopsDB->error(); return false; } } $this->setPermissionsForClonedForm($fid, $newfid); // create and insert new defaultlist screen and defaultform screen using $newfid and $newtitle $defaultFormScreenId = $this->formScreenForClonedForm($newtitle, $newfid); $defaultListScreenId = $this->listScreenForClonedForm($defaultFormScreenId, $newtitle, $newfid); $clonedFormObject->setVar('defaultform', $defaultFormScreenId); $clonedFormObject->setVar('defaultlist', $defaultListScreenId); if (!$form_handler->insert($clonedFormObject)) { print "Error: could not update form object with default screen ids: " . $xoopsDB->error(); } $this->setClonedFormAppId($newfid, $xoopsDB); }