我在使用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()方法。
我的问题似乎很简单:如果表单内容没有从自由代理列表中选择某人,则将表单内容拒绝为无效。现在,它航行有效。我花了一些相当长的时间在网上搜索答案,但却找不到答案。
提前感谢您的帮助。
答案 0 :(得分: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);
}
答案 1 :(得分:1)
不是特定于您的问题,但仅限于FYI,$ data应从$ form-> getValues()中提取,以便正确过滤数据。