Пример #1
0
 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);
 }