`

用cakephp的formhelper来增加表单

    博客分类:
  • php
阅读更多
一、关于这篇文章

    由于近期用cakephp开发一个boss后台,找了一下关于php方面的资料,自己添加一部分,记录下这篇文章。

二、基本的语法内容(摘录部分)

2.1  创建表单的开始和结束语句
$form->create(string $model = null, array $options = array())
$form->end( $options = NULL )

这个是一对form的开始和结尾方法,构成一个完整的form。
echo $form->create();
echo $form->end();


<form id="AddForm" method="post" action="/test/tests/add">
	<fieldset style="display:none;">
		<input type="hidden" name="_method" value="POST" />
	</fieldset>
</form>


当不带任何参数的时候,form->create生成了一个post方法的action为当前controller的add方法的form,并且生成了一个很奇怪的隐藏input,名字是_method,暂时还不知道是干啥子用的。form->end就生成了一个结尾。这显然不是我们所需要的。form->end负责着生成最后的提交按钮的说。

      所以我们最需要的形式是:
echo $form->create("",
	array(
	  "type"=>"get",
	  "id"=>"a",
	  "name"=>"b",
	  "onsubmit"=>"javascript:chk()",
	  "url"=>array(
	    'controller'=>'ControllerName',
	    'action'=>'ActionName',
	    '?'=>array(
	      "id"=>5,
	      "category"=>3,
	      "category2"=>5
	    )
	  )
	)
     );
echo $form->end("提交");


<form id="a" name="b" onsubmit="javascript:chk()" method="post" action="/test/ControllerName/ActionName?id=5&amp;amp;category=3&amp;amp;category2=5">
<fieldset style="display:none;">
<input type="hidden" name="_method" value="DELETE" />
</fieldset>
<div class="submit">
<input type="submit" value="提交" />
</div>
</form>



在上面的例子里面,type=“get”的时候,不会生成对应的<fieldset>里面的隐藏域,其他的“post、put、 delete ” 都会生成这个很奇怪的隐藏域,不知道到底是做啥子用途的。get的时候method会是get,其他的时候都是post,只不过隐藏域会有所不同。还有这个form的url生成的参数的时候,“&”会被2次转义成“&amp;amp;”。很是奇怪的说。

对于上传附件表单,里面还增加 ‘ENCTYPE’=>’multipart/form-data’ 选项。

这个form的结束语句还可以写成下面的形式,可以定制的选项就更多了。
这个form的结束语句还可以写成下面的形式,可以定制的选项就更多了。

echo $form->end(
  array(
    'label' => '提交',
    'name' => 'Whatever',
    'div' => array(
      'class' => 'good'
    )
  )
);


<div class="good">
    <input type="submit" name="Whatever" value="提交" />
  </div>
</form>


2.2、输入input

echo $form->input('birthday',
    array(
        'name'=>'birthday_name',
        'id'=>'birthday_id_overwrite',
        'label' => '生日',
        'value'=>"20090310"
    )
);


<div class="input text">
  <label for="birthday_id_overwrite">生日</label>
  <input name="birthday_name" type="text" id="birthday_id_overwrite" value="20090310" /></div>

这个里面主要的是第一个参数id,会生成input的id,而且默认的name是data[id],会涉及到以后的取值问题哦。label就是 input前面的字了,对于非英文状态的页面很是管用,在第二个array中的id和name都是可以指定的。这个需要注意。还可以指定 maxLength="3"使之获得最大长度的属性。



echo $form->input('birthday');



<div class="input text">
    <label for="birthday">Birthday</label>
    <input name="data[birthday]" type="text" value="" id="birthday" />
</div>


输入框不含lable、div
echo $form->input('birthday', array('lable'=>false,'div'=>false));


    <input name="data[birthday]" type="text" value="" id="birthday" />


2.3、输入password


echo $form->input('password',array('value'=>'fdsa','label'=>'邪门的密码框'));

<div class="input text">
   <label for="password">邪门的密码框</label>
    <input name="data[password]" type="text" value="fdsa" id="password" />
</div>

         这个东东有够邪门的,单独运行还不行。而出现的普通的输入框, 可以选择

    1、放在form->create和end中间,并且在create中指定了第一个参数,从第二个参数中指定id或者name覆盖第一个参数都不行。是不是很邪门。

    2、或者单独运行的话,用type=>’password’来强制变成password类型,不期待他的自动识别。

注:自动识别的话,需要设置第一个参数为 ‘psword’, ‘passwd’, ‘password’ 三个中的某个值,还不一定会识别成功。hoho。真是崩溃。



echo $form->create('123',array('name'=>'456','id'=>'123'));
echo $form->input('password',array('value'=>'fdsa','label'=>'邪门的密码框'));
echo $form->end();


<form name="456" id="123" method="post" action="/test/123s/add">
    <fieldset style="display:none;">
        <input type="hidden" name="_method" value="POST" />
    </fieldset>
    <div class="input password">
        <label for="123Password">邪门的密码框</label>
        <input type="password" name="data[123][password]" value="fdsa" id="123Password" />
    </div>
</form>

2.4、输入textarea
echo $form->input('textarea');
echo $form->input('textarea',array('rows' => '5', 'cols' => '5'));
echo $form->input('textarea',array('type' =>'textarea'));
echo $form->input('textarea',array('cols' null,'rows'=>null,'type'=>'textarea'));

<div class="input text">
    <label for="textarea">Textarea</label>
    <input name="data[textarea]" type="text" value="" id="textarea" />
</div>
<div class="input text">
    <label for="textarea">Textarea</label>
    <textarea name="data[textarea]" cols="5" rows="5" id="textarea" >
    </textarea>
</div>
<div class="input textarea">
    <label for="textarea">Textarea</label>
    <textarea name="data[textarea]" cols="30" rows="6" id="textarea" ></textarea>
</div>
<div class="input textarea">
    <label for="textarea">Textarea</label>
    <textarea name="data[textarea]" cols="" rows="" id="textarea" >
</textarea>

     这个里面和password一样,只写一个参数的时候,识别不出来,出来的是普通的input。而强制制定了type=textarea后,将能正确识别,或者指定rows或者cols中的某个值,也是能识别出来的。但是我的习惯是不写rows和cols,而是通过css指定其高度宽度什么的。所以,就出现了最后的那中写法,先清空rows和cols,再指定type。hoho。到现在为止,我觉得有必要的话,需要重写个formhelper了。

2.5、上传文件框file


echo $form->input('file_upload',array('type'=>'file','label'=>false,'div'=>false));

文件上传的框框,我可不喜欢有label和div跟着,设置label和div都为false,就没有对应的输出了。真是不错的主意。其他的里面也可以用这个办法去掉默认的label和div。这个是很常用的。


<input type="file" name="data[file_upload]" value="" id="file_upload" />

2.6、下拉框select



echo $form->input('field', array('options' => array(1,2,3,4,5),'label'=>false,'div'=>'false));



<select name="data[field]" id="field">
<option value="0">1</option>
<option value="1">2</option>
<option value="2">3</option>
<option value="3">4</option>
<option value="4">5</option>
</select>


不过这种写法没有办法指定value,所以要改进一下。增加options,value=>text。


echo $form->input(
    'field',
    array(
        'options' => array(
            '5'=>'北京',
            '10'=>'唐山',
            '18'=>'上海',
            '30'=>'美国'
        ),
        'label'=>false,
        'div'=>false,
        'onchange'=>'javascript:alert(this.value)'
    )
);

<select name="data[field]" onchange="javascript:alert(this.value)" id="field">
<option value="5"> 北京</option>
<option value="10">唐山</option>
<option value="18">上海</option>
<option value="30">美国</option>
</select>

当然可以增加个选项,’multiple’=>true 或者 ‘multiple’=>’multiple’ 使之变成多选。


echo $form->input(
    'field',
    array(
        'options' => array(
            '5'=>'北京',
            '10'=>'唐山',
            '18'=>'上海',
            '30'=>'美国'
        ),
        'label'=>false,
        'div'=>false,
        'multiple'=>true
    )
);


    当没有options的时候,可以强制’type’=>’select’使之呈现为下拉框。



1.echo $form->input(
    'field',
    array(
        'type'=>'select',
        'label'=>false,
        'div'=>false
    )
);


当然还可以指定’selected’=>options中的vlaue值,使select有默认值,这个函数也很不错,不用自己写循环了。 hoho~。官方还出了个专门用于select制定默认值的参数。 ‘default’=>value ,例如下例中的’selected’=>18就可以是’default’=>18,所以貌似这个参数也是个垃圾参数。

default可以用于radio、select。但是selected不可以用于radio,但是可以用于select和 Cakephp特有的时间类型。



echo $form->input(
    'field',
    array(
        'options' => array(
            '5'=>'北京',
            '10'=>'唐山 ',
            '18'=& gt;'上海',
            '30'=>'美国'
        ),
        'selected'=>18,
        'label'=>false,
        'div'=>false
    )
);


官方对于select还有个垃圾参数选项,叫做empty。用于设置每个select的最开始的那个“请选择”的空值的option,但是完全可以通过设置options的第一个值为”=>’请选择’来达到同样的效果,并且官方提供的empty选项还会替换options中的值为空的 option,如:


echo $form->input(
    'field',
    array(
        'options' => array(
            '5'=>'北京',
            ''=>'请选择',
            '10'=>'唐山',
            '18'=>'上海',
            '30'=>'美国'
        ),
        'selected'=>18,
        'label'=>false,
        'div'=>false,
        'empty'=>'chooseone'
    ));



<select name="data[field]" id="field">
<option value="5"> 北京</option>
<option value="">chooseone</option>
<option value="10">唐山</option>
<option value="18" selected="selected">上海</option>
<option value="30">美国</option>
</select>

2.7、单选框radio

单选框radio和select的写法基本上一致,就是type=‘radio’就行了。所有属性几乎一致。



echo $form->input(
    'field',
    array(
        'options' => array(
            '5'=>'北京',
            '10'=>'唐山',
            '18'=>'上海',
            '30'=>'美国'
        ),
        'type'=>'radio',
        'default'=>10,
                  'legend'=>false,
        'div'=>false,
        'onchange'=>'javascript:alert(this.value)'
    )
);

和select相比,radio能使用default,不能使用selected、multiple、empty。而且对于radio,label 一定不要false掉,label在选择东西的时候还是很有用途的。

对于“legend”选项,当不设为false的时候会多个<fieldset><legend>Field</legend>……</field>出来,很是令人崩溃。

2.8、多选框checkbox

多选框和其他的东东很不一样,居然不是通过设置type来获得的,居然是通过设置select的multiple属性来获得的。而且最终出来的代码也不是很理想,有着多余的div,并且js事件也无法获得。所以到时候也许需要对应的css和js进行控制了。


echo $form->input(
    'field',
    array(
        'options' => array(
            '5'=>'北京',
            '10'=>'唐山',
            '18'=>'上海',
            '30'=>'美国'
        ),
        'type'=>'select',
        'multiple'=>'checkbox',
        'default'=>array("5","18"),
        'label'=>false,
        'div'=>false
    )
);


<input type="hidden" name="data[field]" value="" />
 
<div class="checkbox">
<input type="checkbox" name="data[field][]" checked="checked" value="5" id="Field5" />
<label for="Field5" class="selected">北京</label>
</div>
 
<div class="checkbox">
<input type="checkbox" name="data[field][]" value="10" id="Field10" />
<label for="Field10">唐山</label>
</div>
 
<div class="checkbox">
<input type="checkbox" name="data[field][]" checked="checked" value="18" id="Field18" />
<label for="Field18" class="selected">上海</label></div>
 
<div class="checkbox">
<input type="checkbox" name="data[field][]" value="30" id="Field30" />
<label for="Field30">美国</label>
</div>

而且会生成个多余的hidden东东,很奇怪的说。

2.9、隐藏域hidden


echo $form->input(
    '',
    array(
        'type'=>'hidden',
        'id'=>'test_id',
        'name'=>'test_name',
        'value'=>'test_value',
        'label'=>false,
        'div'=>false
    )
);

<input type="hidden" name="test_name" id="test_id" value="test_value" />

2.10、提交按钮submit



echo $form->submit('提交',array("div"=>false));


<input type="submit" value="提交" />

图像组成的submit


echo $form->button('',array('type'=>'image','src'=>'test.jpg'));


<input type="image" value="" src="test.jpg" />

普通按钮button


echo $form->button('按钮',array('class'=>'class_name'));

<input type="button" value="按钮" class="class_name" />
分享到:
评论

相关推荐

    CakePHP创建验证器

    使用CakePHP框架如何创建验证器的文档。验证器可以通过在控制器中加入以下代码被创建,一旦创建了验证器,我们就可以使用验证器实例验证数据。

    PHP的框架之CakePHP-CakePHP教程

    打包下载,里面有CakePHP的框架源码,下载后可直接使用,版本是1.1的,稳定版;CakePHP的分页组件源码;CakePHP的中文及英文教程,CHM格式;CakePHP的中文打印版教程,WORD格式,下载后可直接打印,方便的;CakePHP...

    用cakephp实现的商城系统

    用cakephp实现的简单商城系统,有基本的商城管理功能和会员注册管理功能,代码简洁易懂,直接输入http://域名/install.php一键安装成功,简单快捷。此商城系统是一个比较典型的cakephp案例,比较适合一些有意学习...

    cakephp php-framework

    There are two main ways to get a fresh copy of CakePHP. You can either download an archive copy (zip/tar.gz/tar.bz2) from the main website, or check out the code from the git repository. To download ...

    PHP的框架之CakePHP-CakePHP教程终极教程

    打包下载,里面有CakePHP的框架源码,下载后可直接使用,版本是1.1的,稳定版;CakePHP的分页组件源码;CakePHP的中文及英文教程,CHM格式;CakePHP的中文打印版教程,WORD格式,下载后可直接打印,方便的;CakePHP...

    cakephp 框架

    cakephp 框架 cakephp 框架 cakephp 框架 cakephp 框架 cakephp 框架

    cakephp 3.0 使用总结

    一些cakephp3.0 的使用总结

    CakePHP 3.4 开发手册文档 CakePHP Cookbook Documentation Release 3.4

    CakePHP 3.4 开发手册文档 CakePHP Cookbook Documentation Release 3.4

    CakePHP php框架 v3.7.0 beta1.zip

    在cakephp.org站点的Sites in the wild页面可以看到当前使用CakePHP框架的网站列表。 CakePHP 是一个运用了诸如ActiveRecord、Association Data Mapping、Front Controller和MVC等著名设计模式的快速开发框架。该...

    Beginning CakePHP:From Novice to Professional

    Lead you from a basic setup of CakePHP to building a couple applications that will highlight CakePHPs functionality and capabilities without delving too deeply into the PHP language, but rather ...

    cakephp分页.docx

    cakephp分页,cakephp框架的分页的方法的文档,是cakephp框架的内容。

    CakePHP php框架 v3.8.5

    在cakephp.org站点的Sites in the wild页面可以看到当前使用CakePHP框架的网站列表。CakePHP 是一个运用了诸如ActiveRecord、Association Data Mapping、Front Controller和MVC等著名设计模式的快速开发框架。该项目...

    CakePHP php框架 v3.7.8.zip

    在cakephp.org站点的Sites in the wild页面可以看到当前使用CakePHP框架的网站列表。 CakePHP 是一个运用了诸如ActiveRecord、Association Data Mapping、Front Controller和MVC等著名设计模式的快速开发框架。该...

    cakephp-containable行为behaviour

    join ‘other model’ 来指定具体的关联模型进行自定义查询 如果不需要关联数据的情况就不使用join方法 这样就避免了上面问题的产生 2:cakephp中虽然对模型的操作方法中并没有提供像上面提到的连贯方法 但是cake...

    CakePHP的blog例子(增加了分类功能)

    3、相对于原例子增加了以下文件: cakePHP\app\controllers\categories_controller.php cakePHP\app\models\category.php cakePHP\app\views\categories文件夹及其内文件 cakePHP\app\views\posts\view_in_category....

    CakePHP的blog例子(增加了后台功能,嵌入了TinyMCE编辑器)

    CakePHP的blog例子(增加了后台功能,嵌入了TinyMCE编辑器) 我的新博客http://www.cakesns.cn

    最简单的方法来安装CakePHP

    最简单的方法来安装CakePHP

    cakephp的CMS教程

    是cakephp框架的内容,用cakephp开发了一个的简单的CMS系统教程。

    cakephp--使用_CakePHP_的_Session_和_Request_Handler_组件

    cakephp--使用_CakePHP_的_Session_和_Request_Handler_组件

    CakePHP 框架模板 v2.02

    CakePHP是一个用PHP编写的开源Web应用框架,不过其模型是用Ruby on Rails设计的。作为PHP世界的Rails,CakePHP采纳了RoR的许多优秀特性,成熟度较高。

Global site tag (gtag.js) - Google Analytics