3

我正在学习 zf2,我面临一个涉及 2 个(最终更多)模块一起工作的问题。请注意,我已经仔细阅读了这篇文章(以及相关的文章),这对我有很大帮助。我将解释一下这个问题:

  • 使用第一个模块 (FrOption),管理员可以管理网站表单选项。所有选项都存储在一个 db 表中,如下所示:

id|field_name|field_value
1|国家|德国|
2|国家|法国|
3|性别|男|
4|性别|女|
5|tipo|汽车|
6|提波|飞|
...

  • 在我的模块(FrItem)中,我构建了一个需要一些“field_name”字段的表单。我的“项目”表如下:

id|名称|id_tipo|
1|菲亚特|5|
2|汉莎|6|
3|福特|5|
4|法航 6|
...

(id_tipo 是一个选项 FK)

还要考虑:

  • 我的实体具有“tipo”属性,setter + getter
  • 我已经构建了一个 ItemHydrator 以将 id_tipo db 字段“映射”到“tipo”实体属性
  • 作为测试,我在表单类中添加了这个字段,并且在查看和编辑模式下一切正常:

    $this->add(
    'type' => 'Zend\Form\Element\Select',
    'name' => 'id_tipo',
    'options' => array (
        'label' => 'Tipo', 
        'empty_option' => 'Select',
        'value_options' => array ('5' => 'Car', '6' => 'Fly' ) )
    

    );

现在我想“链接”这两个模块: value_options 应该是来自 FrOption 的动态数组,所以我正在寻找实现这一要求的最佳方法。

我认为一种解决方案可能是这样的:

  1. 将 getOptionByName($fieldName) 方法添加到我的 FrOption/src/FrOption/Service/FrOption.php 服务类
  2. 在 FrItem/Module.php 中检索服务,然后使用 getOptionByName 将数据全部注入到表单中。

这可能是一个明智且可行的解决方案吗?你对它的性能有什么看法(选项表可能会增长)?如果有的话,你用什么样的解决方案来解决类似的问题?

谢谢

4

1 回答 1

9

这可以通过 Zend Framework2 第 1 步中的以下 2 个步骤轻松完成。

在控制器动作中实例化表单类的适配器的实例

$dbAdapter = $this->getServiceLocator()->get('Zend\Db\Adapter\Adapter');
$form = new TestForm ($dbAdapter);

表格中的第 2 步

namespace Test\Form;

use Zend\Form\Form;
use Zend\Db\Adapter\AdapterInterface;
use Zend\Db\Adapter\Adapter;
class TestForm extends Form
{
    protected $adapter;
    public function __construct(AdapterInterface $dbAdapter)
    {
        $this->adapter =$dbAdapter;
                parent::__construct("Test Form");
        $this->setAttribute('method', 'post');
                //your select field
$this->add(array(
                'type' => 'Zend\Form\Element\Select',
                'name' => 'name',
                'tabindex' =>2,
                'options' => array(
                        'label' => 'Author',
                        'empty_option' => 'Please select an author',
                        'value_options' => $this->getOptionsForSelect(),
                )
        ));

                // another fields

}
       public function getOptionsForSelect()
    {
        $dbAdapter = $this->adapter;
        $sql       = 'SELECT id,name  FROM newsauthor where active=1 ORDER BY sortorder ASC';
        $statement = $dbAdapter->query($sql);
        $result    = $statement->execute();

        $selectData = array();

        foreach ($result as $res) {
            $selectData[$res['id']] = $res['name'];
        }
        return $selectData;
    }

}

在这里,你准备好摇滚了。我希望它对你有帮助

于 2013-08-06T11:21:47.167 回答