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()에 잘못된 점이 있다고하는 종속 모델
무엇 당신의 AddPropertyForm 공장이 생겼는데? 타입 힌팅에 관해서. 전체 네임 스페이스를 사용해야한다고 생각합니다. Ctmm \ Model \ PropertyType; 또는 생성자에 전체 경로 넣기 –
AddPropertyForm을 만들기 위해 팩토리를 사용하지 않습니다. 새 FormElementManager를 사용하여 컨트롤러에 양식이 작성됩니다. 문서는 이것을 사용하여 양식을 작성하여 getFormElementConfig()에 정의 된 요소를 선택하도록합니다. –
그냥 주위에 엉망이 있었고, __construct 메소드를 AddPropertyForm에서 init으로 변경하면 제대로 동작해야한다고 생각합니다. 또한 공장에서 현장 집합을 반환해야합니다.나는 그것을 모두 점검하고 답을 게시 할 것입니다. –