0

Zend Framework 1.12를 사용하여 여러 개의 양식이있는 페이지를 만듭니다. 단일 마스터 양식과 하위 양식을 사용합니다. 따라서 하나의 유효성 검사 코드 부분 만 있습니다. 이러한 하위 형식은 데이터베이스의 다른 테이블을 가리 킵니다. 목표는 해당 양식에 대한 데이터베이스의 행이있는 경우 양식에서 기본값으로 데이터베이스에서 값을 가져와 사용자가 해당 데이터를 변경할 기회를 제공해야한다는 것입니다. 그리고 데이터베이스에 행이 없으면이 양식의 입력이 db에 삽입됩니다. 처음에는 db에서 값을 가져 와서 폼 요소의 값으로 표시 할 수 있습니다. 내가 그것을 변경하고 나는 값이 페이지에 입력 (또는 수정)에 액세스 할 수 없습니다Zend Form, 요소에 기본값이있는 경우 입력 값을 사용할 수 없습니다.

$form->getValues(); 

으로 값을하려고 할 때, 난 그냥 다시 액세스에게 값을 기본값으로 형태 넣어 데이터베이스에. 이 양식은 항상 편집 할 수 있어야하며 여러 가지 종류의 데이터에 대해 여러 가지 양식이 있으므로 동일한 작업을 수행 할 수 있습니다. 나는 무엇을 잘못해야합니까? 어떤 생각?

$masterform = new Application_Form_GeneralForm(); // a class which extends Zend_Form 
$form1 = new Application_Form_SmallForm(); // a class which extends Zend_Form_Subform 
$masterform->addSubform($form1, 'form1'); 
         // so far, for form 1, no problem. My second form will be 
         // added to the masterform after this first form is submitted, 
         // which works fine. 

$form2 = new Application_Form_AnotherSmallForm(); // a class which extends Zend_Form_Subform 

$request = $this->getRequest(); 
if ($request->isPost()){ 
    if ($generalform->isValid($request->getPost())) { 
     $form2->loadValues(); // the part that form elements are filled with data 
           // taken from db, a method defined in `AnotherSmallForm` 
           // class. Just assigning values to elements with `setValue()` 

     $form2->saveValues(); // Here is the problem, another method to save the 
// current values to db. (defined in form class). I have to do this in this fragment of code, so i don't know to 
// use which order (saveValues() and loadValues() methods' order)` 

     $masterform->addSubform($form2, 'form2'); 
    } 
} 

가 그래서, 1 단계 : $의를 Form1은 $ masterform에 추가됩니다

(추가) 여기 내 컨트롤러 코드의 관련 부분을 요약 한 것입니다.

두 번째 단계 : $ masterform이 제출되었습니다 (이제 $ form1 만 포함). 그러면 $ form2가 $ masterform에 추가됩니다. 추가되기 전에 $ form2의 값이 양식 요소 내에로드됩니다.

3 단계 : $ masterform이 제출되었습니다 ($ form1 및 $ form2도 마찬가지 임). $ form2에 값이 변경되면이 제출을 통해 db에서 값을 업데이트해야합니다.

이 코드의 목표는 세 번째 단계로 인해 달성 할 수 없었던 것입니다.

+0

더 많은 컨트롤러 코드가 필요합니다. 양식에 의해 제출 된 값은 양식 객체에 어떻게 도달합니까? –

+0

db에서 기본값은 어디에 설정합니까? 입력 값을 겹쳐 쓰고 순서를 변경하십시오. 도움이되지 않으면 여기에 더 많은 코드를 게시하십시오. – konradwww

+0

좋아요, Form 클래스의 코드없이 더 많은 코드를 추가했습니다. 요소를 구성하고 db에 저장하는 코드는 잘 작동하므로 코드를 넣지 않았습니다. – ahmetbitbit

답변

0

나는 그것을 마침내 발견했습니다. 하위 조건이 서로 관련된 조건으로 작성된 경우에도 조건 블록 if($request->isPost())에서 생성해야합니다. 따라서, 단계를 추가해야한다면 ($ form1이 제출되고 $ form1이 페이지에 남아있는 경우 $ form2가 작성되어야 함), 요구 사항이 직접적으로 개별적으로 충족되는지 테스트해야합니다. 이 내 접근법은 효과가 없습니다. 여기 loadValues()을 가진 정지, 나는 폼 클래스의 init() 방법 내부 메소드를 호출

$masterform = new Application_Form_GeneralForm(); 
$form1 = new Application_Form_SmallForm(); 
$masterform->addSubform($form1, 'form1');       

$form2 = new Application_Form_AnotherSmallForm(); 

if (/* the requirement you want to check if $form2 should be added or not, 
    and this could easily be checking some value which is submitted with 
    $form1, so you have already checked if $form1 has been submitted */) 
    $masterform->addSubform($form2, 'form2'); // we add it if requirement is met 

$request = $this->getRequest(); 
if ($request->isPost()){ 
    if ($generalform->isValid($request->getPost())) { 
     $form2->saveValues(); // be sure it saves the final values added to form 
     ////....... 
    } 
} 

과 : 그것은 다음과 같이해야한다. 그래서, konradwww가 말했듯이 saveValues ​​()가 먼저 발생하고 loadValues ​​()가 먼저 발생해야합니다. 이것은 폼 클래스에서 loadValues ​​()를 사용하여 수행 할 수 있습니다. 폼의 초기화 프로세스에 속합니다.

0

문제가 있습니다. 게시 값을 보낸 후에 기본 db 값으로 다시 쓰게됩니다. 변경 순서, 제 saveValues ​​

if ($request->isPost()){ 
......................... 
    $form2->loadValues(); // here you're rewriting it! 
    $form2->saveValues(); 

간단한()을 loadValues ​​().

+0

네, 잡았습니다. 하지만 작동하지 않습니다. 왜냐하면 $ form1이 제출 된 후에 $ form2가 생성되기 때문입니다. 그래서이'if ($ request-> isPost) 조건 블록 안에 생성된다.거기에 방문하는 첫 번째 반복에서 폼 요소에는 값이 없습니다 (loadValues ​​()로로드하기 전에). 그래서 요소가 비게되고 데이터베이스에 null을 씁니다. – ahmetbitbit

+0

당신의 접근법은 유용하지만, 해당 블록의 반복 (처음 제외)에 대해서는 정상적으로 작동하므로 감사합니다. – ahmetbitbit