最后更新于 .

用php有两个月了,说实话用惯了django,再用php开发真的有点郁闷,简单列一下,并非批评,仅为入门的同学少走弯路:

  1. 取不到post的数据 当url为如下形式:
    xx.com/?mod=x&act=y
    
    而method又为post的时候,post的数据会取不到;必须改成如下形式:
    xx.com?mod=x&act=y
    
  2. 字符串连接 这么写代码是会报错滴:
    echo 1."xx";
    
    必须这么写才行:
    echo 1 ."xx";
    
  3. require之后,不知道自己引入了些什么 这个地方,如果和C或者C++来比确实也没啥问题,关键是python的from x import y 的方式实在是让人赏心悦目,所以忍不住抱怨下。

OK,抱怨完了,言归正传。 其实这些问题都还好,仔细点都能解决,最让我不爽的是php的所有框架(不排除我孤陋寡闻,欢迎大家指教)居然都没有提供一个类似于django的form类。 心灰意冷之时,突然想起来之前看到过一个仿django的php框架,虽然整个框架还有很多问题,不过form类这部分应该完成了吧。 pluf:http://www.pluf.org/ 果然不出所料! 看过我之前博文的朋友应该都知道我把CodeIgniter的db访问类单独拆了出来(参见:抽离CodeIgniter的数据库访问类!),没错,这次我又做了同样的事情。 拆分的方法这里就不详细描述了,其实就是SafeString.php这个文件从别的目录拷贝过来,并且定义了一个pluf_form_inc.php来require所有文件。我们看一下独立之后的文件目录结构:

