Проблема проверки Zend_Form - PullRequest
0 голосов
/ 17 марта 2010

У меня проблемы с получением проверки для работы с формой, построенной с использованием Zend_Form.

Идея такова: у меня два выпадающих списка. Одним из них является список игроков. Другой список свободных агентов, которые играют ту же позицию, что и игрок. Я использую обратный вызов JavaScript onChange для запуска некоторого кода Ajax, который заменяет раскрывающийся список свободных агентов новым в позиции игрока, выбранного из раскрывающегося списка игроков.

Теперь, возможно, это неправильный путь, но я построил форму, создав экземпляр Zend_Form, а затем создал все эти методы setX, которые добавляют элементы в форму. Мое рассуждение состояло в том, что я хотел отображать определенные элементы в определенных местах на странице, а не просто выводить $ this-> form в моем шаблоне.

Проблема, как мне кажется, заключается в том, что когда я возвращаю сообщение с формой, валидатор, похоже, не знает о правиле валидации, которое я установил для раскрывающегося списка свободных агентов. Вот некоторый соответствующий код для просмотра. Я относительный 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 ().

Моя проблема кажется достаточно простой: отклонить содержимое формы как недействительное, если они не выбрали кого-то из списка свободных агентов. Прямо сейчас, это проплывает как действительный. Я потратил немало времени на поиск ответа в Интернете и не смог его найти.

Заранее спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 18 марта 2010

Не относится к вашему вопросу, но только к вашему сведению, $ data должен получить из $ form-> getValues ​​(), чтобы данные были правильно отфильтрованы.

1 голос
/ 18 марта 2010

Вам необходимо настроить поля формы каждый запрос. попробуйте это:

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);
}
...