首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Zend Framework 3 Form Fieldset

Zend Framework 3 Form Fieldset
EN

Stack Overflow用户
提问于 2017-11-07 03:56:11
回答 2查看 1.6K关注 0票数 1

嗨,我对Zend-Framework3非常陌生,我正在练习OOP,我找不到关于用字段集和图例制作Zend表单的简单解释/教程。基本上,我试图在HTML中创建这样的内容:

代码语言:javascript
复制
<form name="my_name">
    <fieldset>
        <legend>My legend value</legend>
        <input type="checkbox" name="name_1" value="value_1">Value 1</input>
        <input type="checkbox" name="name_2" value="value_2">Value_2</input>
        <input type="checkbox" name="name_3" value="value_3">Value_3</input>
    </fieldset>
    <input type="button" value="Get values" id="btn"/>
</form>

我查看了关于Zend Forms、Collection和Fieldset的正式文档,但这确实让我感到困惑。任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-07 12:34:14

首先,我很抱歉,因为这将是一个有点长。但这将描述行动中的形式。所以请耐心点!

假设您熟悉ZF3默认的Application模块。一些文件夹是在Application模块中创建的,用于分离每个元素。您需要创建它们,如下所示。

让我们先开始创建您的字段集。Zend\Form\Fieldset组件表示一组可重用的元素,并且依赖于Zend\From\Form组件。这意味着您需要将它附加到Zend\Form\Form

module/Application/src/Form/Fieldset/YourFieldset.php

代码语言:javascript
复制
<?php
namespace Application\Form\Fieldset;

use Zend\Form\Element;
use Zend\Form\Fieldset;

class YourFieldset extends Fieldset
{

    public function __construct($name = null)
    {
        parent::__construct('your-fieldset');

        $this->add([
            'name' => 'name_1',
            'type' => Element\Checkbox::class,
            'options' => [
                'label' => 'Value 1',
                'use_hidden_element' => true,
                'checked_value' => 'yes',
                'unchecked_value' => 'no',
            ],
            'attributes' => [
                 'value' => 'no',
            ],
        ]);
        // Creates others as your needs
    }
}

现在,我们将使用Zend\From\Form创建表单,附加从Zend\From\Fieldset创建的字段集。

module/Application/src/Form/YourForm.php

代码语言:javascript
复制
<?php 
namespace Application\Form;

use Application\Form\Fieldset\YourFieldset;
use Zend\Form\Form;

class YourForm extends Form
{

    public function __construct($name = null)
    {
        parent::__construct('your-form');

        $this->add([
            // This name will be used to fetch each checkbox from 
            // the CheckboxFieldset::class in the view template.
            'name' => 'fieldsets',
            'type' => YourFieldset::class
        ]);

        $this->add([
            'name' => 'submit',
            'attributes' => [
                'type'  => 'submit',
                'value' => 'Get Values',
                'class' => 'btn btn-primary'
            ],
        ]);
    }
}

我们的出发已经准备好了。如果我们想要在控制器的任何操作中使用它,我们就需要使它可用。那我们就这么做吧。

更新模块配置文件。如果service_manager键不存在,那么添加以下代码片段,否则,只更新factoriesaliases键如下。

修正模块配置文件中的名称空间

module/Application/config/module.config.php

代码语言:javascript
复制
'service_manager' => [
    'factories' => [
        // Form service
        Form\YourForm::class => Zend\ServiceManager\Factory\InvokableFactory::class,

        // Other services
    ],
    'aliases' => [
        // Make an alias for the form service
        'YourForm' => Form\YourForm::class,          
    ],
],

现在,表单可以使用了。这需要注入我们的控制器。在处理Application模块时,我会将表单插入到IndexController::class的构造函数中,然后在IndexController::fieldsetAction()方法中使用该表单。

module/Application/src/Controller/IndexController.php

代码语言:javascript
复制
<?php
namespace Application\Controller;

use Zend\Form\FormInterface;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

class IndexController extends AbstractActionController
{
    protected $YourForm;

    public function __construct(FormInterface $YourForm) 
    {
        $this->YourForm = $YourForm;
    }

    public function fieldsetAction()
    {
        $request   = $this->getRequest();
        $viewModel = new ViewModel(['form' => $this->YourForm]);

        if (! $request->isPost()) {
            return $viewModel;
        }

        $this->YourForm->setData($request->getPost());

        if (! $this->YourForm->isValid()) {
            return $viewModel;
        }

        $data = $this->YourForm->getData()['fieldsets'];

        echo '<pre>';
        print_r($data);
        echo '</pre>';

        return $viewModel;
    }    
}

由于此控制器在其构造函数中接受参数,因此我们需要为该控制器创建一个工厂(工厂创建其他对象)。

module/Application/src/Factory/Controller/IndexControllerFactory.php

代码语言:javascript
复制
<?php
namespace Application\Factory\Controller;

use Application\Controller\IndexController;
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;

class IndexControllerFactory implements FactoryInterface
{
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {   
        // We get form service via service manager here
        // and then inject controller's constructor 
        $YourForm = $container->get('YourForm');
        return new IndexController($YourForm);
    }    
}

再次,我们需要更新模块配置文件。我们将在controllers密钥下添加工厂,如下所示

代码语言:javascript
复制
'controllers' => [
    'factories' => [
        Controller\IndexController::class => Factory\Controller\IndexControllerFactory::class,
    ],
],

最后,在视图模板中回显表单如下:

module/Application/view/application/index/fieldset.phtml

代码语言:javascript
复制
<h1>Checkbox Form</h1>

<?php
$form = $this->form;
$form->setAttribute('action', $this->url());

// Here is the catch, remember this name from the CheckboxForm::class
$fieldset = $form->get('fieldsets');

$name_1 = $fieldset->get('name_1');

$name_2 = $fieldset->get('name_2');

$name_3 = $fieldset->get('name_3');

$submit = $form->get('submit');
$submit->setAttribute('class', 'btn btn-primary');

$form->prepare();

echo $this->form()->openTag($form);
?>

<fieldset>
    <legend>My legend value</legend>
    <?= $this->formElement($name_1) ?>
    <?= $this->formLabel($name_1) ?>

    <?= $this->formElement($name_2) ?>
    <?= $this->formLabel($name_2) ?>

    <?= $this->formElement($name_3) ?>
    <?= $this->formLabel($name_3) ?>

    <?= $this->formSubmit($submit) ?>
</fieldset>

<?php
echo $this->form()->closeTag();

希望这能帮到你!

票数 2
EN

Stack Overflow用户

发布于 2017-11-07 11:51:55

实际上,您要寻找的示例是zend表单的“集合”部分。不是确切的,但有点像。

这是一个小小的例子。我忽略了名称空间和希望,所以没有错误:)

代码语言:javascript
复制
class myFieldset extends Fieldset {
    public function init(){
      $this
         ->add([
           'name' => 'name_1,
           'type' => 'text',
      ])
         ->add([
           'name' => 'name_2,
           'type' => 'text',
      ])
         ->add([
           'name' => 'name_3,
           'type' => 'text',
      ]);
    }
}


class MyForm extends Form {
     public function init(){
         $this->add([
             'type' => myFieldset,
              'name' => 'fieldset'
         ])->add([
             'type' => 'button',
              'name' => 'action'
         ]);
     }
}

和视图文件;

代码语言:javascript
复制
<?=$this-form($form);?>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47149722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档