gpt4 book ai didi

php - 在 Zend Framework 2 中创建下拉列表

转载 作者:可可西里 更新时间:2023-11-01 13:43:19 24 4
gpt4 key购买 nike

我知道这听起来更基础,但我仍然想提出我的问题,因为它与 Zend Framework 2 相关。我从 Zend 示例模块中知道这种形式

namespace Album\Form;

use Zend\Form\Form;

class AlbumForm extends Form
{
public function __construct($name = null)
{
// we want to ignore the name passed
parent::__construct('album');
$this->setAttribute('method', 'post');
$this->add(array(
'name' => 'id',
'attributes' => array(
'type' => 'hidden',
),
));
$this->add(array(
'name' => 'artist',
'attributes' => array(
'type' => 'text',
),
'options' => array(
'label' => 'Artist',
),
));
$this->add(array(
'name' => 'title',
'attributes' => array(
'type' => 'text',
),
'options' => array(
'label' => 'Title',
),
));
$this->add(array(
'name' => 'submit',
'attributes' => array(
'type' => 'submit',
'value' => 'Go',
'id' => 'submitbutton',
),
));
}
}

这就是所谓的时尚

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

echo $this->form()->openTag($form);
echo $this->formHidden($form->get('id'));
echo $this->formRow($form->get('title'));
echo $this->formRow($form->get('artist'));
echo $this->formSubmit($form->get('submit'));
echo $this->form()->closeTag();

如何为列表存储在关联数组中的艺术家字段添加下拉列表。自从我进入 Zend Framework 2 以来,我希望得到专家的建议。我关注了this previous post但我有点不清楚。

最佳答案

这是对静态选项执行此操作的一种方法。

....

$this->add(array(
'type' => 'Zend\Form\Element\Select',
'name' => 'number'
'options' array(
'options' => array( '1' => 'one', '2', 'two' )
)
));

注意....

因为您是在构造函数中创建表单,所以您将无法访问 ServiceManger。如果您想从数据库中填充,这可能会导致问题。

让我们尝试类似...

class AlbumForm extends Form implements ServiceManagerAwareInterface
{

public function __construct()
{
....

$this->add(array(
'type' => 'Zend\Form\Element\Select',
'name' => 'number'
));

....
}

....

public function initFormOptions()
{
$this->get('number')->setAttribute('options', $this->getNumberOptions());
}

protected function getNumberOptions()
{
// or however you want to load the data in
$mapper = $this->getServiceManager()->get('NumberMapper');
return $mapper->getList();
}

public function getServiceManager()
{
if ( is_null($this->serviceManager) ) {
throw new Exception('The ServiceManager has not been set.');
}

return $this->serviceManager;
}

public function setServiceManager(ServiceManager $serviceManager)
{
$this->serviceManager = $serviceManager;
}

但这不是很好,重新考虑...

扩展表单以便您可以创建表单并不完全正确。我们不是在创建一种新的表单类型,我们只是在设置一个表单。这需要一个工厂。此外,在这里使用工厂的优点是我们可以通过使用服务管理器来提供服务的方式来设置它,这样服务管理器就可以注入(inject)自身,而不是我们从 Controller 手动注入(inject)。另一个优点是只要有服务管理器,我们就可以调用此表单。

另一点值得一提的是,在有意义的地方,我认为最好从 Controller 中取出代码。 Controller 不是脚本转储,因此让对象自行管理是件好事。我想说的是,用它需要的对象注入(inject)一个对象是好的,但是仅仅将来自 Controller 的数据交给它是不行的,因为它会产生太多的依赖性。 不要从 Controller 中用勺子喂食物体,注入(inject)勺子。

无论如何,太多的咆哮更多的代码...

class MySpankingFormService implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceManager )
{
$mySpankingNewForm = new Form;

// build that form baby,
// you have a service manager,
// inject it if you need to,
// otherwise just use it.

return $mySpankingNewForm;
}
}

Controller

<?php

class FooController
{
...
protected function getForm()
{
if ( is_null($this->form) ) {
$this->form =
$this->getServiceManager()->get('MySpankingFormService');
}
return $this->form;
}
...
}

模块.config.php

...
'service_manager' => array (
'factories' => array (
...
'MySpankingFormService'
=> 'MyNameSpacing\Foo\MySpankingFormService',
...

关于php - 在 Zend Framework 2 中创建下拉列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12460840/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com