2013-03-21 64 views
3

我正在学习zf2,我正面临涉及2(最终更多)模块一起工作的问题。请注意,我仔细阅读this post(以及相关的),这对我有很大的帮助。我将解释一下这个问题:zf2形式:填充选择字段与来自数据库的数据

  • 使用第一个模块(FrOption),管理员可以管理网站表单选项。所有选项都存储在一个数据库表是这样的:

ID | FIELD_NAME | FIELD_VALUE
1 |国内|德国|
2 |国家|法国|
3 |性别|男|
4 |性别|女性|
5 | tipo | Car |
6 | tipo | Fly |
...

  • 在我的模块(FrItem)我已经建立了它需要一些 “FIELD_NAME” 字段的表格。 我的“item”表格如下:

id | name | id_tipo |
1 | Fiat | 5 |
2 |汉莎航空| 6 |
3 | Ford | 5 |
4 |法国航空6 |
...

(id_tipo是一个选项FK)

还认为:

  • 我的实体具有 “TIPO” 属性,二传手+吸气
  • 我已经建立了一个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. 添加到我的FrOption/src目录/ FrOption /服务/ FrOption.php服务类getOptionByName($字段名)方法
  2. 在FrItem /模块.php检索服务,然后使用getOptionByName获取数据,最后将所有注入到Form中。

这可能是一个明智的和可行的解决方案吗?在性能(选项表可能增长)方面,你还有什么关系? 如果有的话,你用什么样的解决方案来解决类似的问题?

感谢

+0

的可能的复制 - > http://stackoverflow.com/ question/12460840/create-a-drop-down-list-in-zend-framework-2 – Crisp 2013-03-21 15:16:45

+0

可能的重复 - > http://stackoverflow.com/questions/15527934/zend-framework-2-0-fill-option -from-database – Sam 2013-03-21 15:18:37

+0

@IamFraz如果你没有找到答案,请参考我的BlogPost但:http://samminds.com/2013/03/zendformelementselect-and-database-values/ – Sam 2013-03-22 16:18:19

回答

9

这可以很容易地通过遵循以下两个步骤中的Zend Framework2步骤1.

加上适配器的情况下做什么实例化窗体类的 控制器动作

$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; 
    } 

} 

在这里你去,你准备好rock.I希望它可以帮助你

+0

ZF3会怎么做? – 2017-05-24 11:39:28

+0

嗨Keyz,我需要看看它。我认为你可以遵循同样的方法。 https://docs.zendframework.com/zend-form/quick-start/。 – 2017-05-25 19:02:51

-1
Try: 
// add code on controller 
$arrTipoData = array(); 
$tipoResults = array('5' => 'Car', '6' => 'Fly',); // this part change your database value 
foreach ($tipResults as $key => $val) { 
$arrTipoData[$key] = $va; 
} 

$arrGenderData = array(); 
$genderResults = array('3' => 'Male', '4' => 'Female',); // this part change your database value 
foreach ($genderResults as $key => $val) { 
$arrGenderData[$key] = $va; 
} 
$dataParams['idTipo'] = $arrTipoData; 
$dataParams['gender'] = $arrGenderData; 
$form = new UserForm($dataParams); 

<?php 
namespace Register\Form; 
use Zend\Form\Form; 
use Zend\Form\Element; 


class UserForm extends Form 
{ 
    protected $portalTable; 

    public function __construct($params = array()) 
    { $name = isset($params['name'])?$params['name']:''; 
     parent::__construct('user'); 
     $this->setAttribute('method', 'post'); 
     $this->setAttribute('enctype', 'multipart/form-data'); 

    $idTipo = (isset($params['idTipo']) && count($params['idTipo']) > 0)?$params['idTipo']:array(); 
     $this->add(array(
       'type' => 'Select', 
       'name' => 'id_tipo', 
       'options' => array(
         'label' => 'Tipo', 
         'empty_option' => 'Select Tipo', 
         'value_options' => $idTipo, 

       ) 
     )); 

     $gender = (isset($params['gender']) && count($params['gender']) > 0)?$params['gender']:array(); 
     $this->add(array(
       'type' => 'Select', 
       'name' => 'gender_id', 
       'options' => array(
         'label' => 'Gender', 
         'empty_option' => 'Select', 
         'value_options' => $gender, 

       ) 
     )); 

    } 
} 
相关问题