⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form.cpp

📁 C++ web POSIX framewark
💻 CPP
字号:
#include "form.h"#include "util.h"#include <boost/format.hpp>#include <iostream>#include "cppcms_error.h"namespace cppcms {base_form::~base_form(){}void form::append(base_form *ptr){	elements.push_back(ptr);	}bool form::validate(){	bool valid=true;	for(list<base_form *>::iterator p=elements.begin(),e=elements.end();p!=e;++p)	{		bool val=(*p)->validate();		valid = valid && val;	}	return valid;}void form::clear(){	for(list<base_form *>::iterator p=elements.begin(),e=elements.end();p!=e;++p)	{		(*p)->clear();	}}void form::load(cgicc::Cgicc const &cgi){	for(list<base_form *>::iterator p=elements.begin(),e=elements.end();p!=e;++p)	{		(*p)->load(cgi);	}}string form::render(int how){	string output;	for(list<base_form *>::iterator p=elements.begin(),e=elements.end();p!=e;++p) {		output+=(*p)->render(how);	}	return output;}widgetset::~widgetset(){}string widgetset::render(int how){	string out;	for(widgets_t::iterator p=widgets.begin(),e=widgets.end();p!=e;++p) {		out+=(*p)->render(how);	}	return out;}widgetset::widgetset(){	widgets.reserve(10);}namespace widgets {base_widget::base_widget(string _id,string m) : name(_id), msg(m){		is_set=false;	is_valid=true;}void base_widget::clear(){	is_set=false;}bool base_widget::validate(){	is_valid=true;	return true;}string base_widget::render(int how){	string out;	string input=render_input(how);	string error;	if(name.empty()) {		throw cppcms_error("widgets::base_widget undefine name");	}	switch(how & error_mask) {	case error_with:		error=render_error();		break;	case error_no:		break;	}	string tmp_msg;	if(!msg.empty()){		if(!id.empty()) {			tmp_msg+="<lablel for=\"";			tmp_msg+=id;			tmp_msg+="\">";			tmp_msg+=escape(msg);			tmp_msg+=":</label>";		}		else {			tmp_msg=escape(msg);			tmp_msg+=":";		}	}	string help_text;	if(!help.empty()) {		if((how & as_mask)==as_table)			help_text=				((how & as_xhtml) ? "<br/>" : "<br>") 				+ escape(help);		else			help_text=escape(help);	}			if(error.empty()) {		char const *frm=NULL;		switch(how & as_mask) {		case as_p: 			frm = "<p>%1% %2% %3%</p>\n";			break;		case as_table:			frm = "<tr><th>%1%</th><td>%2% %3%</td></tr>\n";			break;		case as_ul:			frm = "<li>%1% %2% %3%</li>\n";			break;		case as_dl:			frm = "<dt>%1%</dt>\n<dd>%2% %3%</dd>\n";			break;		case as_space:			frm = "%1% %2% %3%\n";			break;		}		assert(frm);		out=(boost::format(frm) % tmp_msg % input % help_text).str();	}	else {		char const *frm=NULL;		switch(how & as_mask) {		case as_p: 			frm = "<p>%3%</p>\n<p>%1% %2% %4%</p>\n";			break;		case as_table:			frm = "<tr><th>%1%</th><td>%3% %2% %4%</td></tr>\n";			break;		case as_ul:			frm = "<li>%3% %1% %2% %4%</li>\n";			break;		case as_dl:			frm = "<dt>%3% %1%</dt>\n<dd>%2% %4%</dd>\n";			break;		case as_space:			frm = "%3% %1% %2% %4%\n";			break;		}		assert(frm);		error="<span class=\"formerror\">" + error + "</span>";		out=(boost::format(frm) % tmp_msg % input % error % help_text).str();	}	return out;}string base_widget::render_error(){	if(!is_valid) {		if(error_msg.empty()) {			return "*";		}		return escape(error_msg);	}	return "";}string text::render_input(int how){	string out="<input type=\"" + type +"\" name=\"";	out+=name;	out+="\"";	if(!id.empty()) {		out+=" id=\"";		out+=id;		out+="\"";	}	if(is_set) {		out+=" value=\"";		out+=escape(value);		out+="\"";	}	if(how & as_xhtml)		out+=" />\n";		else		out+=" >\n";		return out;}void text::load(cgicc::Cgicc const &cgi){	cgicc::const_form_iterator v=cgi.getElement(name);	if(v!=cgi.getElements().end()) {		value=**v;		is_set=true;	}}bool text::validate(){	if(!is_set)		is_valid=false;	else		if(value.size()<low || (high>=0 && value.size()>(unsigned)high)) {			is_valid=false;		}		else			is_valid=true;	return is_valid;}string &text::str(){	is_set=true;	return value;}void text::set(string const &s){	is_set=true;	value=s;}string const &text::get(){	return value;}string textarea::render_input(int how){	char const *frm=NULL;	string sid;	if(!id.empty())		sid=" id=\"" + id +"\"";	if(!is_set)		frm="<textarea%3% name=\"%1%\" %2%></textarea>\n";	else		frm="<textarea%4% name=\"%1%\" %2%>%3%</textarea>\n";	string format;	if(rows!=-1 && cols!=-1)		format=(boost::format("rows=\"%d\" cols=\"%d\"") % rows % cols).str();	if(is_set)		return (boost::format(frm) % name % format % escape(value) % sid).str();	return (boost::format(frm) % name % format % sid).str();}string checkbox::render_input(int how){	string out="<input type=\"checkbox\" name=\"";	out+=name;	out+="\" value=\"";	out+=escape(input_value);	out+="\"";	if(is_set && value)		out+=" checked=\"checked\"";	if(!id.empty())		out+=" id=\""+id+"\"";	if(how & as_xhtml)		out+=" />";	else		out+=" >";	return out;}void checkbox::load(cgicc::Cgicc const &cgi){	cgicc::const_form_iterator p=cgi.getElements().begin(),e=cgi.getElements().end();	while(p!=e) {		if(p->getName()==name && p->getValue()==input_value) {			value=true;			return;		}		++p;	}	value=false;}bool regex_field::validate(){	if(!text::validate())		return false;	if(!exp)		throw cppcms_error("widgets::regex_field regular expression is not defined");	is_valid=boost::regex_match(value,*exp);	return is_valid;}boost::regex email::exp_email("^[^@]+@[^@]+$");void select_multiple::add(int v,string o,bool selected){	add((boost::format("%d") % v).str() ,o,selected);}set<int> select_multiple::geti(){	set<int> c;	for(set<string>::iterator p=chosen.begin(),e=chosen.end();p!=e;++p) {		c.insert(atoi(p->c_str()));	}	return c;}bool select_multiple::validate(){	int count=0;	if(!is_set) { is_valid=false; return false; };	is_valid=true;	for(set<string>::iterator p=chosen.begin(),e=chosen.end();p!=e;++p) {		if(available.find(*p)==available.end()) {			is_valid=false;			break;		}		count++;	}	if(min>0 && count < min)		is_valid=false;	return is_valid;}void select_multiple::add(string v,string o,bool selected){	available[v]=o;	if(selected) chosen.insert(v);}void select_multiple::load(cgicc::Cgicc const &cgi){	chosen.clear();	cgicc::const_form_iterator p=cgi.getElements().begin(),e=cgi.getElements().end();	for(;p!=e;++p) {		if(p->getName()==name) {			map<string,string>::iterator orig=available.find(p->getValue());			if(orig!=available.end()) 				chosen.insert(orig->first);		}	}	is_set=true;}string select_multiple::render_input(int how){	string out="<select multiple=\"multiple\" name=\"";	out+=name;	out+="\" ";	if(!id.empty())		out+="id=\""+id+"\" ";	out+=(boost::format(" size=\"%d\"") % size).str();	out+=">\n";	for(map<string,string>::iterator p=available.begin(),e=available.end();p!=e;++p) {		out+="<option value=\""+escape(p->first)+"\" ";		if(chosen.find(p->first)!=chosen.end())			out+=" selected=\"selected\" ";		out+=">";		out+=escape(p->second);		out+="</option>\n";	}	out+="</select>\n";	return out;}void select_multiple::clear(){	base_widget::clear();	chosen.clear();}void select_base::add(string v,string opt){	option o;	o.value=v;	o.option=opt;	select_list.push_back(o);}void select_base::add(int val,string opt){	add((boost::format("%d") % val).str(),opt);}void select_base::set(string v){	value=v;}void select_base::set(int v){	value=(boost::format("%d") % v).str();}string select_base::get(){	return value;}int select_base::geti(){	return atoi(value.c_str());}string select::render_input(int how){	string out="<select name=\"";	out+=name;	out+="\" ";	if(size!=-1)		out+=(boost::format(" size=\"%d\" ") % size).str();	if(!id.empty())		out+="id=\""+id+"\" ";	out+=">\n";	for(list<option>::iterator p=select_list.begin(),e=select_list.end();p!=e;++p) {		out+="<option value=\""+escape(p->value)+"\" ";		if(is_set && p->value==value)			out+=" selected=\"selected\" ";		out+=">";		out+=escape(p->option);		out+="</option>\n";	}	out+="</select>\n";	return out;}void select_base::load(cgicc::Cgicc const &cgi){	cgicc::const_form_iterator p=cgi.getElement(name);	if(p==cgi.getElements().end()) {		is_set=false;	}	else {		value=**p;		is_set=true;	}}bool select_base::validate(){	if(!is_set) {		is_valid=false;		return false;	}	for(list<option>::iterator p=select_list.begin(),e=select_list.end();p!=e;++p) {		if(value==p->value) {			is_valid=true;			return true;		}	}	is_valid=false;	return false;}string radio::render_input(int how){	string out="<div class=\"radio\" ";	if(!id.empty())		out+="id=\""+id+"\" ";	out+=">\n";	for(list<option>::iterator p=select_list.begin(),e=select_list.end();p!=e;++p) {		out+="<input type=\"radio\" value=\""+escape(p->value)+"\" ";		if(is_set && p->value==value)			out+=" checked=\"checked\" ";		out+="name=\"";		out+=name;		out+="\" ";		if(how & as_xhtml)			out+="/";		out+=">";		out+=escape(p->option);		if(add_br)			if(how & as_xhtml)				out+="<br/>";			else				out+="<br>";		out+="\n";	}	out+="</div>\n";	return out;}string hidden::render(int how){	string out="<input type=\"hidden\" name=\"";	out+=name;	out+="\" value=\"";	out+=escape(value);	out+="\" ";	if(!id.empty()) {		out+="id=\""+id+"\"";	}	if(how & as_xhtml)		out+=" />\n";	else		out+=" >\n";	return out;}bool password::validate(){	if(!text::validate())		return false;	if(other)		if(other->value!=value) {			is_valid=false;			return false;		}	return true;}string password::render_input(int how){	return (boost::format("<input type=\"password\" %1% name=\"%2%\" %3%>")		% ( id.empty() ? string("") : "id=\""+id+"\"" )		% name 		% ( (how & as_xhtml) ? "/" : "" )		).str();}string submit::render_input(int how){	return (boost::format("<input type=\"submit\" %1% name=\"%2%\" value=\"%3%\" %4%>")		% ( id.empty() ? string("") : "id=\""+id+"\"" )		% name 		% escape(value)		% ( (how & as_xhtml) ? "/" : "" )		).str();}void submit::load(cgicc::Cgicc const &cgi){	is_set=true;	cgicc::const_form_iterator v=cgi.getElement(name);	if(v!=cgi.getElements().end())		pressed=true;}} // Namespace widgets } // namespace cppcms

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -