Форма Symfony 1.4 не проверяется - PullRequest
0 голосов
/ 14 февраля 2012

Я надеюсь, что кто-то может указать мне правильное направление здесь.Это мой первый проект Symfony, и я озадачен, почему форма не будет проверена.

Чтобы протестировать приложение, я заполняю все поля формы и нажимаю кнопку отправки, и она не проходит проверку каждый раз.Понятия не имею почему.

Любая помощь будет оценена!

Представление - modules / content / templates / commentSuccess.php:

<?php echo $form->renderFormTag('/index.php/content/comment') ?>
<table>
    <?php echo $form['name']->renderRow(array('size' => 25, 'class' => 'content'), 'Your Name') ?>
    <?php echo $form['email']->renderRow(array('onclick' => 'this.value = "";'), 'Your Email') ?>
    <?php echo $form['subject']->renderRow() ?>
    <?php echo $form['message']->renderRow() ?>
    <tr>
        <td colspan="2">
            <input type="submit" />
        </td>
    </tr>
</table>
</form>

Контроллер - modules / content / actions / actions.class.php:

public function executeComment($request)
{
    $this->form = new ContentForm();

    // Deal with the request
    if ($request->isMethod('post'))
    {
        $this->form->bind($request->getParameter("content"));

        if ($this->form->isValid())
        {

            // Do stuff
            //$this->redirect('foo/bar');
            echo "valid";
        }
        else
        {
            echo "invalid";
        }
    }
}

Форма - /lib/form/ContentForm.class.php:

class ContentForm extends sfForm {

    protected static $subjects = array('Subject A', 'Subject B', 'Subject C');

    public function configure()
    {
        $this->widgetSchema->setNameFormat('content[%s]');
        $this->widgetSchema->setIdFormat('my_form_%s');
        $this->setWidgets(array(
            'name' => new sfWidgetFormInputText(),
            'email' => new sfWidgetFormInput(array('default' => 'me@example.com')),
            'subject' => new sfWidgetFormChoice(array('choices' => array('Subject A', 'Subject B', 'Subject C'))),
            'message' => new sfWidgetFormTextarea(),
        ));
        $this->setValidators(array(
            'name' => new sfValidatorString(),
            'email' => new sfValidatorEmail(),
            'subject' => new sfValidatorString(),
            'message' => new sfValidatorString(array('min_length' => 4))
        ));
        $this->setDefaults(array(
            'email' => 'me@example.com'
        ));
    }

}

Заранее спасибо!Я буду редактировать этот пост по мере необходимости во время выполнения.

РЕДАКТИРОВАТЬ Я изменил свой код представления следующим образом:

<?php echo $form->renderFormTag('/frontend_dev.php/content/comment') ?>

<table>
    <?php if ($form->isCSRFProtected()) : ?>
        <?php echo $form['_csrf_token']->render(); ?>
    <?php endif; ?> 

    <?php echo $form['name']->renderRow(array('size' => 25, 'class' => 'content'), 'Your Name') ?>
    <?php echo $form['email']->renderRow(array('onclick' => 'this.value = "";'), 'Your Email') ?>
    <?php echo $form['subject']->renderRow() ?>
    <?php echo $form['message']->renderRow() ?>

    <?php if ($form['name']->hasError()): ?>
        <?php echo $form['name']->renderError() ?>
    <?php endif ?>


    <?php echo $form->renderGlobalErrors() ?>

    <tr>
        <td colspan="2">
            <input type="submit" />
        </td>
    </tr>
</table>
</form>

Это дает необходимую ошибку на всехполя, и также выдает "csrf token: Required.".

Мой контроллер был обновлен и теперь включает $ this-> form-> getCSRFToken ();:

public function executeComment($request)
    {
        $this->form = new ContentForm();
        //$form->addCSRFProtection('flkd445rvvrGV34G');
        $this->form->getWidgetSchema()->setNameFormat('contact[%s]');

        $this->form->getCSRFToken();

        // Deal with the request
        if ($request->isMethod('post'))
        {
            $this->form->bind($request->getParameter("content[%s]"));

            if ($this->form->isValid())
            {
                // Do stuff
                //$this->redirect('foo/bar');
                echo "valid";
            }
            else
            {
                $this->_preWrap($_POST);
            }
        }
    }

