jonob / formly
Laravel 4 的表单辅助工具
Requires
- php: >=5.3.0
README
Laravel 表单支持,带有 Twitter Bootstrap 样式。所有表单输入都使用 Laravel 的表单辅助器创建实际的 HTML。一些附加功能,如设置表单默认值,在验证失败后重新填充表单以及显示验证失败错误。
这里有 5 分钟的视频概述 使用 Formly。虽然这最初是为 Laravel 3 制作的,但概念保持一致。
安装
Composer
将 "jonob/formly": "dev-master", 添加到 composer.json 文件的 require 部分
"require": {
"jonob/formly": "dev-master"
},
现在运行 composer update。
Laravel
将以下代码添加到 app/config/app.php 文件的 providers 部分
'Jonob\Formly\FormlyServiceProvider',
将以下代码添加到 app/config/app.php 文件的 aliases 部分
'Formly' => 'Jonob\Formly\Formly',
使用方法
路由和控制器
首先,在您的路由/控制器中创建一个新的表单对象。这可以通过以下静态方法完成
$form = Formly::make();
或者您可以像这样实例化它
$form = new Formly();
然后按照以下方式将表单对象传递给视图。这意味着 Formly 将在您的视图中通过 $form 变量可用。
return View::make('posts.form')->with('form', $form);
表单
通常,Formly 在方法名称和函数参数方面遵循 Laravel 的默认表单辅助器。有两个例外。首先,所有方法都是非静态调用的,其次,Formly 中的第二个参数是输入的标签。例如
// Standard Laravel form input Form::text($name, $value, $attributes); // Formly $form->text($name, $label, $value, $attributes);
因为我们指定了方法中的标签名称,所以不需要在您的表单上单独有标签字段 - Formly 将自动为您生成它。
当涉及到打开您的表单时,您只需按照以下方式调用 open 方法。请注意,不需要指定操作 - 默认情况下,Formly 将向当前 URL 发送 POST 请求。当然,如果您愿意,可以覆盖此操作。
$form->open();
使用此方法的好处是会自动为您插入隐藏的 CSRF 令牌。如果您想的话,可以覆盖此操作。
设置表单值
使用 formly 设置默认值
如果您正在从现有数据填充您的表单(例如,如果您正在编辑数据库中的记录),则不需要为每个字段都这样做。让 Formly 按照以下方式为您完成所有工作
// Get the single post from the post model $post::find($post_id); // Pass the default values to Formly $form = Formly::make($post); // Create the view return View::make('posts.form')->with('form', $form);
为了使此操作生效,您的表单字段名称必须与数据库字段名称相同。如果不是相同的,那么 Formly 就不知道如何将两者连接起来。
如果您愿意,可以手动填充字段
// Pass the default values to Formly $form = Formly::make(array('start_date' => date('Y-m-d'))); // Create the view return View::make('posts.form')->with('form', $form);
为每个输入设置行内默认值
或者,您也可以在表单中为单个表单字段设置默认值。以这种方式设置的值将覆盖通过上述方法设置的默认值。
$form->text('start_date', 'Start Date', date('Y-m-d'));
通过 $_POST 设置默认值
这不是您要执行的操作 - Formly 会为您自动执行。例如,如果您尝试保存表单并且验证失败,则 Formly 将自动使用已提交的数据重新填充每个输入。
级联
根据上述内容,很明显有三种方法可以填充您的表单。优先级顺序如下
- 首先检查是否有输入的 post 数据
- 其次检查是否已行内设置值
- 最后检查是否设置了表单默认值
验证
Formly 可以非常轻松地与 Laravel 的验证库集成。让我们看看一个完整的例子。
// Controller public function edit($id) { $post = Post::find($id); if ( ! $post) { // do something. Maybe redirect or 404? } return View::make('posts.form') ->with('form', Formly::make($post)); } public function update() { $rules = array( 'name' => 'required|max:50', 'email' => 'required|email|unique:users', ); $validation = Validator::make($input = Input::get(), $rules); if ($validation->fails()) { return Redirect::to('posts/edit/' Input::get('id'))->withErrors($validation)->withInput(Input::get()); } return Redirect::to('posts'); }
注意,如果验证失败,则必须带错误信息和输入重定向。通过这样做,我们实现了两件事:
- 表单将自动用已提交的数据重新填充。
- 任何错误都会被突出显示(如果您已启用 Formly 的选项;见下文)
请注意,您不需要对表单做任何特殊操作 - 只需返回 withErrors() 和 withInput(),Formly 就知道该怎么做
提交按钮
创建一个提交按钮很简单
$form->submit('Save');
默认情况下,Formly 会添加 Twitter Bootstrap 的 'btn' 类。如果您想覆盖它,可以在第三个参数中做到这一点
$form->submit('Save', $attributes, 'some-class');
还有一些 Twitter Bootstrap 按钮样式的快捷方式
// create a button with a class of 'btn btn-primary' $form->submitPrimary('Save'); // and so on... $form->submitInfo('Save'); $form->submitSuccess('Save'); $form->submitWarning('Save'); $form->submitDanger('Save'); $form->submitInverse('Save');
Formly 选项
有几个选项允许您自定义 Formly 的工作方式。您可以在实例化类时或通过 setOption() 方法覆盖这些选项。请注意,setOption() 可以用来同时设置多个选项或单个选项。
$defaults = Post::find($id); $options = array( 'formClass' => 'form_vertical' ); // Set multiple options when the class is instantiated $form = Formly::make($defaults, $options); // Set multiple options using setOption() $form = Formly::make()->setOption($options); // Set a single option using setOption() $form = Formly::make()->setOption('formClass', 'form_vertical');
formClass(默认:form_horizontal)
默认情况下,表单使用 form-horizontal 样式,但您可以选择 Bootstrap 的其他样式,例如 form-vertical、form-inline、form-search
autoToken(默认:true)
自动将 csrf token 添加到 form_open 方法中
nameAsId(默认:true)
自动为每个字段创建一个基于字段名的 id
idPrefix(默认:field_)
如果启用了 name_as_id,则此字符串将被前缀到 id 属性
requiredLabel(默认:.req)
如果您想在表单上标识一个标签为必填字段,使用 formly,您只需将此字符串附加到标签参数中,Formly 就会自动使用 required_prefix、required_suffix 和 required_class
$form->text('start_date', 'Start Date.req');
requiredPrefix(默认:'')
如果已设置 required_label,则此变量的文本将作为标签的前缀
requiredSuffix(默认:' *')
如果已设置 required_label,则此变量的文本将添加到标签的末尾
requiredClass(默认:'label-required')
如果已设置 required_label,则此类将被添加到标签的属性中。如果您想使标签加粗,例如,您可以在 CSS 中对其进行样式设置
controlGroupError(默认:'error')
如果输入字段验证失败,则显示控制组的类
displayInlineErrors(默认:false)
如果字段已验证失败,则显示内联错误