php - Zend框架2 : passing variables ("options") to form using formelementmanager

标签 php forms zend-framework2

我需要根据某些选项以编程方式更改表单的行为。比方说,我正在显示一个包含某些用户信息的表单。

当且仅当用户尚未收到激活邮件时,我需要显示一个复选框“发送邮件”。以前,对于 ZF1,我曾经做过类似的事情

$form = new MyForm(array("displaySendMail" => true))

反过来,它作为一个选项被接收,并且允许这样做

class MyForm extends Zend_Form {

    protected $displaySendMail;

    [...]

    public function setDisplaySendMail($displaySendMail)
    {
        $this->displaySendMail = $displaySendMail;
    }


    public function init() {
        [....]
        if($this->displaySendMail)
        {
            $displaySendMail  new Zend_Form_Element_Checkbox("sendmail");
            $displaySendMail
                   ->setRequired(true)
                   ->setLabel("Send Activation Mail");
        }
    }

如何使用 Zend Framework 2 来实现这一点?我发现的所有内容都是关于管理依赖项(类)的,除了这个问题之外,没有任何关于此场景的内容:ZF2 How to pass a variable to a form 最终,它依赖于传递依赖项。也许让·保罗·鲁莫 (Jean Paul Rumeau) 的最后一条评论可以提供解决方案,但我无法让它发挥作用。 谢谢 答:

@AlexP,感谢您的支持。我已经使用了 FormElementManager,所以它应该很简单。如果我理解正确,我应该在我的 SomeForm 构造函数中检索这些选项,不是吗?

[in Module.php]

'Application\SomeForm' => function($sm)
           {
                $form = new SomeForm();
                $form->setServiceManager($sm);
                return $form;
            },

在 SomeForm.php 中

class SomeForm extends Form implements ServiceManagerAwareInterface
{
    protected $sm;

    public function __construct($name, $options) {
         [here i have options?]
         parent::__construct($name, $options);
    }
 }

我尝试了这个,但没有成功,我会再试一次并仔细检查所有内容。

最佳答案

使用插件管理器(扩展 Zend\ServiceManager\AbstractPluginManager 的类),您可以提供“创建选项”数组作为第二个参数。

$formElementManager = $serviceManager->get('FormElementManager');
$form = $formElementManager->get('SomeForm', array('foo' => 'bar')); 

重要的是您如何向经理注册服务。 “可调用”服务会将选项数组传递到请求的服务的构造函数中,但是“工厂”(必须是工厂类名称的字符串)将在其构造函数中获取选项。

编辑

您已使用匿名函数注册了您的服务,这意味着这对您有用。而是使用工厂

// Module.php
public function getFormElementConfig()
{
    return array(
        'factories' => array(
            'Application\SomeForm' => 'Application\SomeFormFactory',
        ),
    );
}

然后是工厂将选项注入(inject)到它的构造函数中(如果你考虑一下这是有道理的)。

namespace Application;

use Application\SomeForm;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\ServiceManager\FactoryInterface;

class SomeFormFactory implements FactoryInterface
{
    protected $options = array();

    public function __construct(array $options = array())
    {
        $this->options = $options;
    }

    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        return new SomeForm('some_form', $this->options);
    }
}

或者,您可以通过将其注册为“可调用”服务来直接注入(inject)到您请求的服务 (SomeForm) 中;显然,这取决于服务需要什么依赖项。

关于php - Zend框架2 : passing variables ("options") to form using formelementmanager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28201289/

相关文章:

php - Zend Framework "Resources"是什么?

javascript - 为什么 JavaScript 提交重新加载页面并通过按钮提交进行客户端页面验证

ruby-on-rails - 向 Rails 中的所有表单添加隐藏输入字段

php - mysql插入查询不起作用

php - PHP 的 Protocol Buffer

php - 在维护 View 页面下显示站点,了解laravel应用程序中的所有错误/异常

php - 发送多个复选框选项

php - 创建自定义存储库后如何访问 Doctrine 定义的方法?

postgresql - Doctrine2 使我对 OneToMany 和 ManyToOne 关系感到疯狂

php - 如何使学说和 ZF2 形式注释一起工作