我使用的是由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 事件,从你的模块之前执行,例如,和你的工作有:-)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top