Мне нужно программно изменить поведение формы на основе некоторых параметров. Скажем, например, я показываю форму с информацией о пользователе.
Мне нужно отобразить флажок «отправить почту», если и только если пользователь еще не получил почту активации. Раньше, с 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? Все, что я нашел, это управление зависимостями (классами) и ничего об этом сценарии, за исключением этого вопроса SO: ZF2. Как передать переменную в форму, которая в конце концов возвращается к передаче зависимости. Может быть, последний комментарий 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); } }
Я пробовал это, но не работал, я дам ему вторую попытку и дважды проверю все.
С помощью менеджеров плагинов (классы, расширяющие 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»; очевидно, это будет зависеть от того, какие зависимости требует сервис.