static function Update($RESULT_ID, $arrVALUES=false, $UPDATE_ADDITIONAL="N", $CHECK_RIGHTS="Y")
{
$err_mess = (CAllFormResult::err_mess())."
Function: Update
Line: ";
global $DB, $USER, $strError, $APPLICATION;
if ($arrVALUES===false) $arrVALUES = $_REQUEST;
InitBvar($UPDATE_ADDITIONAL);
// check whether such result exists in db
$RESULT_ID = intval($RESULT_ID);
$z = CFormResult::GetByID($RESULT_ID);
if ($zr=$z->Fetch())
{
$arrResult = $zr;
$additional = ($UPDATE_ADDITIONAL=="Y") ? "ALL" : "N";
// get form data
$WEB_FORM_ID = CForm::GetDataByID($arrResult["FORM_ID"], $arForm, $arQuestions, $arAnswers, $arDropDown, $arMultiSelect, $additional);
if ($WEB_FORM_ID>0)
{
// check form rights
$F_RIGHT = ($CHECK_RIGHTS!="Y") ? 30 : intval(CForm::GetPermission($WEB_FORM_ID));
if ($F_RIGHT>=20 || ($F_RIGHT>=15 && $arrResult["USER_ID"]==$USER->GetID()))
{
// check result rights (its status rights)
$arrRESULT_PERMISSION = ($CHECK_RIGHTS!="Y") ? CFormStatus::GetMaxPermissions() : CFormResult::GetPermissions($RESULT_ID);
// if rights're correct
if (in_array("EDIT", $arrRESULT_PERMISSION))
{
// update result
$arFields = array("TIMESTAMP_X" => $DB->GetNowFunction());
$fname = "status_".$arForm["SID"];
$STATUS_ID = intval($arrVALUES[$fname]);
$bUpdateStatus = false;
// if there's new status defined
if (intval($STATUS_ID)>0)
{
// check new status rights
$arrNEW_STATUS_PERMISSION = ($CHECK_RIGHTS!="Y") ? CFormStatus::GetMaxPermissions() : CFormStatus::GetPermissions($STATUS_ID);
// if rights're correct
if (in_array("MOVE",$arrNEW_STATUS_PERMISSION))
{
// update it
$bUpdateStatus = true;
$arFields["STATUS_ID"] = intval($arrVALUES[$fname]);
}
}
if ($bUpdateStatus)
{
foreach (GetModuleEvents('form', 'onBeforeResultStatusChange', true) as $arEvent)
{
ExecuteModuleEventEx($arEvent, array($WEB_FORM_ID, $RESULT_ID, &$arFields["STATUS_ID"], $CHECK_RIGHTS));
if ($ex = $APPLICATION->GetException())
$strError .= $ex->GetString().'
';
}
}
if ($strError == '')
{
// call status change handler
CForm::ExecHandlerBeforeChangeStatus($RESULT_ID, "UPDATE", $arFields["STATUS_ID"]);
foreach (GetModuleEvents('form', 'onBeforeResultUpdate', true) as $arEvent)
{
ExecuteModuleEventEx($arEvent, array($WEB_FORM_ID, $RESULT_ID, &$arFields, &$arrVALUES, $CHECK_RIGHTS));
if ($ex = $APPLICATION->GetException())
$strError .= $ex->GetString().'
';
}
}
$rows = 0;
if ($strError == '')
$rows = $DB->Update("b_form_result", $arFields,"WHERE ID='".$RESULT_ID."'",$err_mess.__LINE__);
if ($bUpdateStatus)
{
foreach (GetModuleEvents('form', 'onAfterResultStatusChange', true) as $arEvent)
{
ExecuteModuleEventEx($arEvent, array($WEB_FORM_ID, $RESULT_ID, &$arFields["STATUS_ID"], $CHECK_RIGHTS));
}
}
// if update was successful
if (intval($rows)>0)
{
$arrException = array();
// gather files info
$arrFILES = array();
$strSql = "
SELECT
ANSWER_ID,
USER_FILE_ID,
USER_FILE_NAME,
USER_FILE_IS_IMAGE,
USER_FILE_HASH,
USER_FILE_SUFFIX,
USER_FILE_SIZE
FROM
b_form_result_answer
WHERE
RESULT_ID = $RESULT_ID
and USER_FILE_ID>0
";
$q = $DB->Query($strSql,false,$err_mess.__LINE__);
while ($qr = $q->Fetch()) $arrFILES[$qr["ANSWER_ID"]] = $qr;
if (is_array($arrVALUES["ARR_CLS"])) $arrException = array_merge($arrException, $arrVALUES["ARR_CLS"]);
// clear all questions and answers for current result
CFormResult::Reset($RESULT_ID, false, $UPDATE_ADDITIONAL, $arrException);
// trace questions and additional fields
foreach ($arQuestions as $arQuestion)
{
$FIELD_ID = $arQuestion["ID"];
if (is_array($arrException) && count($arrException)>0)
{
if (in_array($FIELD_ID, $arrException)) continue;
}
$FIELD_SID = $arQuestion["SID"];
if ($arQuestion["ADDITIONAL"]!="Y")
{
// update form questions
$arrANSWER_TEXT = array();
$arrANSWER_VALUE = array();
$arrUSER_TEXT = array();
$radio = "N";
$checkbox = "N";
$multiselect = "N";
$dropdown = "N";
// trace answers
if (is_array($arAnswers[$FIELD_SID]))
{
foreach ($arAnswers[$FIELD_SID] as $key => $arAnswer)
{
$ANSWER_ID = 0;
$FIELD_TYPE = $arAnswer["FIELD_TYPE"];
$FIELD_PARAM = $arAnswer["FIELD_PARAM"];
switch ($FIELD_TYPE) :
case "radio":
case "dropdown":
if (($radio=="N" && $FIELD_TYPE=="radio") ||
($dropdown=="N" && $FIELD_TYPE=="dropdown"))
{
$fname = "form_".$FIELD_TYPE."_".$FIELD_SID;
$ANSWER_ID = intval($arrVALUES[$fname]);
if ($ANSWER_ID>0)
{
$z = CFormAnswer::GetByID($ANSWER_ID);
if ($zr = $z->Fetch())
{
$arFields = array(
"RESULT_ID" => $RESULT_ID,
"FORM_ID" => $WEB_FORM_ID,
"FIELD_ID" => $FIELD_ID,
"ANSWER_ID" => $ANSWER_ID,
"ANSWER_TEXT" => trim($zr["MESSAGE"]),
"ANSWER_VALUE" => $zr["VALUE"]
);
$arrANSWER_TEXT[$FIELD_ID][] = ToUpper($arFields["ANSWER_TEXT"]);
$arrANSWER_VALUE[$FIELD_ID][] = ToUpper($arFields["ANSWER_VALUE"]);
CFormResult::AddAnswer($arFields);
}
if ($FIELD_TYPE=="radio") $radio = "Y";
if ($FIELD_TYPE=="dropdown") $dropdown = "Y";
}
}
break;
case "checkbox":
case "multiselect":
if (($checkbox=="N" && $FIELD_TYPE=="checkbox") ||
($multiselect=="N" && $FIELD_TYPE=="multiselect"))
{
$fname = "form_".$FIELD_TYPE."_".$FIELD_SID;
if (is_array($arrVALUES[$fname]) && count($arrVALUES[$fname])>0)
{
foreach($arrVALUES[$fname] as $ANSWER_ID)
{
$ANSWER_ID = intval($ANSWER_ID);
if ($ANSWER_ID>0)
{
$z = CFormAnswer::GetByID($ANSWER_ID);
if ($zr = $z->Fetch())
{
$arFields = array(
"RESULT_ID" => $RESULT_ID,
"FORM_ID" => $WEB_FORM_ID,
"FIELD_ID" => $FIELD_ID,
"ANSWER_ID" => $ANSWER_ID,
"ANSWER_TEXT" => trim($zr["MESSAGE"]),
"ANSWER_VALUE" => $zr["VALUE"]
);
$arrANSWER_TEXT[$FIELD_ID][] = ToUpper($arFields["ANSWER_TEXT"]);
$arrANSWER_VALUE[$FIELD_ID][] = ToUpper($arFields["ANSWER_VALUE"]);
CFormResult::AddAnswer($arFields);
}
}
}
if ($FIELD_TYPE=="checkbox") $checkbox = "Y";
if ($FIELD_TYPE=="multiselect") $multiselect = "Y";
}
}
break;
case "text":
case "textarea":
case "password":
case "email":
case "url":
case "hidden":
$fname = "form_".$FIELD_TYPE."_".$arAnswer["ID"];
$ANSWER_ID = intval($arAnswer["ID"]);
$z = CFormAnswer::GetByID($ANSWER_ID);
if ($zr = $z->Fetch())
{
$arFields = array(
"RESULT_ID" => $RESULT_ID,
"FORM_ID" => $WEB_FORM_ID,
"FIELD_ID" => $FIELD_ID,
"ANSWER_ID" => $ANSWER_ID,
"ANSWER_TEXT" => trim($zr["MESSAGE"]),
"ANSWER_VALUE" => $zr["VALUE"],
"USER_TEXT" => $arrVALUES[$fname]
);
$arrANSWER_TEXT[$FIELD_ID][] = ToUpper($arFields["ANSWER_TEXT"]);
$arrANSWER_VALUE[$FIELD_ID][] = ToUpper($arFields["ANSWER_VALUE"]);
$arrUSER_TEXT[$FIELD_ID][] = ToUpper($arFields["USER_TEXT"]);
CFormResult::AddAnswer($arFields);
}
break;
case "date":
$fname = "form_".$FIELD_TYPE."_".$arAnswer["ID"];
$ANSWER_ID = intval($arAnswer["ID"]);
$USER_DATE = $arrVALUES[$fname];
if (CheckDateTime($USER_DATE))
{
$z = CFormAnswer::GetByID($ANSWER_ID);
if ($zr = $z->Fetch())
{
$arFields = array(
"RESULT_ID" => $RESULT_ID,
"FORM_ID" => $WEB_FORM_ID,
"FIELD_ID" => $FIELD_ID,
"ANSWER_ID" => $ANSWER_ID,
"ANSWER_TEXT" => trim($zr["MESSAGE"]),
"ANSWER_VALUE" => $zr["VALUE"],
"USER_DATE" => $USER_DATE,
"USER_TEXT" => $USER_DATE
);
$arrANSWER_TEXT[$FIELD_ID][] = ToUpper($arFields["ANSWER_TEXT"]);
$arrANSWER_VALUE[$FIELD_ID][] = ToUpper($arFields["ANSWER_VALUE"]);
$arrUSER_TEXT[$FIELD_ID][] = ToUpper($arFields["USER_TEXT"]);
CFormResult::AddAnswer($arFields);
}
}
break;
case "image":
$fname = "form_".$FIELD_TYPE."_".$arAnswer["ID"];
$ANSWER_ID = intval($arAnswer["ID"]);
$arIMAGE = isset($arrVALUES[$fname]) ? $arrVALUES[$fname] : $_FILES[$fname];
$arIMAGE["old_file"] = $arrFILES[$ANSWER_ID]["USER_FILE_ID"];
$arIMAGE["del"] = $arrVALUES[$fname."_del"];
$arIMAGE["MODULE_ID"] = "form";
$fid = 0;
if ($arIMAGE["name"] <> '' || $arIMAGE["del"] <> '')
{
$new_file="Y";
if ($arIMAGE["del"] <> '' || CFile::CheckImageFile($arIMAGE) == '')
{
$fid = CFile::SaveFile($arIMAGE, "form");
}
}
else $fid = $arrFILES[$ANSWER_ID]["USER_FILE_ID"];
$fid = intval($fid);
if ($fid>0)
{
$z = CFormAnswer::GetByID($ANSWER_ID);
if ($zr = $z->Fetch())
{
$arFields = array(
"RESULT_ID" => $RESULT_ID,
"FORM_ID" => $WEB_FORM_ID,
"FIELD_ID" => $FIELD_ID,
"ANSWER_ID" => $ANSWER_ID,
"ANSWER_TEXT" => trim($zr["MESSAGE"]),
"ANSWER_VALUE" => $zr["VALUE"],
"USER_FILE_ID" => $fid,
"USER_FILE_IS_IMAGE" => "Y"
);
if ($new_file=="Y")
{
$arFields["USER_FILE_NAME"] = $arIMAGE["name"];
$arFields["USER_FILE_SIZE"] = $arIMAGE["size"];
$arFields["USER_FILE_HASH"] = md5(uniqid(mt_rand(), true).time());
}
else
{
$arFields["USER_FILE_NAME"] = $arrFILES[$ANSWER_ID]["USER_FILE_NAME"];
$arFields["USER_FILE_SIZE"] = $arrFILES[$ANSWER_ID]["USER_FILE_SIZE"];
$arFields["USER_FILE_HASH"] = $arrFILES[$ANSWER_ID]["USER_FILE_HASH"];
}
$arFields["USER_TEXT"] = $arFields["USER_FILE_NAME"];
$arrANSWER_TEXT[$FIELD_ID][] = ToUpper($arFields["ANSWER_TEXT"]);
$arrANSWER_VALUE[$FIELD_ID][] = ToUpper($arFields["ANSWER_VALUE"]);
$arrUSER_TEXT[$FIELD_ID][] = ToUpper($arFields["USER_TEXT"]);
CFormResult::AddAnswer($arFields);
}
}
break;
case "file":
$fname = "form_".$FIELD_TYPE."_".$arAnswer["ID"];
$ANSWER_ID = intval($arAnswer["ID"]);
$arFILE = isset($arrVALUES[$fname]) ? $arrVALUES[$fname] : $_FILES[$fname];
$arFILE["old_file"] = $arrFILES[$ANSWER_ID]["USER_FILE_ID"];
$arFILE["del"] = $arrVALUES[$fname."_del"];
$arFILE["MODULE_ID"] = "form";
$new_file="N";
$fid = 0;
if (trim($arFILE["name"]) <> '' || trim($arFILE["del"]) <> '')
{
$new_file="Y";
$original_name = $arFILE["name"];
$max_size = COption::GetOptionString("form", "MAX_FILESIZE");
$upload_dir = COption::GetOptionString("form", "NOT_IMAGE_UPLOAD_DIR");
$fid = CFile::SaveFile($arFILE, $upload_dir, $max_size);
}
else $fid = $arrFILES[$ANSWER_ID]["USER_FILE_ID"];
$fid = intval($fid);
if ($fid>0)
{
$z = CFormAnswer::GetByID($ANSWER_ID);
if ($zr = $z->Fetch())
{
$arFields = array(
"RESULT_ID" => $RESULT_ID,
"FORM_ID" => $WEB_FORM_ID,
"FIELD_ID" => $FIELD_ID,
"ANSWER_ID" => $ANSWER_ID,
"ANSWER_TEXT" => trim($zr["MESSAGE"]),
"ANSWER_VALUE" => $zr["VALUE"],
"USER_FILE_ID" => $fid,
);
if ($new_file=="Y")
{
$arFields["USER_FILE_NAME"] = $original_name;
$arFields["USER_FILE_IS_IMAGE"] = "N";
$arFields["USER_FILE_HASH"] = md5(uniqid(mt_rand(), true).time());
$arFields["USER_FILE_SUFFIX"] = $suffix;
$arFields["USER_FILE_SIZE"] = $arFILE["size"];
}
else
{
$arFields["USER_FILE_NAME"] = $arrFILES[$ANSWER_ID]["USER_FILE_NAME"];
$arFields["USER_FILE_IS_IMAGE"] = $arrFILES[$ANSWER_ID]["USER_FILE_IS_IMAGE"];
$arFields["USER_FILE_HASH"] = $arrFILES[$ANSWER_ID]["USER_FILE_HASH"];
$arFields["USER_FILE_SUFFIX"] = $arrFILES[$ANSWER_ID]["USER_FILE_SUFFIX"];
$arFields["USER_FILE_SIZE"] = $arrFILES[$ANSWER_ID]["USER_FILE_SIZE"];
}
$arFields["USER_TEXT"] = $arFields["USER_FILE_NAME"];
$arrANSWER_TEXT[$FIELD_ID][] = ToUpper($arFields["ANSWER_TEXT"]);
$arrANSWER_VALUE[$FIELD_ID][] = ToUpper($arFields["ANSWER_VALUE"]);
$arrUSER_TEXT[$FIELD_ID][] = ToUpper($arFields["USER_TEXT"]);
CFormResult::AddAnswer($arFields);
}
}
break;
endswitch;
}
}
// update fields for searching
$arrANSWER_TEXT_upd = $arrANSWER_TEXT[$FIELD_ID];
$arrANSWER_VALUE_upd = $arrANSWER_VALUE[$FIELD_ID];
$arrUSER_TEXT_upd = $arrUSER_TEXT[$FIELD_ID];
TrimArr($arrANSWER_TEXT_upd);
TrimArr($arrANSWER_VALUE_upd);
TrimArr($arrUSER_TEXT_upd);
if (is_array($arrANSWER_TEXT_upd)) $vl_ANSWER_TEXT = trim(implode(" ",$arrANSWER_TEXT_upd));
if (is_array($arrANSWER_VALUE_upd)) $vl_ANSWER_VALUE = trim(implode(" ",$arrANSWER_VALUE_upd));
if (is_array($arrUSER_TEXT_upd)) $vl_USER_TEXT = trim(implode(" ",$arrUSER_TEXT_upd));
if ($vl_ANSWER_TEXT == '') $vl_ANSWER_TEXT = false;
if ($vl_ANSWER_VALUE == '') $vl_ANSWER_VALUE = false;
if ($vl_USER_TEXT == '') $vl_USER_TEXT = false;
$arFields = array(
"ANSWER_TEXT_SEARCH" => $vl_ANSWER_TEXT,
"ANSWER_VALUE_SEARCH" => $vl_ANSWER_VALUE,
"USER_TEXT_SEARCH" => $vl_USER_TEXT
);
CFormResult::UpdateField($arFields, $RESULT_ID, $FIELD_ID);
}
else // update additional fields
{
$FIELD_TYPE = $arQuestion["FIELD_TYPE"];
switch ($FIELD_TYPE) :
case "text":
$fname = "form_textarea_ADDITIONAL_".$arQuestion["ID"];
$arFields = array(
"RESULT_ID" => $RESULT_ID,
"FORM_ID" => $WEB_FORM_ID,
"FIELD_ID" => $FIELD_ID,
"USER_TEXT" => $arrVALUES[$fname],
"USER_TEXT_SEARCH" => ToUpper($arrVALUES[$fname])
);
CFormResult::AddAnswer($arFields);
break;
case "integer":
$fname = "form_text_ADDITIONAL_".$arQuestion["ID"];
$arFields = array(
"RESULT_ID" => $RESULT_ID,
"FORM_ID" => $WEB_FORM_ID,
"FIELD_ID" => $FIELD_ID,
"USER_TEXT" => $arrVALUES[$fname],
"USER_TEXT_SEARCH" => ToUpper($arrVALUES[$fname])
);
CFormResult::AddAnswer($arFields);
break;
case "date":
$fname = "form_date_ADDITIONAL_".$arQuestion["ID"];
$USER_DATE = $arrVALUES[$fname];
if (CheckDateTime($USER_DATE))
{
$arFields = array(
"RESULT_ID" => $RESULT_ID,
"FORM_ID" => $WEB_FORM_ID,
"FIELD_ID" => $FIELD_ID,
"USER_DATE" => $USER_DATE,
"USER_TEXT" => $USER_DATE,
"USER_TEXT_SEARCH" => ToUpper($USER_DATE)
);
CFormResult::AddAnswer($arFields);
}
break;
endswitch;
}
}
foreach (GetModuleEvents('form', 'onAfterResultUpdate', true) as $arEvent)
{
ExecuteModuleEventEx($arEvent, array($WEB_FORM_ID, $RESULT_ID, $CHECK_RIGHTS));
}
// call "after status update" handler
CForm::ExecHandlerAfterChangeStatus($RESULT_ID, "UPDATE");
return true;
}
}
}
}
}
return false;
}