gpt4 book ai didi

symfony1 - 在 Symfony 1.4 的管理生成器中创建一个新的删除 object_action

转载 作者:行者123 更新时间:2023-12-02 19:36:12 24 4
gpt4 key购买 nike

我正在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com