我试图建立ZF2的形式。 问题是当我想从一个数据库表中填充选择输入元素的选项数组。 这个问题的回应Zend框架2获取服务定位在形式和填充一个下拉列表,通过@timdev向我指出其中所描述的“正确”的方法ZF2文档。 我认真遵守这一点,但我怀疑他们一定是离开了明显的代码进行假设我可以填补空白,我无法得到它的工作。 任何人都可以看到我在做什么错?
我开始用一种形式,而我添加一个字段:
namespace Ctmm\Form;
use Zend\Form\Form;
class AddPropertyForm extends Form {
public function __construct() {
parent::__construct('AddProperty');
$this->setName('addProperty');
$this->setAttribute('method', 'post');
$this->add(array(
'name' => 'property',
'type' => 'PropertyFieldset'
));
}}
然后,我创建的字段集:
namespace Ctmm\Form;
use Ctmm\Model;
use Zend\Form\Fieldset;
class PropertyFieldset extends Fieldset {
public function __construct(PropertyType $property_type) {
$this->add(array(
'name' => 'property_type',
'type' => 'Zend\Form\Element\Select',
'attributes' => array(
'required' => true,
),
'options' => array(
'label' => 'Property Type',
'value_options' => array(
0 => 'Detached house',
1 => 'Semi-detached house',
2 => 'Terraced house',
3 => 'Bungalow',
4 => 'Maisonette',
5 => 'Flat',
6 => 'Land',
7 => 'Development Opportunity',
),
),
));
}
}
正如你可以看到我注入属性类型的依赖到字段集。 在这个阶段,我还没有用它来生成选项阵列。 我已经硬编码数组值,以避免增加可能发生的错误的另一个来源。 一旦我得到呈现形式,我会再尝试从属性类型表拉阵列数据。
现在,我成立了我的Module.php表单元素经理:
namespace Ctmm;
use Ctmm\Form\PropertyFieldset;
use Zend\ModuleManager\Feature\FormElementProviderInterface;
class Module implements FormElementProviderInterface {
public function getFormElementConfig() {
return array(
'factories' => array(
'PropertyFieldset' => function($sm) {
$serviceLocator = $sm->getServiceLocator();
$property_type = $serviceLocator->get('Ctmm\Model\PropertyType');
$fieldset = new PropertyFieldset($property_type);
}
)
);
}
}
此代码是直接从文档。 我曾尝试加入
return $fieldset;
到PropertyFieldset工厂,我甚至尝试添加
'invokables' => array(
'PropertyFieldset' => 'Ctmm\Form\PropertyFieldset'
)
到getFormElementConfig阵列,以及替换在出厂时可调用。
最后一步是使用表单元素经理我的控制器行动创造形式:
public function addAction() {
$formManager = $this->serviceLocator->get('FormElementManager');
$form = $formManager->get('Ctmm\Form\AddPropertyForm');
}
无论我做什么,我得到一个错误称的ServiceManager无法创建PropertyFieldset:
Zend的\的ServiceManager \异常\ ServiceNotFoundException的
文件:
/home/mike/public_html/ctmm/vendor/zendframework/zendframework/library/Zend/ServiceManager/ServiceManager.php:456
信息:
Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for PropertyFieldset
堆栈跟踪:
#0 /home/mike/public_html/ctmm/vendor/zendframework/zendframework/library/Zend/ServiceManager/AbstractPluginManager.php(103): Zend\ServiceManager\ServiceManager->get('PropertyFieldse...', true)
#1 /home/mike/public_html/ctmm/vendor/zendframework/zendframework/library/Zend/Form/Factory.php(110): Zend\ServiceManager\AbstractPluginManager->get('PropertyFieldse...')
#2 /home/mike/public_html/ctmm/vendor/zendframework/zendframework/library/Zend/Form/Form.php(145): Zend\Form\Factory->create(Array)
#3 /home/mike/public_html/ctmm/module/Ctmm/src/Ctmm/Form/AddPropertyForm.php(33): Zend\Form\Form->add(Array)
在AddPropertyForm.php 33行是我尝试添加自己的自定义PropertyFieldset。 显然,我必须在字段集本身或在我声明的方式错误。 我曾尝试没有注入属性类型的依赖,但没什么区别。 为了完整起见,我的属性类型模型的代码是:
namespace Ctmm\Model;
class PropertyType {
public $id;
public $property_type;
protected $adapter;
public function __construct($adapter) {
$this->adapter = $adapter;
}
public function exchangeArray($data) {
$this->id = (isset($data['id'])) ? $data['id'] : null;
$this->property_type = (isset($data['property_type'])) ? $data['property_type'] : null;
}
public function getPropertyType() {
return $this->property_type;
}
public function fetchAll() {
$sql_query = "SELECT id, property_type from property_type";
$statement = $this->adapter->createStatement($sql_query);
$results = $statement->execute();
return $results;
}
}
编辑:
我不知道答案,但我做了一些更多的研究。 我直接在控制器来测试我的PropertyFieldset类创建一个字段,它的相关模型。
$property_type = $this->getServiceLocator()->get('Ctmm\Model\PropertyType');
$fieldset = new PropertyFieldset($property_type);
这并没有立即开展工作。 首先,我不得不采取暗示出字段集构造器的
public function __construct(PropertyFieldset $property_type) {
成为
public function __construct($property_type) {
然后我不得不添加
parent::__construct('propertyfieldset');
之前它将允许我补充的元素。
有一次,我已经添加了这些变化,我能够在控制器中创建一个PropertyFieldset对象。 我可以的var_dump()测试该荷兰国际集团它。
不幸的是,这些更改PropertyFieldset类没有解决根本问题,所以,当我尝试创建控制器的形式,它会产生相同的错误了。 我已经,至少免除了PropertyFieldset类和它的相关模型,这对我说,我在getFormElementConfig(在我Module.php类的东西错了)