Symfony 1.4表单不会验证

时间:2012-02-13 22:14:01

标签: php symfony1 symfony-1.4

我希望有人能指出我正确的方向。这是我的第一个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令牌:必需。 “也是。

我的控制器已更新为包含$ this-&gt; form-&gt; 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 个答案:

答案 0 :(得分:4)

当您完全控制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 Docs以获取更多信息。此外,请务必将CSRF添加回您的表单,没有理由将其删除,并保护其免受外部网站发布到您的表单。

答案 1 :(得分:1)

渲染任何全局表单错误可能是明智的:

$form->renderGlobalErrors() 

答案 2 :(得分:0)

你的executeComment函数中是否有拼写错误?

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

以后:

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

你应该写:

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

但是没有必要删除它(NameFormat已在表单类中完成)。

并且$ request-&gt; 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);
        }
    }
}

答案 3 :(得分:0)

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