龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

带同步令牌的表单工具包

时间:2014-07-22 14:52来源: 作者: 点击:
分享到:
话说深圳 2011 的大运会不是要来啦嘛,于是深大要开发一个志愿者服务站,我被团委抓去服役了。过程中写了一个小小的表单工具包。验证功能不是我自己实现的,依赖 Kohana_Validate(
话说深圳 2011 的大运会不是要来啦嘛,于是深大要开发一个志愿者服务站,我被团委抓去服役了。过程中写了一个小小的表单工具包。验证功能不是我自己实现的,依赖 Kohana_Validate(Kohana V3.0x 分支)。但是自己就按照 《J2EE 恶心模式》所说,弄了个同步令牌,防止重复提交表单。这个组件也设置了抽象层,我觉得可以把验证码也作为一个令牌子类整合。但是现在没时间弄,先把代码分享上来等被拍砖啦~

<?php
namespace Form;
use Volunteer\Form\AbstractForm;

class NewsPoster extends AbstractForm
{
	/**
	 * 添加所有预设表单元素
	 * 
	 * @abstract
	 */
	public function bindAllElement()
	{
		$this->bindToken('valid_token')
		     ->addElement('新闻标题', 'title', 
				array(
					'not_empty'  => null,
					'max_length' => array(60)
				), 
				array(
					'trim' => null,
					'htmlspecialchars' => array(ENT_QUOTES),
				))
		     ->addElement('缩略网址', 'urlName', 
				array(
					'max_length' => array(50),
					'regex' 	 => array('~^[a-zA-Z0-9\-%]+$~')
				), 
				array(
					'trim' => null,
					'urlencode' => null,
				))
		     ->addElement('关键字', 'keyWords', 
				array(
					'max_length' => array(100),
				), 
				array(
					'trim' => null,
					'htmlspecialchars' => array(ENT_QUOTES),
				))
		     ->addElement('新闻作者&记者', 'author', 
				array(
					'max_length' => array(60),
				), 
				array(
					'trim' => null,
					'htmlspecialchars' => array(ENT_QUOTES),
				))
		     ->addElement('新闻编辑', 'editor', 
				array(
					'max_length' => array(60),
				), 
				array(
					'trim' => null,
					'htmlspecialchars' => array(ENT_QUOTES),
				))
			 ->addElement('新闻来源', 'source', 
				array(
					'max_length' => array(60),
				), 
				array(
					'trim' => null,
					'htmlspecialchars' => array(ENT_QUOTES),
				))
			 ->addElement('新闻分类', 'category', 
				array(
					'not_empty' => null,
					'digit' 	=> null,
					'regex' => array('~^[1-9]\d*$~')
				), 
				array())
			 ->addElement('封面图片', 'cover_image', 
				array(),
				array(
					'trim' => null,
					'urlencode' => null,
				))
			 ->addElement('包含媒体信息', 'mediaTag', 
				array(
					'not_empty' => null,
					'digit' 	=> null,
					'regex' => array('~^[0123]$~')
				),
				array())
			 ->addElement('新闻概要', 'summary', 
				array(
					'max_length' 	=> array(255),
				),
				array(
					'trim' => null,
					'htmlspecialchars' => array(ENT_QUOTES),
				))
			 ->addElement('发布状态', 'state', 
				array(
					'not_empty'	=> null,
					'digit' 	=> null,
					'regex' 	=> array('~^[01]$~')
				),
				array())
			 ->addElement('“是否显示在首页”选项', 'showInHome', 
				array(
					'boolean'		=> null,
				),
				array())
			 ->addElement('新闻内容', 'content', 
				array(
					'not_empty'		=> null,
				),
				array(
					'tidy_parse_string' => array(
						array(
							'indent' 		=> true, 
							'output-xhtml' 	=> true, 
							'clean'			=> true, 
							'drop-font-tags'=> true, 
							'show-body-only'=> true
						), 'UTF8'),
					'trim' => null
				));
	}
}

3. [代码]控制器的调用     跳至 [2] [3] [全屏预览]

	public function action_GET()
	{
		// 获取 url 中的 ID
		$id = $this->request->param('id', null);
		
		// 将令牌送到视图层(放在表单的隐藏域)
		$this->view['token'] = Form\NewsPoster::getToken()->useToken();
	}
	
	public function action_POST()
	{
		$id = $this->request->param('id', null);
		
		$form = Form\NewsPoster::factory($_POST);
		$form->bindAllElement();
		
		if ($form->checkForm()) {
			// 验证通过,调用领域模型执行操作啦~
			$this->view['success'] = true;
		} else {
			$this->view['success'] = false;
			// 将错误信息送回视图层
			$this->view['message'] = array_values($form->getMessage());
		}
	}

4. [图片] 现场截图    

5. [图片] 现场截图    

6. [图片] 现场截图    

精彩图集

赞助商链接