jonob/formly

该软件包最新版本(v2.0.0)的许可证信息不可用。

Laravel 4 的表单辅助工具

v2.0.0 2014-10-22 10:12 UTC

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)

如果字段已验证失败,则显示内联错误