2013-03-16 2 views
4

ZF2에서 폼을 빌드하려고합니다. 데이터베이스 테이블에서 Select 입력 요소의 옵션 배열을 채우려는 경우 문제가 발생합니다. @ timdev 님이이 질문에 대한 답변 Zend FrameWork 2 Get ServiceLocator In Form and populate a drop down list을 사용하면 ZF2 문서가 '올바른'방법으로 설명되어 있습니다. 나는 이것을주의 깊게 따라 갔지만, 나는 그것이 작동하도록 만들 수 없기 때문에 그들이 틈을 채울 수 있다고 가정 할 때 명백한 코드를 남겨 두었 음에 틀림 없다고 생각한다. 누구든지 내가 뭘 잘못하고 있는지 알 수 있니?젠드 프레임 워크 2의 의존성 처리하기 폼

namespace Ctmm\Form; 
use Zend\Form\Form; 

class AddPropertyForm extends Form { 

public function __construct() { 

    parent::__construct('AddProperty'); 

    $this->setName('addProperty'); 
    $this->setAttribute('method', 'post'); 

    $this->add(array(
     'name' => 'property', 
     'type' => 'PropertyFieldset' 
    )); 

} } 나는 다음 필드 셋 만들

: 당신으로

namespace Ctmm\Form; 
use Ctmm\Model; 
use Zend\Form\Fieldset; 

class PropertyFieldset extends Fieldset { 

public function __construct(PropertyType $property_type) { 
    $this->add(array(
     'name' => 'property_type', 
     'type' => 'Zend\Form\Element\Select', 
     'attributes' => array(
      'required' => true, 
     ), 
     'options' => array(
      'label' => 'Property Type', 
      'value_options' => array(
       0 => 'Detached house', 
       1 => 'Semi-detached house', 
       2 => 'Terraced house', 
       3 => 'Bungalow', 
       4 => 'Maisonette', 
       5 => 'Flat', 
       6 => 'Land', 
       7 => 'Development Opportunity', 
      ), 
     ), 
    )); 

} 

}

을 나는 형태로 시작

은 내가 필드 셋을 추가 Fieldset에 PropertyType 종속성을 삽입하는 것을 볼 수 있습니다. 이 단계에서 나는 옵션 배열을 생성하기 위해 이것을 사용하지도 않았다. 가능한 오류의 다른 소스를 추가하지 않도록 배열 값을 하드 코딩했습니다. 렌더링 할 양식을 얻으면 PropertyType 테이블에서 배열 데이터를 가져 오려고 시도합니다.

namespace Ctmm; 
use Ctmm\Form\PropertyFieldset; 
use Zend\ModuleManager\Feature\FormElementProviderInterface; 

class Module implements FormElementProviderInterface { 

public function getFormElementConfig() { 
    return array(
     'factories' => array(
      'PropertyFieldset' => function($sm) { 
       $serviceLocator = $sm->getServiceLocator(); 
       $property_type = $serviceLocator->get('Ctmm\Model\PropertyType'); 
       $fieldset = new PropertyFieldset($property_type); 
      } 
     ) 
    ); 
} 

}

이 코드는 바로 문서에서입니다 :

지금 내 Module.php에서 양식 요소 관리자를 설정합니다. I는 PropertyFieldset 팩토리

return $fieldset; 

추가 시도 및 I 심지어 getFormElementConfig 배열

'invokables' => array(
'PropertyFieldset' => 'Ctmm\Form\PropertyFieldset' 
) 

추가뿐만 아니라, 호출 가능한 상태로 공장 교체 시도했다.

젠드 :

나는 무슨 일이 있어도
public function addAction() {   
$formManager = $this->serviceLocator->get('FormElementManager'); 
    $form  = $formManager->get('Ctmm\Form\AddPropertyForm'); 
} 

, 내가 ServiceManager에이 PropertyFieldset 만들 수 없다는 오류가 :

마지막 단계는 폼 요소 관리자를 사용하여 내 컨트롤러 액션에서 폼을 만드는 것입니다 \ ServiceManager에의 \ 예외 \의 ServiceNotFoundException

파일 :

/home/mike/public_html/ctmm/vendor/zendframework/zendframework/library/Zend/ServiceManager/ServiceManager.php:456 

메시지 :

Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for PropertyFieldset 

스택 추적 : 내 사용자 정의 PropertyFieldset을 추가 할 경우 AddPropertyForm.php에서

#0 /home/mike/public_html/ctmm/vendor/zendframework/zendframework/library/Zend/ServiceManager/AbstractPluginManager.php(103): Zend\ServiceManager\ServiceManager->get('PropertyFieldse...', true) 
#1 /home/mike/public_html/ctmm/vendor/zendframework/zendframework/library/Zend/Form/Factory.php(110): Zend\ServiceManager\AbstractPluginManager->get('PropertyFieldse...') 
#2 /home/mike/public_html/ctmm/vendor/zendframework/zendframework/library/Zend/Form/Form.php(145): Zend\Form\Factory->create(Array) 
#3 /home/mike/public_html/ctmm/module/Ctmm/src/Ctmm/Form/AddPropertyForm.php(33): Zend\Form\Form->add(Array) 

라인 (33)입니다. 분명히 필드 집합 자체 또는 선언하는 방식에 오류가 있습니다. PropertyType 종속성을 주입하지 않고 시도했지만 아무런 차이가 없습니다.완성도를 들어, 내 PropertyType 모델에 대한 코드는 다음과 같습니다

namespace Ctmm\Model; 