Все еще не знаю, почему он выдает ошибку во всех полях и почему я получаю токен csrf: Обязательно.

Ответы [ 4 ]

4 голосов
/ 14 февраля 2012

Когда вы получаете полный контроль над формой Symfony, как вы делаете в соответствии с фрагментами кода в вашем OP, вам придется вручную добавить элементы error и csrf в вашу форму:

// Manually render an error
<?php if ($form['name']->hasError()): ?>
    <?php echo $form['name']->renderError() ?>
<?php endif ?>

<?php echo $form['name']->renderRow(array('size' => 25, 'class' => 'content'), 'Your Name') ?>

// This will echo out the CSRF token (hidden)
<?php echo $form['_csrf_token']->render() ?>

Проверьте Symfony Docs на пользовательских формах для получения дополнительной информации.Кроме того, обязательно добавьте CSRF обратно в вашу форму, нет никаких причин его исключать, и он защитит от посторонних сайтов, размещающих ваши формы.

1 голос
/ 14 февраля 2012

Возможно, было бы целесообразно отобразить любые глобальные ошибки формы:

$form->renderGlobalErrors() 
0 голосов
/ 03 июня 2012

Я столкнулся с той же проблемой с формой администратора, созданной администратором.Когда я попытался применить изменения схемы CSS с этим кодом, он сломал маркер.Это не сломалось сразу.Это сигнализирует мне, что это ошибка в Symfony 1.4

$this->setWidgetSchema(new sfWidgetFormSchema(array(
      'id'                 => new sfWidgetFormInputHidden(),
      'category'           => new sfWidgetFormDoctrineChoice(array('model' => $this->getRelatedModelName('RidCategories'), 'add_empty' => false)),
      'location_id'        => new sfWidgetFormInputText(),
      'title'              => new sfWidgetFormInputText(array(), array('class' => 'content')),
      'content'            => new sfWidgetFormTextarea(array(), array('class' => 'content')),
      'content_type'       => new sfWidgetFormInputText(),
      'schedule_date'      => new sfWidgetFormInputText(),
      'post_date'          => new sfWidgetFormInputText(),
      'display_status'     => new sfWidgetFormInputText(),
      'parent_id'          => new sfWidgetFormInputText(),
      'keyword'            => new sfWidgetFormInputText(),
      'meta_description'   => new sfWidgetFormInputText(),
      'update_frequency'   => new sfWidgetFormInputText(),
      'keywords'           => new sfWidgetFormInputText(),
      'allow_content_vote' => new sfWidgetFormInputText(),
      'rating_score'       => new sfWidgetFormInputText()
)));
0 голосов
/ 14 февраля 2012

У вас нет опечатки в вашей функции executeComment?

    $this->form->getWidgetSchema()->setNameFormat('contact[%s]');

и позже:

    $this->form->bind($request->getParameter("content[%s]"));

Вы должны написать:

    $this->form->getWidgetSchema()->setNameFormat('content[%s]');

Но эта строка не обязательна, вы можете удалить ее (NameFormat уже выполнен в вашем классе формы).

И в $ request-> getParameter ("content [% s]") не будет слова ("content [% s]" - это формат данных, отправляемых формой), вы должны использовать:

    $this->form->bind($request->getParameter("content"));

Или лучше, чтобы избежать такого рода опечаток:

public function executeComment($request)
{
    $this->form = new ContentForm();
    // Deal with the request
    if ($request->isMethod('post'))
    {
        $this->form->bind($request->getParameter($this->form->getName()));

        if ($this->form->isValid())
        {
            // Do stuff
            //$this->redirect('foo/bar');
            echo "valid";
        }
        else
        {
            $this->_preWrap($_POST);
        }
    }
}
...