|~Form/
| |~Field/
| | |-Boolean.php
| | |-Date.php
| | |-Datetime.php
| | |-Email.php
| | |-File.php
| | |-Float.php
| | |-Integer.php
| | |-ReCaptcha.php
| | |-Slug.php
| | |-Url.php
| | `-Varchar.php
| |~Widget/
| | |~SelectMultipleInput/
| | | `-Checkbox.php
| | |-CheckboxInput.php
| | |-DatetimeInput.php
| | |-FileInput.php
| | |-HiddenInput.php
| | |-Input.php
| | |-PasswordInput.php
| | |-ReCaptcha.php
| | |-SelectInput.php
| | |-SelectMultipleInput.php
| | |-TextareaInput.php
| | |-TextInput.php
| | `-TinyMCEInput.php
| |-BoundField.php
| |-Field.php
| |-FieldProxy.php
| |-Invalid.php
| |-Model.php
| `-Widget.php
|-Form.php
|-pluf_form_inc.php
|-SafeString.php
`-test.php

OK,接着我们来写一个简单的测试代码:

require_once 'pluf_form_inc.php';

class MyApp_Form_Simple extends Pluf_Form
{
    public function initFields($extra=array())
    {
        $this->fields['name'] = new Pluf_Form_Field_Varchar(
            array('required' => true,
            'label' => __('List name'),
            'initial' => 'Here the name',
            'help_text' => __('For example: "Happy stuff".'),
        ));

        $this->fields['description'] = new Pluf_Form_Field_Varchar(
            array('required' => false,
            'label' => __('Description'),
            'widget' => 'Pluf_Form_Widget_TextareaInput',
            'widget_attrs' => array('rows' => 5,
            'cols' => 75),
        ));

        $this->fields['list'] = new Pluf_Form_Field_Varchar(
            array('required' => true,
            'label' => __('list'),
            'initial' => 1,
            'widget' => 'Pluf_Form_Widget_SelectInput',
            'widget_attrs' => array(
                'choices' => array(
                    array(
                        '所有'=>0,
                        '部分'=>1,
                    )
                ),
            )
        ));
    }
}
$form = new MyApp_Form_Simple(
    array(
        'name'=>'dantezhu',
        'list'=>1
    )
);

echo $form->render_p();
echo "\n";

echo var_export($form->isValid());
echo "\n";

echo $form->field('name')->labelTag();
echo "\n";
echo $form->field('name');
echo "\n";

echo var_export($form->clean(),true);

输出结果如下:

<p><label for="id_name">List name:</label> <input name="name" type="text" id="id_name" value="dantezhu" /> For example: "Happy stuff".</p>
<p><label for="id_description">Description:</label> <textarea cols="75" rows="5" name="description" id="id_description"></textarea></p>
<p><label for="id_list">list:</label> <select name="list" id="id_list">
<optgroup label="0">
<option value="0">所有</option>
<option value="1" selected="selected">部分</option>
</optgroup>
</select></p>
true
<label for="id_name">List name</label>
<input name="name" type="text" id="id_name" value="dantezhu" />
array (
  'name' => 'dantezhu',
  'description' => '',
  'list' => 1,
)

完全实现了django的form类一样的功能! 当然,相信大家也看到了,由于语言上的欠缺,php写出来的form定义要比python繁琐很多,但是总算是实现了,不错! 代码还是同往常一下,放在svn上提供下载: http://code.google.com/p/vimercode/source/browse/#svn%2Ftrunk%2Fpluf_form PS: 最近做了一套小型的支付系统,近期也会和大家分享一下

Pingbacks

Pingbacks已打开。

Trackbacks

引用地址

评论

  1. Eric

    Eric on #

    验证规则跟视图表现混在一起好像不太好吧?如果某个form要复用怎么办。而且貌似也没法做到对html的深度控制。

    Reply

    1. Dante

      Dante on #

      呃,对html深度控制这里是可以做到的,要配合模板来一起用~
      验证规则和视图混在一起,这一点怎么说呢,换个角度,这个form就是http的表单与php之间的适配层,这样考虑就会觉得合理很多。

      这样设计的好处可以看一下django的文档,节省了很多冗余代码。

      Reply

  2. francis

    francis on #

    就django的form类真的不如一些已有PHP框架的ActiveForm类好用;

    还有字符串输出,通常用 echo 1, 'hello world';

    Reply

    1. Dante

      Dante on #

      呃,用php时间不长,很多php的惯用用法还不熟。

      可能我孤陋寡闻了,不过django的form口碑还是不错的,你说的ActiveForm在google上貌似搜不到,方便给个链接地址?

      Reply

      1. francis

        francis on #

        表单的,比如 http://blog.csdn.net/yjj1s/archive/2010/07/18/5744279.aspx 这里。

        Reply

  3. 左旋360减肥咖啡

    左旋360减肥咖啡 on #

    看不太懂哎、、、、

    Reply

  4. 防爆灯

    防爆灯 on #

    还在学习 ,

    Reply

  5. seatle

    seatle on #

    就没有一个框架会缺少这个功能,只是你不知道而已

    Reply

    1. Dante

      Dante on #

      请指教。

      Reply

  6. Jam

    Jam on #

    PHP的框架我推荐Yii Framework,模块化组件化做的不错。http://www.yiiframework.com/

    不过我很讨厌在Python中使用Django Form或在PHP中使用像Yii 中的ZiiWidgets之类的东西(不得不说Yii的ZiiWidgets做得很强大)(另外Yii的WebForm功能也很强大)。
    我更喜欢亲手写HTML和JS代码,可控性更高,或许是因为自己更了解如何模块化前端HTML、JS代码的缘故,这些生成HTML的东西一看就不喜欢

    Reply

    1. Dante

      Dante on #

      据说yii确实不错,不过php用的少。。

      关于Form这里,其实我也是反对在大型项目里面用这种自动生成html,或者自动生成sql建表语句的组件的。
      不过Form这里,我主要是用他来做参数检查,要比自己去写一堆if else然后输出错误要简洁有效的多。

      Reply

  7. 7hao

    7hao on #

    其实基本上PHP框架里都有FORM类,比如CI的脚手架功能,都很贴心

    实在不行,自己实现一个

    这就是PHP的乐趣所在吧

    Reply

发表评论