class PropertyType { 
public $id; 
public $property_type; 
protected $adapter; 

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

public function exchangeArray($data) { 
    $this->id = (isset($data['id'])) ? $data['id'] : null; 
    $this->property_type = (isset($data['property_type'])) ? $data['property_type'] : null; 
} 

public function getPropertyType() { 
    return $this->property_type; 
} 

public function fetchAll() { 

    $sql_query = "SELECT id, property_type from property_type"; 
    $statement = $this->adapter->createStatement($sql_query); 
    $results = $statement->execute(); 
    return $results; 
} 

}

편집 :

내가 대답을하지 않습니다하지만 난 좀 더 조사를 했어요. 나는 직접 PropertyFieldset 클래스를 테스트하기 위해 컨트롤러에 fieldset을 만들었고 종속 모델이다.

$property_type = $this->getServiceLocator()->get('Ctmm\Model\PropertyType'); 
$fieldset = new PropertyFieldset($property_type); 

이것은 즉시 작동하지 않았습니다. 첫째, 나는 FIELDSET의 생성자

public function __construct(PropertyFieldset $property_type) { 

밖으로 힌팅을했다 그때 그것은 나를 요소를 추가 할 수있는 것입니다 전에

parent::__construct('propertyfieldset'); 

를 추가했다

public function __construct($property_type) { 

되었다.

일단 이러한 변경 사항을 추가하면 컨트롤러에서 PropertyFieldset 개체를 만들 수있었습니다. 나는 이것을 var_dump()로 테스트 할 수있다.

불행히도 이러한 PropertyFieldset 클래스의 변경으로 기본 문제가 해결되지 않았으므로 컨트롤러에서 양식을 만들 때 이전과 같은 오류가 발생합니다. 적어도 PropertyFieldset 클래스의 예외를 두 었으며 내 Module.php 클래스의 getFormElementConfig()에 잘못된 점이 있다고하는 종속 모델

+0

무엇 당신의 AddPropertyForm 공장이 생겼는데? 타입 힌팅에 관해서. 전체 네임 스페이스를 사용해야한다고 생각합니다. Ctmm \ Model \ PropertyType; 또는 생성자에 전체 경로 넣기 –

+0

AddPropertyForm을 만들기 위해 팩토리를 사용하지 않습니다. 새 FormElementManager를 사용하여 컨트롤러에 양식이 작성됩니다. 문서는 이것을 사용하여 양식을 작성하여 getFormElementConfig()에 정의 된 요소를 선택하도록합니다. –

+0

그냥 주위에 엉망이 있었고, __construct 메소드를 AddPropertyForm에서 init으로 변경하면 제대로 동작해야한다고 생각합니다. 또한 공장에서 현장 집합을 반환해야합니다.나는 그것을 모두 점검하고 답을 게시 할 것입니다. –

답변

6

그래서 약간의 변경 사항이 있습니다.

당신이 언급 한 바와 같이 부모가과 같이 구성 호출해야 PropertyFieldSet :

parent::__construct('propertyfieldset'); 

ElementConfig은과 같이해야한다 :

public function getFormElementConfig() { 
    return array(
     'factories' => array(
      'PropertyFieldset' => function($sm) { 
       $serviceLocator = $sm->getServiceLocator(); 
       $property_type = $serviceLocator->get('Ctmm\Model\PropertyType'); 
       $fieldset = new PropertyFieldset($property_type); 
       return $fieldset; 
      }, 
     ) 
    ); 
} 

그리고 AddPropertyForm은과 같이해야한다 :

namespace Ctmm\Form; 
use Zend\Form\Form; 

class AddPropertyForm extends Form { 

    public function init() { 

     parent::__construct('AddProperty'); 

     $this->setName('addProperty'); 
     $this->setAttribute('method', 'post'); 

     $this->add(array(
      'name' => 'addproperty', 
      'type' => 'PropertyFieldset', 
     )); 
    } 
} 

우리가 초기화를 사용하는 대신 __construct 사용하는(). 이 함수는 팩토리로 인스턴스화 할 때 명백히 호출됩니다.

select를 빌드하는 것과 관련하여 모델 대신 FieldGetway 객체를 전달합니다. 하여 형태로 다음과 같은 우리가 할 수있는 fetchAll 기능을 사용하여 다음 :

class PropertyFieldset extends Fieldset { 

    public function __construct(PropertyTypeTable $propertyTypeTable) { 
     parent::__construct('propertyfieldset'); 


     $propertyValOpts = array(); 
     foreach($propertyTypeTable->fetchAll() as $propertyRow) { 
      array_push($propertyValOpts,$propertyRow->property_type); 
     } 

     $this->add(array(
      'name' => 'property_type', 
      'type' => 'Zend\Form\Element\Select', 
      'attributes' => array(
       'required' => true, 
      ), 
      'options' => array(
       'label' => 'Property Type', 
       'value_options' => $propertyValOpts 
      ), 
     )); 
    } 
} 

희망이 도움이 :)

+0

도움 주셔서 감사합니다 아이 딘, 정말 고마워요. 추가 TableGateway 조언을 위해 +1을 추가 할 수 있다면 그렇게 할 수 있습니다. –

+0

나는이 코드를 시도하고있다. 마치 공장에서 var_dump를 실행 한 것처럼 작동한다. 하지만 양식에 표시 할 수 없습니다. 그냥 빈 텍스트 필드를 제공합니다. 무엇이 잘못 될 수 있는지에 대한 단서가 있습니까? – Rickard

관련 문제