2015-05-19 46 views
1

我想知道是否有辦法將其他參數傳遞給構造函數(首選)或檢索請求對象以檢查表單構造函數中的標題,以便在執行getForm在一個控制器中,表單將根據它被調用的方式進行自定義?當檢索表單時更改ZF2表單行爲

我正在將AngularJs綁定和模型標籤集成到我的表單元素中,但我需要修改提交按鈕在Ajax中調用表單時如何工作,以及如何通過框架將其拖入Zend模板。

因此,我想拋出提交按鈕添加到窗體的條件參數,但我需要知道呈現的窗體是在zend中查看還是通過ajax調用發送。我可以通過使用isXmlHttpRequest()查看請求頭來檢測控制器中的ajax調用,但我不確定如何讓表單知道控制器在檢索$ this-> getForm()

回答

0

您可以使用工廠類注入任何您喜歡的選項。

use MyModule\Form\MyForm; 
use Zend\ServiceManager\ServiceLocatorInterface; 
use Zend\ServiceManager\FactoryInterface; 

class MyFormFactory implements FactoryInterface 
{ 
    public function createService(ServiceLocatorInterface $formElementManager) 
    { 
     $serviceManager = $formElementManager->getServiceLocator(); 
     $request = $serviceManager->get('Request'); 

     // I would recommend assigning the data 
     // from the request to the options array 
     $options = [ 
      'is_ajax' => $request->isXmlHttpRequest(), 
     ]; 

     // Although you could also pass in the request instance into the form 
     return new MyForm('my_form', $options, $request); 
    } 
} 

如果注入的要求,您將需要修改MyForm::__construct

namespace MyModule\Form; 

use Zend\Form\Form; 
use Zend\Http\Request as HttpRequest; 

class MyForm extends Form 
{ 
    protected $request; 

    public function __construct($name, $options, HttpRequest $request) 
    { 
     $this->request = $request; 

     parent::__construct($name, $options); 
    } 
} 

更新您的module.config.php使用工廠

return [ 
    'form_elements' => [ 
     'factories' => [ 
      'MyModule\Form\MyForm' => 'MyModule\Form\MyFormFactory' 
     ] 
    ] 
] 

然後確保你要求從服務管理形式(在控制器工廠

$myForm = $serviceManager->get('FormElementManager')->get('MyModule\Form\MyForm'); 
+0

好的,很酷,謝謝。仍然圍繞着工廠 - 我可以重寫或抽象getForm方法在所有檢索到的表單上注入類似的基本選項嗎?像說getTailoredForm? – Scott

+0

另外,我記得當$ this-> getServiceManager返回formManager中的formManager時,formManager的getServiceManager返回標準服務定位器,所以我還可以根據需要在上下文中獲取值(構造函數完成後) – Scott

+0

@Scott您的表單具有類似的依賴關係,您當然可以擴展工廠和/或爲每個表單創建一個抽象類。爲了在控制器中獲取表單,理想情況下應該創建一個'MyControllerFactory',然後將表單注入控制器(就像在我的示例中注入'Request'一樣)。 – AlexP

0

我與助手AbstractForm函數(我只是將getRequest()添加到底部)。當然,在更大規模的應用程序中,我可能會添加錯誤檢查以確保這些不是從構造函數調用的(當服務管理器還不可用時)

namespace Application\Form; 

use Zend\Form\Form as ZendForm; 
use Zend\Http\Request as HttpRequest; 
use Zend\Stdlib\RequestInterface as Request; 
use Zend\Form\FormElementManager as ZendFormElementManager; 
use Zend\ServiceManager\ServiceLocatorAwareInterface as ZendServiceLocatorAwareInterface; 
use Zend\ServiceManager\ServiceLocatorInterface  as ZendServiceLocatorInterface; 
use Doctrine\ORM\EntityManager as DoctrineEntityManager 

class AbstractForm extends ZendForm implements ZendServiceLocatorAwareInterface { 

    /** 
    * @var Request 
    */ 
    protected $request; 

    /** 
    * in form context this turns out to be Zend\Form\FormElementManager 
    * 
    * @var ZendFormElementManager $service_manager 
    */ 
    protected static $service_manager; 

    /** 
    * @var DoctrineEntityManager $entity_manager 
    */ 
    protected $entity_manager; 

    /** 
    * @var ZendServiceLocatorInterface $service_locator_interface 
    */ 
    protected $service_locator_interface; 

    public function __construct($name = null) 
    { 
     parent::__construct($name); 
    } 

    /** 
    * in form context this turns out to be Zend\Form\FormElementManager 
    * 
    * @param ZendFormElementManager $serviceLocator 
    */ 
    public function setServiceLocator(FormElementManager $serviceLocator) 
    { 
     self::$service_manager = $serviceLocator; 
    } 

    /** 
    * in form context this turns out to be Zend\Form\FormElementManager 
    * 
    * @return ZendFormElementManager 
    */ 
    public function getServiceLocator() 
    { 
     return self::$service_manager; 
    } 

    /** 
    * wrapper for getServiceLocator 
    * @return ZendFormElementManager 
    */ 
    protected function getFormElementManager() { 
     return $this->getServiceLocator(); 
    } 

    /** 
    * this returns an actual service aware interface 
    * 
    * @return ZendServiceLocatorInterface 
    */ 
    protected function getServiceManager() { 
     if(!($this->service_locator_interface instanceof ZendServiceLocatorInterface)) { 
      $this->service_locator_interface = $this->getFormElementManager()->getServiceLocator(); 
     } 
     return $this->service_locator_interface; 
    } 

    /** 
    * @return DoctrineEntityManager 
    */ 
    protected function getEntityManager() { 
     if(!($this->entity_manager instanceof \DoctrineEntityManager)) { 
      $this->entity_manager = $this->getServiceLocator()->getServiceLocator()->get('Doctrine\ORM\EntityManager'); 
     } 
     return $this->entity_manager; 
    } 

    /** 
    * Get request object 
    * 
    * @return Request 
    */ 
    public function getRequest() 
    { 
     if (!$this->request) { 
      $this->request = $this->getServiceManager()->get('Request'); 
     } 

     return $this->request; 
    } 
} 
+0

是的,我知道靜態變量很混亂,因爲服務管理器的函數返回服務定位器的值,反之亦然 - 我可能會稍後再更改它。 – Scott