Symfony 1.4形式赢得';t验证


Symfony 1.4 form won't validate

我希望有人能在这里为我指明正确的方向。这是我的第一个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>

控制器——模块/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令牌:必需"。"也是。

我的控制器已更新为包含$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令牌:必需。

当您完全控制Symfony表单时,正如您根据OP中的代码片段所做的那样,您将不得不手动将错误和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文档以了解更多信息。此外,请确保将CSRF添加回您的表格中,没有理由将其遗漏,并将保护您免受外部网站在您的表格上发布的影响。

呈现任何全局表单错误可能是明智的:

$form->renderGlobalErrors() 

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[%2s]"是表单发送的数据的格式),您应该使用:

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

我在一个管理员生成的后端表单中遇到了同样的问题。当我试图用这段代码应用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()
)));