ZF2 - 如何创建动态表单创建?

时间:2014-06-06 11:23:55

标签: php forms zend-framework2

我需要为模块的所有配置设置创建一个简单的设置模块。这是数据库架构:

CREATE TABLE IF NOT EXISTS `base_settings` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `type` varchar(255) NOT NULL,
  `module` varchar(255) NOT NULL,
  `label` varchar(255) NOT NULL,
  `parameter` varchar(255) NOT NULL,
  `value` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Dumping data for table `base_settings`
--

INSERT INTO `base_settings` (`id`, `type`, `module`, `label`, `parameter`, `value`) VALUES
(1, 'select', 'cms', 'Layout', 'defaultlayout', '2column-left'),
(2, 'text', 'cms', 'Items', 'itemsnum', '5');    

现在我需要做的是使用base_settings表中的记录创建一个包含两个或多个字段的表单。

enter image description here

例如,第一条记录处理 defaultlayout 的偏好设置,其值为 2column-layout 。因此,我需要为该表中保存的每条记录创建一个包含一个或多个表单域的表单。

namespace Base\Entity;

class Settings implements SettingsInterface {

    public $id;
    public $module;
    public $parameter;
    public $value;


    /**
     * This method get the array posted and assign the values to the table
     * object
     *
     * @param array $data
     */
    public function exchangeArray ($data)
    {
        foreach ($data as $field => $value) {
            $this->$field = (isset($value)) ? $value : null;
        }

        return true;
    }

    /**
     * @return the $id
     */
    public function getId ()
    {
        return $this->id;
    }

    /**
     * @param field_type $id
     */
    public function setId ($id)
    {
        $this->id = $id;
    }

    /**
     * @return the $module
     */
    public function getModule ()
    {
        return $this->module;
    }

    /**
     * @param field_type $module
     */
    public function setModule ($module)
    {
        $this->module = $module;
    }

    /**
     * @return the $parameter
     */
    public function getParameter ()
    {
        return $this->parameter;
    }

    /**
     * @param field_type $parameter
     */
    public function setParameter ($parameter)
    {
        $this->parameter = $parameter;
    }

    /**
     * @return the $value
     */
    public function getValue ()
    {
        return $this->value;
    }

    /**
     * @param field_type $value
     */
    public function setValue ($value)
    {
        $this->value = $value;
    }
}

这是我想要实现动态

的结果
<?php
namespace CmsSettings\Form;
use Zend\Form\Form;
use Zend\Stdlib\Hydrator\ClassMethods;

class PageForm extends Form
{

    public function init ()
    {
        $hydrator = new ClassMethods;

        $this->setAttribute('method', 'post');
        $this->setHydrator($hydrator)->setObject(new \Base\Entity\Settings()); // I have a doubt about this hydrator

        $this->add(array (
                'type' => 'Zend\Form\Element\Select',
                'name' => 'defaultlayout',
                'attributes' => array (
                        'class' => 'form-control'
                ),
                'options' => array (
                        'label' => _('Layout'),
                        'value_options' => array (
                                '1column' => _('1 Column'),
                                '2column-left' => _('2 Columns Left'),
                                '2column-right' => _('2 Columns Right'),
                        )
                )
        ));


        $this->add(array (
                'name' => 'itemsnum',
                'attributes' => array (
                        'class' => 'form-control'
                ),
                'options' => array (
                        'label' => _('Items'),
                )
        ));

        $this->add(array ( 
                'name' => 'submit', 
                'attributes' => array ( 
                        'type' => 'submit', 
                        'class' => 'btn btn-success', 
                        'value' => _('Save')
                )
        ));
        $this->add(array (
                'name' => 'id',
                'attributes' => array (
                        'type' => 'hidden'
                )
        ));
    }
}

问题是:如何创建这种动态表单?我要从哪里开始?

感谢

1 个答案:

答案 0 :(得分:0)

基本上你想做的是:

  • 你自己写了一个像DbFormCreator
  • 这样的课程
  • 您在DB中查询所有可能的设置
  • 您将这些设置注入表单
  • 对于每个设置,您只需创建相应类型和名称的FormField

在布局示例中有value_options之后,事情开始变得更加棘手。在这种情况下,您的DbFormCreator需要从另一个表或某些配置文件中提取value_options的数据。

此类任务可能变得极其复杂,因为最终您不仅需要将typename的信息添加到数据库中,还需要filters,{{{}的信息。 1}}等等...您可以查看其{API}表单中的validators用于向API添加新字段的内容。基本上相同的后端应该适用于您的场景。

这不是最简单的任务(也不是最复杂的任务),但肯定不是你会得到答案的东西。上面解释了基础知识,但工作取决于你。