문제

Zend_form 구성 요소를 사용하여 양식을 작성하려고하지만 요소 수는 다릅니다. 각 zend_form 요소에 대한 정보는 데이터베이스 (이름, 옵션, 유효성 검사기, 필터 등)에 저장됩니다.

제가 작업하는 응용 프로그램은 다양한 수의 질문이 포함 된 설문 조사로 구성됩니다. 각 질문은 다른 답변 배열과 관련이 있습니다. 궁극적으로 내 목표는 동적으로 서버 측의 라디오/체크 박스 버튼 배열을 구축하는 것입니다.

나는 내 양식을 생성 할 수있는 예쁜 방법을 찾고 있지만 양식 내에 모델을로드하는 가장 좋은 방법은 확실하지 않습니다. 모델을 컨트롤러에로드 한 다음 양식으로 직접 (매개 변수를 통해) 통과해야합니까? 아니면 양식 init () 메소드 내에 모델을로드하는 것이 좋습니다. 논리를 배치하기 가장 좋은 곳은 어디에 있습니까? 양식 클래스 또는 컨트롤러 내에 있어야합니까?

내 아이디어는 데이터베이스에서 폼 요소 속성 (이름, 규칙, 필터 등)을 가져온 다음 반복하고 마지막으로 양식을 렌더링하는 것입니다. 이 접근법에 대해 어떻게 생각하십니까? 궁극적으로 요소는 이번에는 Ajax 및 JavaScript 라이브러리 (예 : jQuery)를 사용하여 동적으로 추가됩니다 (클라이언트 측).

Google을 통해 찾은 유용한 링크는 다음과 같습니다. 그러나 모두 내 것과 약간 다른 질문에 대답한다고 생각합니다.

동적 형태를 구축하는 경우 서버 측면 :

Ajax 처리를 통해 동적 형태, 클라이언트 측면을 구축 할 때 :

도움이 되었습니까?

해결책

zend_form을 확장 할 수 있습니다.

Zend Form은 논리에 좋은 장소가 아니며 형태 표현 만 있습니다.

따라서 컨트롤러에서 모델을 사용하여 필요한 모든 요소를로드하고 파라미터로서의 대조적 양식으로 전달하십시오.

다른 팁

가능한 해결책을 찾았다 고 생각합니다. 배열을 전달하는 것이 포함됩니다. Zend는 요소를 형성합니다 ~로 Zend Form :: __ Construct () 방법. 생성자는 다양한 옵션을 취하고 그 중 하나는 ""입니다. "집단". Zend Framework 라이브러리의 소스 코드를 살펴보십시오.

컨트롤러 내에서 BuildSurveyForm ()이라는 새로운 개인 메소드를 코딩했습니다. 참고 : 매개 변수로 전달 된 객체는 데이터베이스 내에서 몇 개의 테이블 (설문 조사, 질문, 답변 등)에서 데이터를 가져 오는 6 개의 조인 명령문이있는 거대한 SQL 쿼리에서 구축되었습니다. 이 클래스의 공개 속성 중 하나는 객체 (공개 메소드/속성 등)로 저장된 질문 배열로 구성됩니다. 답변도 마찬가지입니다. 이 수업을 구축하기위한 코드는 매우 사소하고 주제가 없습니다.

다음은 설문 조사 컨트롤러의 코드입니다. 복사/붙여 넣기 및 편집/몇 줄을 훨씬 더 명확하게 만들었습니다.

private function buildSurveyForm(MyApp_Object_Survey $survey)
{
    foreach ($survey->questions as $question)
    {
        $element = new Zend_Form_Element_MultiCheckbox($question->order);
        $element->addMultiOptions($question->getAnswersLabels());
        $element->setName($question->order);
        $element->setLabel($question->title);

        $elements[] = $element;
    }

    // Here's the trick :
    $formOptions = array('elements' => $elements);

    $surveyForm = new MyApp_Survey_Form($formOptions);

    $urlHelper = $this->_helper->getHelper('url');
    $surveyForm->setAction($urlHelper->url(array(
            'controller' => 'survey',
            'action' => 'vote'),
        'default'
    ));
    $surveyForm->setMethod('post');

    $this->_forms['survey'] = $surveyForm;

    return $this->_forms['survey'];
}

그만큼 MYAPP 설문 조사 양식 클래스에는 init () 메소드 내에 제출 버튼 만 포함됩니다. 위의 코드와 함께 동적으로 생성 된 요소는이 제출 버튼 전에 추가됩니다 (예기치 않지만 유용합니다). 이 클래스는 단순히 zend_form을 확장합니다.

그런 다음 설문 조사 컨트롤러 /보기 조치 내에서 :

public function viewAction()
{
    $surveyModel =    $this->_model['survey'];
    $survey =        $surveyModel->getFullSurvey($this->_getParam('id'));
    $survey =        new MyApp_Object_Survey($survey);
    // Calls above private method :
    $surveyForm =    $this->buildSurveyForm($survey);

    $this->view->assign(array(
         'surveyForm' => $surveyForm,
    ));
}

요소를 형성하기 위해 필터, 검증기 및 데코레이터를 추가하는 것은 이제 사소한 일입니다. 내 제안은 약간 더러워 지지만 작업이 끝나는 것 같아요. 더 우아한 것을 찾으면 새로운 제안을 추가하겠습니다. 다른 답변/솔루션을 게시하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top