我使用Symfony 1.4表单作为简单的登录模块。表单非常基本,下面列出了代码:
<?php
class LoginForm extends sfFormSymfony
{
public function configure()
{
$this->setWidgets(
array('username' => new sfWidgetFormInputText(),
'password' => new sfWidgetFormInputPassword(),));
// 'remember_me' => new sfWidgetFormSelectCheckbox(array('choices'=>array('true'=>''))),));
$this->widgetSchema->setNameFormat('login[%s]');
$this->setValidators(array(
'username' => new sfValidatorString(array('required'=>true)),
'password' => new sfValidatorString(array('required'=>true)),
));
}
}
表单按预期在模板页面中呈现正常。仅供参考,我使用$ form ['username'] - &gt;渲染方法来单独渲染我喜欢它们的方法,而不是回显表单。
在发布(识别)后,我将值绑定到这样的表单:
$this->form->bind($request->getParameter('login'));
然而,它不符合条件
$this->form->isValid();
这两个字段都没有留空,凭据是正确的,所以这对我来说似乎更隐蔽。
执行var_dump($ this-&gt; form-&gt; getValues());它返回一个空数组,我相信这意味着值不是检索也不是绑定。
任何人都可以找到我可能搞砸的地方吗?
谢谢
答案 0 :(得分:2)
从symfony 1.3开始,默认情况下启用csrf保护。这意味着所有表单都会获得一个名为_csrf_token
的csrf标记字段 - 它是一个隐藏字段,对于您的会话和给定的表单类型而言是唯一的。
如果你不用表格的其余部分渲染和提交这个字段,它将无效 - 它会检测到csrf攻击,所以这样做很好。
简短修复是渲染令牌字段:
echo $form["_csrf_token"]->render();
但更好的方法是一次性渲染所有隐藏的字段(我通常在提交按钮旁边执行此操作):
echo $form->renderHiddenFields();
答案 1 :(得分:1)
如果你真的需要,你可以使用一个小片段来显示如下错误:
foreach ($this->getErrorSchema() as $field => $error) {
if ($error instanceof sfValidatorErrorSchema) {
foreach ($error as $field => $error) break;
}
echo $field . ' => ' . $error; // e.g. "Field name" => "Error message".
}
答案 2 :(得分:0)
@Maerlyn解决了这个问题。供将来参考:
表单字段是单独呈现的,而不是使用vanilla echo $ form。因此,我没有渲染$ form [&#39; _csrf_token&#39;] - &gt; render()应该已经完成。由于登录失败。同时渲染csrf_token字段,你就可以了。