safan-form/form-manager

1.0.1 2016-08-11 20:21 UTC

This package is not auto-updated.

Last update: 2024-09-23 14:38:56 UTC


README

saafan框架中用于管理和构建表单的表单管理器。

要求

PHP > 5.4.0

安装

如果你在你的项目的依赖项中使用Composer,请在你的"composer.json"中添加以下内容

"require": {
    "safan-form/form-manager": "1.*"
}

更新模块配置列表 - safan-framework-standard/application/Settings/modules.config.php

<?php
return [
    // Safan Framework default modules route
    'Safan'         => 'vendor/safan-lab/safan/Safan',
    'SafanResponse' => 'vendor/safan-lab/safan/SafanResponse',
    // Write created or installed modules route here ... e.g. 'FirstModule' => 'application/Modules/FirstModule'
    'FormManager' => 'vendor/safan-form/form-manager/FormManager',
];

添加配置 - safan-framework-standard/application/Settings/main.config.php

<?php
'init' => [
    'form' => [
        'class'  => 'FormManager\FormManager',
        'method' => 'init',
    ]
]

用法

在Safan处理器中通过名称'formManager'初始化FormManager,要使用此类,调用例如。

$formManager = Safan::handler()->getObjectManager()->get('formManager');

要声明表单类型,你可以使用...

$form = $formManager->generateForm(new YourCustomForm());

要使用FormManager,首先你需要在你的模块中声明一个在命名空间'Form'中的类,该类扩展FormType类,这是包含表单凭证的类。FormType是默认类,其命名空间为FormManager/Type/FormType。例如。

<?php

namespace Main\Modules\Main\Form;

use FormManager\Type\FormType;
use FormManager\Builder\FormBuilderInterface;

class ContactType extends FormType
{

    public function buildForm(FormBuilderInterface $builder)
    {
        $builder->addAction('/')
                ->add('name', '', [
                                    'label' => 'Name',
                                    'attr' => ['class' => 'form-control', 'required' => 'required'],
                                    'validation' => ['min' => 5]
                                ]
                )
                ->add('email', 'email', [
                                            'label' => 'Email',
                                            'attr' => ['class' => 'form-control', 'required' => 'required'],
                                            'validation' => [
                                                'min' => 5,
                                                'message' => 'Incorrect email address.',
                                                'callback' => function($email) {
                                                    return preg_match("/^[a-z0-9_-]{1,20}@(([a-z0-9-]+\.)+(com|net|org|mil|"."edu|gov|arpa|info|biz|inc|name|[a-z]{2})|[0-9]{1,3}\.[0-9]{1,3}\.[0-"."9]{1,3}\.[0-9]{1,3})$/is", $email);
                                                }
                                            ],
                                        ]
                )
                ->add('body', 'textarea', [
                                            'label' => 'Body',
                                            'attr' => ['class' => 'contactTextarea form-control', 'style' => 'height:100px;resize: none;' ,'id' => 'myCustomIdForTextarea'],
                                            'validation' => ['min' => 5]
                                        ]
                )
                ->add('submit', 'submit', [
                                            'attr' => ['class' => 'btn btn-primary col-md-12 col-sm-12 col-xs-12', 'value' => "Send"]
                                        ]
                )
                ->addMethod('post')
                ->addEnctype('multipart/form-data');
    }

    public function getName()
    {
        return 'contact';
    }
}

你的FormType类必须声明两个抽象方法 --- 'buildForm()' 和 'getName()'。第一个方法 - 'buildForm()' 依赖于FormBuilder $builder,它构建表单字段。第二个方法 - 'getName()' 返回表单的名称,你可以在Form类中获取。

对于任何类型的字段,你都可以声明'validation',这将由FormValidation类在初始化时进行验证。现在支持'min'、'max'和'callback'验证,但你可以通过扩展Validation类并在此类中声明自定义方法来添加自定义类型。

'callback'必须返回布尔类型。对于'type' 'min'和'max',有默认的'messages',但你可以通过在'validation'数组中添加'message'类型来声明自定义消息。

视图

要在视图中构建表单,你可以使用...(例如,在我们的示例中,我们使用bootstrap类在bootstrap视图中构建表单,但你可以使用你自己的类或另一个前端框架)

<div class="col-sm-6 mt15">
    <form action="<?= $form->action() ?>" method="<?= $form->method() ?>" enctype="<?= $form->enctype() ?>">
        <?= $form->formErrors(); ?>
        <div class="row">
            <div class="col-sm-12 mb20">
                <div class="form-group">
                    <?= $form->row($form->name()); ?>
                </div>
                <div class="form-group">
                    <?= $form->row($form->email()); ?>
                </div>
                <div class="form-group">
                    <?= $form->row($form->body()); ?>
                </div>

                <div class="form-group">
                    <?= $form->row($form->submit()); ?>
                </div>
            </div>
        </div>
    </form>1
</div>

每个字段都是使用在buildForm方法中声明的此字段名称声明的。

如果验证数据后你在控制器中验证表单,错误部分就会生效。

$formData = $form->getPostData();

if($form->isValid($formData)) {
    /// ...
}

如果有错误,错误消息将显示在每个声明的验证字段的底部。