2011-03-03 35 views
0

我正在使用會話在我的Zend應用程序中使用選項填充多選框。如何使用會話填充zend表單字段?

用戶選擇一個或多個選項並填寫表單上的其他字段,然後提交。如果用戶沒有選擇多重選擇中的所有選項,則將再次顯示該表單,但多重選擇僅具有用戶上次未選擇的選項。這個過程繼續進行,直到沒有更多選項從剩餘的多重選擇進行處理。

這裏是我用來擺脫已經被處理,使得它們不用於填充多選擇框的選項代碼:

if($form_successful){ 
// TODO remove $post['keyword_names'] (i.e. already processed) from $keyword_names (that come from $_SESSION) 
    $keyword_names = array_diff($keyword_names, $post['keyword_names']); 
    print_r($keyword_names); 
if(is_array($keyword_names) && !empty($keyword_names)){ 
// save updated $keyword_names into $_SESSION['workflow1'] 
$session = new Zend_Session_Namespace('workflow1'); 
$session->keyword_names = $keyword_names; 

// set flag to false so that we display form again 
$form_successful = false; 
}else{ // all keywords have been assigned 
// go to next step 
$this->_redirect('/workflow-1/step-'.($step+1).'/'); 
} 
} 

print_r($keyword_names);顯示了正確的選擇,但是當表單在用戶提交時加載,多重選擇顯示開始時存在的選項,即用戶剛選擇和提交的選項不會從多重選擇中取出,只有當用戶再次提交表單時然後多選框更新。

欣賞幫助。

回答

1

通過使用URL參數解決了該問題。這裏是代碼(可能與我之前發佈的內容有很大不同,因爲我做了一些大的修改):

// after successful form submission 
    if($form_successful){ 
     // remove $post['keyword_names'] (i.e. already processed) from $keyword_names (that come from $_SESSION) 
     $keyword_names = array_diff($keyword_names, $post['keyword_names']); 

     // save remaining $keyword_names into $_SESSION['workflow1'] 
     $session = new Zend_Session_Namespace('workflow1'); 
     $session->keyword_names = $keyword_names; 

     if(is_array($keyword_names) && !empty($keyword_names)){ 

      // redirect to the same step again - to ensure that the form will reflect (in select lists) newly created AdGroup and/or Campaign 
      // GET parameteres ($params_array) provide a way to remember user's choice 
      $params_array = array(); 
      if(!empty($post['match_type_id'])){ 
       $params_array['match_type_id'] = $post['match_type_id']; 
      } 
      if(!empty($post['with_permutations'])){ 
       $params_array['with_permutations'] = $post['with_permutations']; 
      } 
      if(!empty($ad_group_id)){ 
       $params_array['ad_group_id'] = $ad_group_id; 
      }          
      $this_step_url = UrlUtils::assemble('', $this->getRequest()->getActionName(), $this->getRequest()->getControllerName(), $this->getRequest()->getModuleName(), $params_array); 
      $this->_redirect($this_step_url);    

     }else{ // all keywords have been assigned 
      // go to next step 
      $this->_redirect('/workflow-1/step-'.($step+1).'/'); 
     } 
    } 
0

所以你在這裏沒有關於Zend_Form對象的任何代碼。你如何填充表單元素?如果您發佈擴展Zend_Form的類代碼(或任何其他代碼與您的表單撥號),那麼我可以提供幫助。但是,無論如何,您可以使用setMultiOptions()方法或addMultiOption()爲multiselectbox中的每個項目填充multiselectbox。

+0

我的表單很長很複雜。代碼 - http://pastebin.com/gBWM42ct - 我用來初始填充多重選擇框 - 我傳遞一個關鍵字名稱數組,它是從表單中循環的會話中檢索的,以創建選項爲多選。 – Sid 2011-03-04 10:17:26

+0

但這只是元素初始化的代碼。我的意思是你如何填充multiselectbox?什麼是保持setMultioption和填充選擇框鍵/值對的代碼? – ufucuk 2011-03-04 11:26:55

+0

http://pastebin.com/9pBs031c – Sid 2011-03-04 12:09:58