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