- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Symfony 1.4/Doctrine 的管理生成器。
有一个问题列表,我希望能够对每个问题执行自定义 object_action。
我正在寻找的是模仿 _delete
对象操作,但在此之前进行一些计算。
所以我创建了一个新 Action :
public function executeListDeleteAndRecalculate(sfWebrequest $request)
{
// Do the calculation
// Then delete the question
}
我将其添加到我的生成器.yml 中:
object_actions:
delete_and_recalculate: ~
新操作显示在管理生成器中,但删除部分不起作用。
我尝试了很多方法来使其发挥作用:
questionActions/delete
操作。executeDelete
代码复制到我的新操作中。但每次我都会得到臭名昭著的
500 | Internal Server Error | sfValidatorErrorSchema _csrf_token [Required.]
所以我猜测 Symfony 在实际删除对象之前做了一些魔法。
你知道我缺少什么以及实现deleteAndRecalculate类型操作的最佳方法是什么吗?
编辑:
当然,如果我删除 $request->checkCSRFProtection();
一切正常。但我认为这非常重要,所以我想找到一个更漂亮的解决方案。
最佳答案
这是因为管理生成器中的删除
链接使用 token 来防止 CSRF 攻击。
基本上,它会在您的 session 和表单的隐藏字段中设置一个 token ,然后根据请求对它们进行相互检查。这是可能的,因为管理生成器中的 delete
链接实际上是一个(javascript 生成的)表单(这样做是为了添加 sf_method
隐藏字段来模拟 REST 行为)。
有关 CSRF 如何工作以及如何预防的更多信息,您可以在维基百科上进一步阅读:http://en.wikipedia.org/wiki/Cross-site_request_forgery
你可以做的是使用同一种链接,你只需要将method
参数传递给link_to
,它就会生成一个表单,看看lib/generator/sfModelGeneratorHelper.class.php
第 32 行,看看它是如何在 admin-gen 中完成的。
然后,您将在 executeDeleteAndRecalculate
方法中执行 $request->checkCSRFProtection()
,并继续执行您想要执行的任何操作,包括手动删除对象。
要正确生成链接,您需要在模块的 Helper 类中添加一个 linkToDeleteAndRecalculate
方法(该方法应位于 lib/${YourModule}GeneratorHelper.class.php
模块目录的文件)并添加以下代码(直接从 sfModelGeneratorHelper
获取并改编):
public function linkToDeleteAndRecalculate($object, $params)
{
if ($object->isNew())
{
return '';
}
return '<li class="sf_admin_action_delete">'.link_to(__($params['label'], array(), 'sf_admin'), 'delete_and_recalculate', $object, array('method' => 'delete', 'confirm' => !empty($params['confirm']) ? __($params['confirm'], array(), 'sf_admin') : $params['confirm'])).'</li>';
}
请注意,您必须从 link_to
调用中更改路线(我默认设置了 delete_and_recalculate
,但您可能需要在其前面加上模块名称前缀) .
然后,您可以像管理生成器中的内置方法一样使用 delete_and_recalculate
(例如,向其传递 generator.yml
中的标签)
现在这是一条艰难的道路。
简单的方法是订阅 admin.delete_object
事件,例如从模块的预执行中订阅您的工作:-)
关于symfony1 - 在 Symfony 1.4 的管理生成器中创建一个新的删除 object_action,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2153862/
我正在使用 Symfony 1.4/Doctrine 的管理生成器。 有一个问题列表,我希望能够对每个问题执行自定义 object_action。 我正在寻找的是模仿 _delete 对象操作,但在此
我是一名优秀的程序员,十分优秀!