创建一个新删除object_action在解1.4管理发电机
-
23-09-2019 - |
题
我使用的是由1.4/教义的管理发电机。
有一个列表中的问题和我想要能够执行一个自定义object_action在他们每个人。
我在寻找什么是模仿 _delete
对象的行动,但做了一些计算之前。
所以我创造了一个新的行动:
public function executeListDeleteAndRecalculate(sfWebrequest $request)
{
// Do the calculation
// Then delete the question
}
我将它添加到我的发电机。阳明海运:
object_actions:
delete_and_recalculate: ~
新的行动显示了在管理发电机,但删除部分不工作。
我试过了一堆事情要使它的工作:
- 一旦所有的计算完成后,我第一次尝试重新定向的
questionActions/delete
行动。 - 我还试图复制
executeDelete
代码到我的新行动。
但是每次我得到了臭名昭着的
500|内部服务器的错误| sfValidatorErrorSchema _csrf_token[必需的。]
所以我猜解是做一些魔法之前,实际上删除一个对象。
你知道什么我失和 什么是最好的方式来实现一个deleteAndRecalculate种行动?
编辑:
当然如果我删除了 $request->checkCSRFProtection();
一切就好了。但我认为这很重要所以我想找到一个漂亮的解决方案。
解决方案
这是因为 delete
链接,从管理发电机使用标记来防止比如以你攻击。
基本上,它设置一个令到你们的会议并进入到一个隐藏的场的一种形式,然后检查他们的一个对另一请求。这是可能的,因为 delete
链接,在管理发电机实际上是一个(javascript产生)的形式(这样做是为了增加一个 sf_method
隐藏的场模拟其他行为)。
更多信息,比如以你如何工作和可以预防的,你可以读取进一步行 http://en.wikipedia.org/wiki/Cross-site_request_forgery
你可以做的是使用同一种链接,你只需要通过一个 method
参数 link_to
它产生一种形式,看一看 lib/generator/sfModelGeneratorHelper.class.php
32行,看看它是如何做的管理。
你会那么执行 $request->checkCSRFProtection()
在你 executeDeleteAndRecalculate
方法,并继续与任何你想要做,包括删除的对象。
适当地产生的链接,可以添加一个 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>';
}
请注意,必须改变路线(我已经把 delete_and_recalculate
通过默认,但是你可能想要前缀它与你的模块的名字)从 link_to
呼叫。
然后你可以用你 delete_and_recalculate
几乎像一个内置的方法,从管理发电机(并通过它的一个标签 generator.yml
例如)
现在这是硬的方式。
最简单的方式将是以订阅 admin.delete_object
事件,从你的模块之前执行,例如,和你的工作有:-)