2014-05-17 43 views
1

我正在使用zendframework 2和doctrine 2.我想從我的數據庫中的值中填充MultiCheckbox的值。 我得到了技術來源:https://github.com/doctrine/DoctrineModule/blob/master/docs/form-element.mdzendframework 2表單從數據庫中填充MultiCheckbox的值

namespace Users\Form; 
use Zend\Form\Form; 
use DoctrineModule\Persistence\ObjectManagerAwareInterface; 
use Doctrine\Common\Persistence\ObjectManager; 
class addForm extends form implements ObjectManagerAwareInterface 
{ 
protected $objectManager; 
public function setObjectManager(ObjectManager $objectManager) 
{ 
    $this->objectManager = $objectManager; 
} 

public function getObjectManager() 
{ 
    return $this->objectManager; 
} 
public function __construct($name = null) 
{ 
    parent::__construct('add'); 
    $this->setAttribute('method', 'post'); 
    $this->setAttribute('enctype','multipart/formdata'); 
      $this->add(array(
    'type' => 'DoctrineModule\Form\Element\ObjectMultiCheckbox', 
    'name' => 'option', 
    'options' => array(
    'label' => 'Options Véhicule', 
    'object_manager' => $this->getObjectManager(), 
       'target_class' => 'Users\Entity\optionsvehicule', 
       'property'  => 'property' 
      , ))); 

我收到錯誤消息: 沒有對象管理器設置。

+0

它是通過依賴注入來設置的嗎? – alex

+0

@alex怎麼可能'__construct'調用了方法'$ this-> getObjectManager()',這是以前不能設置的。 – AlexP

+0

沒有在構造函數中看到它...這就是爲什麼它是一個問題 – alex

回答

1

我都試過,發現類似的錯誤。經過一番搜索,我發現解決方案發布在https://github.com/doctrine/DoctrineModule/issues/175。哪些工作。

對於實現你需要做這樣的

在Module.php添加方法getFormElementConfig一些變化:

public function getFormElementConfig() 
{ 
    return array(
     'invokables' => array(
      'addForm' => 'Users\Form\addForm', 
     ), 
     'initializers' => array(
      'ObjectManagerInitializer' => function ($element, $formElements) { 
       if ($element instanceof ObjectManagerAwareInterface) { 
        $services  = $formElements->getServiceLocator(); 
        $entityManager = $services->get('Doctrine\ORM\EntityManager'); 

        $element->setObjectManager($entityManager); 
       } 
      }, 
     ), 
    ); 
} 

在窗體類addForm.php,用init方法代替構造函數:

namespace Users\Form; 
use Zend\Form\Form; 
use DoctrineModule\Persistence\ObjectManagerAwareInterface; 
use Doctrine\Common\Persistence\ObjectManager; 
class addForm extends form implements ObjectManagerAwareInterface 
{ 
    protected $objectManager; 
    public function setObjectManager(ObjectManager $objectManager) 
    { 
     $this->objectManager = $objectManager; 
    } 

    public function getObjectManager() 
    { 
     return $this->objectManager; 
    } 

    //public function __construct($name = null) 
    public function init() 
    { 
     $this->setAttribute('method', 'post'); 
     $this->setAttribute('enctype','multipart/formdata'); 
     $this->add(array(
      'type' => 'DoctrineModule\Form\Element\ObjectMultiCheckbox', 
      'name' => 'option', 
      'options' => array(
       'label' => 'Options Véhicule', 
       'object_manager' => $this->getObjectManager(), 
       'target_class' => 'Users\Entity\optionsvehicule', 
       'property'  => 'property' 
      , ))); 

在您的控制器類中,通過服務定位器呼叫表單obejct:

//$form = new addForm(); 
$forms = $this->getServiceLocator()->get('FormElementManager'); 
$form = $forms->get('addForm'); 
+0

謝謝,請爲什麼我們添加此行;'property'=>'property'這有一個錯誤:在對象「Vehicules \ Entity \ optionsvehicule」中找不到屬性「property」 –

+0

實際上,這應該是'property'=>' propertyName',其中propertyName是每個複選框顯示的字段,因此它可能類似於'property'=>'username'' –

+0

非常感謝。 –

0

$objectManager屬性未定義。

這是因爲您在__construct()中立即調用$this->getObjectManager()方法,並在設置變量之前。

表格取決於對象管理器上的;所以你可以將它作爲一個構造函數參數來添加,這將確保它在使用類之前被設置。

此外,構造函數應該只用於設置對象的初始屬性和狀態,請使用init()修改表單元素。

class addForm extends Form 
{ 
    protected $objectManager; 

    public function __construct(ObjectManager $objectManager) 
    { 
     parent::__construct('add-form'); 

     $this->objectManager = $objectManager; 
    } 

    // The form element manager will call `init()` 
    // on the form so we can add the elements in this method 
    public function init() { 
     //.... 
     $this->setAttribute('method', 'post'); 
     $this->setAttribute('enctype','multipart/formdata'); 

     // $this->add(.... 
     // more elements added here 
    } 

} 

最後一件事是註冊一個工廠,實際上確實注射

class Module { 

    public function getFormElementConfig() { 
     return array(
      'factories' => array(
       'ModuleName\Form\FooForm' => function($formElementManager) { 
        $serviceManager = $formElementManager->getServiceLocator(); 
        $objectManager = $serviceManager->get('ObjectManager'); 

        $form = new Form\FooForm($objectManager); 

        return $form; 
       }, 
      ), 
     ); 
    } 
} 
+0

我真的很困惑,我認爲所有窗體的元素被添加到窗體,因爲構造函數與「$ this-> add(... 「我會張貼我所有的表格來澄清事情 –

+0

謝謝你,我做了你所說的一切,但我得到了一個錯誤:屬性」屬性「無法找到對象」Vehicules \ Entity \ optionsvehicule「!! –