<?php namespace Phpcmf\Library;
class Form
{
private $id = 0;
private $myfields;
public function id($id) {
$this->id = (int)$id;
return $this;
}
public function get_myfields() {
return $this->myfields;
}
public function auto_form_data($name, $data) {
$dt = \Phpcmf\Service::L('cache')->init('file')->get($name);
if (!$dt) {
return $data;
}
$dt['is_form_cache'] = 1;
return $data ? $dt + $data : $dt;
}
public function auto_form_data_delete($name) {
\Phpcmf\Service::L('cache')->init('file')->delete($name);
}
public function auto_form_data_ajax($name) {
return '
$(function(){
setInterval("auto_form_data_ajax()", 5000);
});
function auto_form_data_ajax() {
$.ajax({
type: "POST",
url: "/index.php?s=api&c=api&m=save_form_data&name='.$name.'",
dataType: "json",
data: $("#myform").serialize(),
success: function(data){ }
});
}
function auto_form_data_delete() {
var index = layer.load(2, {
shade: [0.3,\'#fff\'],
time: 10000
});
$.ajax({
type: "GET",
url: "/index.php?s=api&c=api&m=delete_form_data&name='.$name.'",
dataType: "json",
success: function(json){
layer.close(index);
dr_tips(json.code, json.msg);
setTimeout("window.location.reload(true)", 3000)
}
});
}
';
}
public function validation($data, $config, $fields = [], $old = []) {
$attach = [];
if ($config) {
foreach ($config as $name => $t) {
if ($t['length'] && strlen($data[$name]) > $t['length']) {
return [[], ['name' => $name, 'error' => dr_lang('长度不规范')]];
}
if ($t['rule']) {
foreach ($t['rule'] as $rule => $error) {
switch ($rule) {
case 'empty':
if (!$data[$name] && !strlen($data[$name])) {
return [[], ['name' => $name, 'error' => $error]];
}
break;
case 'table':
if (!(preg_match('/^[a-z]+[0-9]+/i', $data[$name]) || preg_match('/[a-z]+/i', $data[$name]))) {
return [[], ['name' => $name, 'error' => $error]];
}
break;
case 'pinyin':
if (!preg_match('/[a-z0-9]+/i', $data[$name])) {
return [[], ['name' => $name, 'error' => $error]];
}
break;
}
}
}
if ($t['filter']) {
foreach ($t['filter'] as $value) {
switch ($value) {
case 'url':
$data[$name] = strpos($data[$name], 'http://') === 0 ? $data[$name] : 'http://'.$data[$name];
break;
case 'intval':
$data[$name] = intval($data[$name]);
break;
}
}
}
}
}
if ($fields) {
$post = [];
$this->myfields = $fields;
foreach ($fields as $fid => $field) {
$obj = \Phpcmf\Service::L('Field')->get($field['fieldtype']);
if (!$obj) {
unset($fields[$fid]);
continue; }
if (!IS_ADMIN) {
if (!$field['ismember']) {
unset($fields[$fid]);
continue; } elseif ($field['setting']['validate']['isedit'] && $this->id && $old[$field['fieldname']] && !defined('IS_MODULE_VERIFY')) {
unset($fields[$fid]);
continue; } elseif ($field['setting']['show_member'] && array_intersect(\Phpcmf\Service::C()->member['groupid'], $field['setting']['show_member'])) {
unset($fields[$fid]);
continue; }
}
$name = $field['fieldname']; $validate = $field['setting']['validate']; $validate['xss'] = !isset($validate['xss']) || $obj->close_xss ? 1 : $validate['xss'];
$post[$name] = $value = $validate['xss'] ? $data[$name] : \Phpcmf\Service::L('Security')->xss_clean($data[$name]);
$frt = $obj->check_value($field, $value);
if ($frt) {
return [[], ['name' => $name, 'error' => $frt]];
}
if (!IS_ADMIN && $field['fieldtype'] != 'Group' && $validate['required']) {
if ($value == '') {
return [[], ['name' => $name, 'error' => $validate['errortips'] ? $validate['errortips'] : dr_lang('%s不能为空', $field['name'])]];
} elseif ($field['fieldtype'] == 'Linkage' && !$value) {
return [[], ['name' => $name, 'error' => $validate['errortips'] ? $validate['errortips'] : dr_lang('%s不能为空', $field['name'])]];
}
if (!is_array($value) && $validate['pattern'] && !preg_match($validate['pattern'], $value)) {
return [[], ['name' => $name, 'error' => $field['name'].':'.($validate['errortips'] ? $validate['errortips'] : dr_lang('格式不正确'))]];
}
}
if ($field['fieldtype'] == 'Ueditor' && strlen($data[$name]) > 1000000) {
return [[], ['name' => $name, 'error' => dr_lang('%s长度超限', $field['name'])]];
}
if ($validate['check']) {
if (strpos($validate['check'], '_') === 0) {
$method = substr($validate['check'], 1);
if (method_exists($this, $method)) {
if ('check_member' == $method && $value == 'guest') {
} else {
$rt = call_user_func_array(array($this, $method), [$value, $data, $old]);
if (!$rt['code']) {
return [[], ['name' => $name, 'error' => $rt['msg']]];
}
}
} else {
log_message('error', "校验方法 $method 不存在".FC_NOW_URL);
}
} else {
$func = $validate['check'];
if (function_exists($func)) {
$rt = call_user_func_array($func, [$value, $data, $old]);
if (!$rt['code']) {
return [[], ['name' => $name, 'error' => $rt['msg']]];
}
} else {
log_message('error', "校验函数 $func 不存在!".FC_NOW_URL);
}
}
}
if ($validate['filter']) {
if (strpos($validate['filter'], '_') === 0) {
$method = substr($validate['filter'], 1);
if (method_exists($this, $method)) {
$post[$name] = call_user_func_array(array($this, $method), [$value, $data, $old]);
} else {
log_message('error', "过滤方法 $method 不存在!".FC_NOW_URL);
}
} else {
$func = $validate['filter'];
if (function_exists($func)) {
$post[$name] = call_user_func_array($func, [$value, $data, $old]);
} else {
log_message('error', "过滤函数 $func 不存在!".FC_NOW_URL);
}
}
}
if ($field['ismain'] && $field['setting']['option']['unique']) {
if (\Phpcmf\Service::C()->init['table']) {
$table = \Phpcmf\Service::M()->dbprefix(\Phpcmf\Service::C()->init['table']);
if (\Phpcmf\Service::M()->db->fieldExists($name, $table)) {
$rt = \Phpcmf\Service::M()->db->table(\Phpcmf\Service::C()->init['table'])->where('id<>', $this->id)->where($name, $post[$name])->countAllResults();
if ($rt) {
return [[], ['name' => $name, 'error' => dr_lang('%s已经存在', $field['name'])]];
}
} else {
log_message('error', "字段唯一性验证失败:表".$table."中字段".$name."不存在!".FC_NOW_URL);
}
} else {
log_message('error', "字段唯一性验证失败:数据表不存在!".FC_NOW_URL);
}
}
}
$attach['add'] = $attach['del'] = [];
foreach ($fields as $field) {
$obj = \Phpcmf\Service::L('Field')->get($field['fieldtype'], $this->id, $post);
if (!$obj) {
continue; }
$obj->insert_value($field); if (SYS_ATTACHMENT_DB) {
list($add_id, $del_id) = $obj->attach(
\Phpcmf\Service::L('Field')->data[$field['ismain']][$field['fieldname']],
$old[$field['fieldname']]
);
$attach['add'] = $add_id ? array_merge($add_id, $attach['add']) : $attach['add'];
$attach['del'] = $del_id ? array_merge($del_id, $attach['del']) : $attach['del'];
}
}
$data = \Phpcmf\Service::L('Field')->data;
}
#print_r($data);exit;
return [$data, [], $attach];
}
public function get_mobile_code($phone) {
return \Phpcmf\Service::L('cache')->init()->get('phone-code-'.$phone);
}
public function set_mobile_code($phone, $code) {
return \Phpcmf\Service::L('cache')->init()->save('phone-code-'.$phone, $code, 60);
}
public function check_captcha($id) {
if (IS_API_HTTP && defined('SYS_API_CODE') && !SYS_API_CODE) {
return true;
}
$data = \Phpcmf\Service::L('input')->post($id);
if (!$data) {
return false;
}
$code = \Phpcmf\Service::C()->session()->get('captcha');
if (strtolower($data) == strtolower($code)) {
\Phpcmf\Service::C()->session()->remove('captcha');
return true;
}
return false;
}
public function check_captcha_value($data) {
if (IS_API_HTTP && defined('SYS_API_CODE') && !SYS_API_CODE) {
return true;
} elseif (!$data) {
return false;
}
$code = \Phpcmf\Service::C()->session()->get('captcha');
if (strtolower($data) == strtolower($code)) {
return true;
}
return false;
}
public function check_phone($value) {
if (!$value) {
return false;
} elseif (!is_numeric($value)) {
return false;
} elseif (strlen($value) != 11) {
return false;
}
return true;
}
public function check_email($value) {
if (!$value) {
return false;
} elseif (!preg_match('/^[\w\-\.]+@[\w\-\.]+(\.\w+)+$/', $value)) {
return false;
} elseif (strpos($value, '"') !== false || strpos($value, '\'') !== false) {
return false;
}
return true;
}
public function check_username($value) {
if (!$value) {
return false;
} elseif (\Phpcmf\Service::C()->member_cache['register']['preg']
&& !preg_match(\Phpcmf\Service::C()->member_cache['register']['preg'], $value)) {
return false;
} elseif (\Phpcmf\Service::C()->member_cache['register']['notallow']
&& in_array($value, \Phpcmf\Service::C()->member_cache['register']['notallow'])) {
return false;
} elseif (strpos($value, '"') !== false || strpos($value, '\'') !== false) {
return false;
}
return true;
}
public function check_member($value) {
if (!$value) {
return dr_return_data(0, dr_lang('账号不能为空'));
} elseif (!\Phpcmf\Service::M('member')->uid($value)) {
if (IS_ADMIN && isset($_POST['no_author']) && $_POST['no_author']) {
return dr_return_data(1);
}
return dr_return_data(0, dr_lang('账号【%s】不存在', $value));
}
return dr_return_data(1);
}
}