function option_request_to_json($sv, &$new_opts, $id, $current_opts) { global $Conf; $name = simplify_whitespace(defval($sv->req, "optn{$id}", "")); if (!isset($sv->req["optn{$id}"]) && $id[0] !== "n") { if (get($current_opts, $id)) { $new_opts[$id] = $current_opts[$id]; } return; } else { if ($name === "" || $sv->req["optfp{$id}"] === "delete" || $id[0] === "n" && ($name === "New option" || $name === "(Enter new option)")) { return; } } $oarg = ["name" => $name, "id" => (int) $id, "final" => false]; if ($id[0] === "n") { $nextid = max($Conf->setting("next_optionid", 1), 1); foreach ($new_opts as $haveid => $o) { $nextid = max($nextid, $haveid + 1); } foreach ($current_opts as $haveid => $o) { $nextid = max($nextid, $haveid + 1); } $oarg["id"] = $nextid; } if (get($sv->req, "optd{$id}") && trim($sv->req["optd{$id}"]) != "") { $t = CleanHTML::basic_clean($sv->req["optd{$id}"], $err); if ($t !== false) { $oarg["description"] = $t; } else { $sv->set_error("optd{$id}", $err); } } if ($optvt = get($sv->req, "optvt{$id}")) { if (($pos = strpos($optvt, ":")) !== false) { $oarg["type"] = substr($optvt, 0, $pos); if (preg_match('/:final/', $optvt)) { $oarg["final"] = true; } if (preg_match('/:ds_(\\d+)/', $optvt, $m)) { $oarg["display_space"] = (int) $m[1]; } } else { $oarg["type"] = $optvt; } } else { $oarg["type"] = "checkbox"; } if (PaperOption::type_has_selector($oarg["type"])) { $oarg["selector"] = array(); $seltext = trim(cleannl(defval($sv->req, "optv{$id}", ""))); if ($seltext != "") { foreach (explode("\n", $seltext) as $t) { $oarg["selector"][] = $t; } } else { $sv->set_error("optv{$id}", "Enter selectors one per line."); } } $oarg["visibility"] = defval($sv->req, "optp{$id}", "rev"); if ($oarg["final"]) { $oarg["visibility"] = "rev"; } $oarg["position"] = (int) defval($sv->req, "optfp{$id}", 1); $oarg["display"] = defval($sv->req, "optdt{$id}"); if ($oarg["type"] === "pdf" && $oarg["final"]) { $oarg["display"] = "submission"; } $new_opts[$oarg["id"]] = $o = PaperOption::make($oarg); $o->req_id = $id; $o->is_new = $id[0] === "n"; }
function parse_value($sv, $name, $info) { global $Conf, $Me, $Now, $Opt; if (!isset($sv->req[$name])) { $xname = str_replace(".", "_", $name); if (isset($sv->req[$xname])) { $sv->req[$name] = $sv->req[$xname]; } else { if ($info->type === "checkbox" || $info->type === "cdate") { return 0; } else { return null; } } } $v = trim($sv->req[$name]); if ($info->placeholder && $info->placeholder === $v || $info->invalid_value && $info->invalid_value === $v) { $v = ""; } if ($info->type === "checkbox") { return $v != "" ? 1 : 0; } else { if ($info->type === "cdate" && $v == "1") { return 1; } else { if ($info->type === "date" || $info->type === "cdate" || $info->type === "ndate") { if ($v == "" || !strcasecmp($v, "N/A") || !strcasecmp($v, "same as PC") || $v == "0" || $info->type !== "ndate" && !strcasecmp($v, "none")) { return -1; } else { if (!strcasecmp($v, "none")) { return 0; } else { if (($v = $Conf->parse_time($v)) !== false) { return $v; } else { $err = unparse_setting_error($info, "Invalid date."); } } } } else { if ($info->type === "grace") { if (($v = parseGrace($v)) !== null) { return intval($v); } else { $err = unparse_setting_error($info, "Invalid grace period."); } } else { if ($info->type === "int" || $info->type === "zint") { if (preg_match("/\\A[-+]?[0-9]+\\z/", $v)) { return intval($v); } else { $err = unparse_setting_error($info, "Should be a number."); } } else { if ($info->type === "string") { // Avoid storing the default message in the database if (substr($name, 0, 9) == "mailbody_") { $t = expandMailTemplate(substr($name, 9), true); $v = cleannl($v); if ($t["body"] == $v) { return ""; } } return $v; } else { if ($info->type === "simplestring") { return simplify_whitespace($v); } else { if ($info->type === "tag" || $info->type === "tagbase") { $tagger = new Tagger($Me); $v = trim($v); if ($v === "" && $info->optional) { return $v; } $v = $tagger->check($v, $info->type === "tagbase" ? Tagger::NOVALUE : 0); if ($v) { return $v; } $err = unparse_setting_error($info, $tagger->error_html); } else { if ($info->type === "emailheader") { $v = MimeText::encode_email_header("", $v); if ($v !== false) { return $v == "" ? "" : MimeText::decode_header($v); } $err = unparse_setting_error($info, "Invalid email header."); } else { if ($info->type === "emailstring") { $v = trim($v); if ($v === "" && $info->optional) { return ""; } else { if (validate_email($v) || $v === $v_active) { return $v; } else { $err = unparse_setting_error($info, "Invalid email."); } } } else { if ($info->type === "urlstring") { $v = trim($v); if ($v === "" && $info->optional || preg_match(',\\A(?:https?|ftp)://\\S+\\z,', $v)) { return $v; } else { $err = unparse_setting_error($info, "Invalid URL."); } } else { if ($info->type === "htmlstring") { if (($v = CleanHTML::basic_clean($v, $err)) === false) { $err = unparse_setting_error($info, $err); } else { if ($info->message_default && $v === $Conf->message_default_html($info->message_default)) { return ""; } else { return $v; } } } else { if ($info->type === "radio") { foreach ($info->values as $allowedv) { if ((string) $allowedv === $v) { return $allowedv; } } $err = unparse_setting_error($info, "Parse error (unexpected value)."); } else { return $v; } } } } } } } } } } } } } $sv->set_error($name, $err); return null; }
public function parse($sv, $si) { global $Conf; $this->nrfj = (object) array(); $option_error = "Review fields with options must have at least two choices, numbered sequentially from 1 (higher numbers are better) or lettered with consecutive uppercase letters (lower letters are better). Example: <pre>1. Low quality\n 2. Medium quality\n 3. High quality</pre>"; $rf = ReviewForm::get(); foreach ($rf->fmap as $fid => $f) { $fj = (object) array(); $sn = simplify_whitespace(defval($sv->req, "shortName_{$fid}", "")); if ($sn == "<None>" || $sn == "<New field>" || $sn == "Field name") { $sn = ""; } $pos = cvtint(get($sv->req, "order_{$fid}")); if ($pos > 0 && $sn == "" && trim(defval($sv->req, "description_{$fid}", "")) == "" && trim(defval($sv->req, "options_{$fid}", "")) == "") { $pos = -1; } if ($sn != "") { $fj->name = $sn; } else { if ($pos > 0) { $sv->set_error("shortName_{$fid}", "Missing review field name."); } } $fj->visibility = get($sv->req, "authorView_{$fid}"); $x = CleanHTML::basic_clean(defval($sv->req, "description_{$fid}", ""), $err); if ($x === false) { if (get($f, "description")) { $fj->description = $f->description; } if ($pos > 0) { $sv->set_error("description_{$fid}", htmlspecialchars($sn) . " description: " . $err); } } else { if (($x = trim($x)) != "") { $fj->description = $x; } } if ($pos > 0) { $fj->position = $pos; } if ($f->has_options) { $fj->options = array_values($f->options); // default if (!$this->check_options($sv, $fid, $fj) && $pos > 0) { $sv->set_error("options_{$fid}", "Invalid options."); if ($option_error) { $sv->set_error(null, $option_error); } $option_error = false; } $prefixes = array("sv", "svr", "sv-blpu", "sv-publ", "sv-viridis", "sv-viridisr"); $class_prefix = defval($sv->req, "option_class_prefix_{$fid}", "sv"); $prefix_index = array_search($class_prefix, $prefixes) ?: 0; if (get($sv->req, "option_class_prefix_flipped_{$fid}")) { $prefix_index ^= 1; } $fj->option_class_prefix = $prefixes[$prefix_index]; } $fj->round_mask = 0; if ($rlist = get($sv->req, "round_list_{$fid}")) { foreach (explode(" ", trim($rlist)) as $round_name) { $fj->round_mask |= 1 << $Conf->round_number($round_name, false); } } $xf = clone $f; $xf->assign($fj); $this->nrfj->{$fid} = $xf->unparse_json(); } $sv->need_lock["PaperReview"] = true; return true; }