2010-03-17 69 views
0

我在使用Zend_Form构建的表单工作时遇到问题。Zend_Form验证问题

想法是这样的:我有两个下拉菜单。一个是玩家名单。另一个是与玩家扮演相同位置的自由球员列表。我正在使用onChange javascript回调来运行一些Ajax代码,该代码将用自己从玩家下拉列表中选择的玩家的位置上的新代替自由代理列表下拉菜单。

现在,也许这是错误的方式,但我通过创建Zend_Form的一个实例,然后创建所有这些将元素添加到窗体的setX方法来构建表单。我的推理是我想在页面上的特定位置显示某些元素,而不仅仅是在我的模板上输出$ this->表单。

问题似乎是当我得到表单发回,验证器似乎不知道我为自由代理下拉设置的验证规则。这里有一些相关的代码来看看。我是一个相对的ZF n00b,所以随时告诉我,如果你跳出来,我不会采取ZF的方式。

在控制器的操作:

public function indexAction() 
{ 
    if ($this->getRequest()->isPost()) { 
     $form = new Baseball_Form_Transactions(); 

     if ($form->isValid($this->_request->getPost())) { 
      $data = $this->_request->getPost(); 
      $leagueInfo = Doctrine::getTable('League')->findOneByShortName($data['shortLeagueName'])->toArray(); 

      // Create the request top drop an existing player  
      $transactionInfo = array(
       'league_id' => $leagueInfo['id'], 
       'team_id' => $data['teamId'], 
       'player_id' => $data['players'], 
       'type' => 'drop', 
       'target_team_id' => 0, 
       'transaction_date' => date('Y-m-d H:m:s') 
      ); 
      $transaction = new Transaction(); 
      $transaction->fromArray($transactionInfo); 
      $transaction->save(); 

      // Now we do the request to add a player 
      $transactionInfo['team_id'] = 0; 
      $transactionInfo['player_id'] = $data['freeAgents']; 
      $transactionInfo['target_team_id'] = $data['teamId']; 
      $transactionInfo['type'] = 'add'; 
      $transaction = new Transaction(); 
      $transaction->fromArray($transactionInfo); 
      $transaction->save(); 
      $this->_flashMessenger->addMessage('Added transaction'); 
     } 
    } 

    $options = array(
     'teamId' => $this->teamId, 
     'position' => 'C', 
     'leagueShortName' => $this->league 
    ); 

    $this->transactionForm->setMyPlayers($options); 
    $this->transactionForm->setFreeAgents($options); 
    $this->transactionForm->setTeamId($options); 
    $this->transactionForm->setShortLeagueName($options); 
    $this->view->transactionForm = $this->transactionForm; 
    $this->view->messages = $this->_flashMessenger->getMessages(); 
    $transaction = new Transaction(); 
    $this->view->transactions = $transaction->byTeam($options); 
} 

接下来我们形式本身

public function setMyPlayers($options) 
{ 
    $data = Doctrine::getTable('Team')->find($options['teamId']); 
    $players = array(); 

    foreach ($data->Players->toArray() as $player) { 
     $players[$player['id']] = "{$player['position']} - {$player['first_name']} {$player['last_name']}"; 
    } 

    $playersSelect = new Zend_Form_Element_Select(
     'players', 
     array(
      'required' => true, 
      'label' => 'Players', 
      'multiOptions' => $players, 
     ) 
    ); 

    $this->addElement($playersSelect); 
} 

public function setFreeAgents($options) 
{ 
    $q = Doctrine_Query::create() 
     ->select('CONCAT(p.first_name, " ", p.last_name) as full_name, p.id, p.position') 
     ->from('Player p') 
     ->leftJoin('p.Teams t') 
     ->leftJoin('t.League l ON l.short_name = ?', $options['leagueShortName']) 
     ->where('t.id IS NULL') 
     ->andWhere('p.position = ?', $options['position']) 
     ->orderBy('p.last_name'); 
    $q->setHydrationMode(Doctrine_Core::HYDRATE_ARRAY); 
    $data = $q->execute(); 
    $freeAgents = array(); 

    foreach ($data as $player) { 
     $freeAgents[$player['id']] = $player['full_name']; 
    } 

    $freeAgentsSelect = new Zend_Form_Element_Select(
     'freeAgents', 
     array(
      'label' => 'Free Agents', 
      'multiOptions' => $freeAgents, 
      'size' => 15 
     ) 
    ); 
    $freeAgentsSelect->setRequired(true); 
    $this->addElement($freeAgentsSelect); 
} 

public function setShortLeagueName($options) 
{ 
    $shortLeagueNameHidden = new Zend_Form_Element_Hidden(
     'shortLeagueName', 
     array('value' => $options['leagueShortName']) 
    ); 
    $this->addElement($shortLeagueNameHidden); 
} 

public function setTeamId($options) 
{ 
    $teamIdHidden = new Zend_Form_Element_Hidden(
     'teamId', 
     array('value' => $options['teamId']) 
    ); 
    $this->addElement($teamIdHidden); 
} 

有一个在形式没有init或__construct()方法。

我的问题似乎很简单:如果他们没有从自由坐席列表中选择某人,则拒绝表单内容为无效。现在,它通过有效。我花了相当长的时间在网上搜索答案,一直没有找到答案。

在此先感谢您的帮助。

回答

1

您需要为每个请求设置表单的字段。试试这个:

public function indexAction() 
{ 
    $form = new Baseball_Form_Transactions(); 
    $options = array(
     'teamId' => $this->teamId, 
     'position' => 'C', 
     'leagueShortName' => $this->league 
    ); 

    $form->setMyPlayers($options); 
    $form->setFreeAgents($options); 
    $form->setTeamId($options); 
    $form->setShortLeagueName($options); 
    $this->transactionForm = $form; 

    if ($this->getRequest()->isPost()) { 

     if ($form->isValid($this->_request->getPost())) { 
      $data = $form->getValues(); 
      $leagueInfo = Doctrine::getTable('League')->findOneByShortName($data['shortLeagueName'])->toArray(); 

      // Create the request top drop an existing player  
      $transactionInfo = array(
       'league_id' => $leagueInfo['id'], 
       'team_id' => $data['teamId'], 
       'player_id' => $data['players'], 
       'type' => 'drop', 
       'target_team_id' => 0, 
       'transaction_date' => date('Y-m-d H:m:s') 
      ); 
      $transaction = new Transaction(); 
      $transaction->fromArray($transactionInfo); 
      $transaction->save(); 

      // Now we do the request to add a player 
      $transactionInfo['team_id'] = 0; 
      $transactionInfo['player_id'] = $data['freeAgents']; 
      $transactionInfo['target_team_id'] = $data['teamId']; 
      $transactionInfo['type'] = 'add'; 
      $transaction = new Transaction(); 
      $transaction->fromArray($transactionInfo); 
      $transaction->save(); 
      $this->_flashMessenger->addMessage('Added transaction'); 
     } 
    } 

    $this->view->transactionForm = $form; 
    $this->view->messages = $this->_flashMessenger->getMessages(); 
    $transaction = new Transaction(); 
    $this->view->transactions = $transaction->byTeam($options); 
} 
+0

感谢罗布......我*知道*我正在做一些微妙的错误 – GrumpyCanuck 2010-03-17 22:37:42

1

不具体到你的问题,但只是FYI,$的数据应该从$形式 - >的GetValues()拉,使数据被正确过滤。

+0

是的 - 我在我提供的代码示例中做到了这一点,但忘记了把它叫出来。 – 2010-03-17 21:54:30