2015-01-28 1 views
2

Мне нужно программно изменить поведение формы на основе некоторых параметров. Скажем, например, я показываю форму с информацией о пользователе.Zend Framework 2: передача переменных ("options") для формирования с использованием formelementmanager

Мне нужно показать флажок «отправить почту», если и только если пользователь еще не получил почту активации. Ранее, с ZF1, я использовал, чтобы сделать что-то вроде

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

, который, в свою очередь, был принят в качестве опции, и которые allow'd сделать

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 Рамки 2? Все, что я нашел, это управление зависимостями (классами) и ничего об этом сценарии, кроме этого вопроса SO: ZF2 How to pass a variable to a form , который в конце концов возвращается к передаче зависимости. Может быть, последний комментарий Jean Paul Rumeau может дать решение, но я не смог заставить его работать. Thx A.

@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); 
    } 
} 

I судимое это, но не работал, я дам ему вторую попытку и дважды проверить все.

ответ

2

С помощью плагинов-менеджеров (классы, расширяющие Zend\ServiceManager\AbstractPluginManager) вы можете предоставить массив параметров «создания» в качестве второго параметра.

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

Важно то, как вы зарегистрировали сервис у менеджера. «invokable» будут иметь массив опций, переданный в запрошенный конструктор службы, однако «фабрики» (которые должны быть строкой имени фабричного класса) получат параметры в его конструкторе.

Редактировать

Вы зарегистрировали свою службу с анонимной функцией, которая означает это будет не работу за вас. Вместо этого используйте завод класс.

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

, то это завод, которые будут получать параметры впрыскивается в это конструктор (который, если вы думаете о том, что имеет смысл).

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

В качестве альтернативы, вы можете вводить непосредственно в эту службу запрашивает (SomeForm), зарегистрировав его в качестве службы «invokeable»; очевидно, это будет зависеть от того, какие зависимости требует сервис.

+0

Спасибо вам большое! –

+1

$ this-> options останется неизменным ('foo' => 'bar'), если я сделаю второй вызов следующим образом: $ form2 = $ formElementManager-> get ('SomeForm', array ('foo' => 'bar2 «)); – vlr

+2

@vlr Служба по умолчанию будет «совместно»; что после создания он продолжает возвращать * тот же самый экземпляр для каждого вызова в '$ formElementManager-> get()'. Вы можете отключить это [, пометив службу как не общий] (http://framework.zend.com/manual/current/en/modules/zend.service-manager.quick-start.html#sample-configuration) - Предоставление вам нового экземпляра службы (каждый раз с использованием нового экземпляра фабрики 'SomeFormFactory'). – AlexP

Смежные вопросы